以下に添付図面を参照しながら、本発明の好適な実施形態について詳細に説明する。かかる実施形態に示す寸法、材料、その他具体的な数値等は、発明の理解を容易とするための例示にすぎず、特に断る場合を除き、本発明を限定するものではない。なお、本明細書および図面において、実質的に同一の機能、構成を有する要素については、同一の符号を付することにより重複説明を省略し、また本発明に直接関係のない要素は図示を省略する。
本発明の実施形態では、遊技機として、パチンコ機とスロットマシンとをその順に例示し、その後、具体的な処理を詳述する。
<パチンコ機>
本発明の実施例の理解を容易にするため、まず、同時回し参考例として、所謂同時回し機の機械的構成および電気的構成、および、各基板における具体的な処理を説明する。そして、演出参考例として、同時回し機において実行可能な具体的な演出や当該演出に係る具体的な処理を説明する。その後、本発明の実施例として、各参考例と異なる構成について具体的に説明する。
<同時回し参考例>
図1は、同時回し参考例に係る遊技機100の斜視図であり、扉が開放された状態を示している。図示のように、遊技機100は、略矩形状に組まれた四辺によって囲繞空間が形成される外枠102と、この外枠102にヒンジ機構によって開閉自在に取り付けられた中枠104と、この中枠104に、ヒンジ機構によって開閉自在に取り付けられた前枠106と、を備えている。
中枠104は、外枠102と同様に、略矩形状に組まれた四辺によって囲繞空間が形成されており、この囲繞空間に遊技盤108が保持されている。また、前枠106には、ガラス製または樹脂製の透過板110が保持されている。そして、これら中枠104および前枠106を外枠102に対して閉じると、遊技盤108と透過板110とが所定の間隔を維持して略平行に対面するとともに、遊技機100の正面側から、透過板110を介して遊技盤108が視認可能となる。
図2は、同時回し参考例に係る遊技機100の正面図である。この図に示すように、前枠106の下部には、遊技機100の正面側に突出する操作ハンドル112が設けられている。この操作ハンドル112は、遊技者が回転操作可能に設けられており、遊技者が操作ハンドル112を回転させて発射操作を行うと、当該操作ハンドル112の回転角度に応じた強度で、不図示の発射機構によって遊技球が発射される。このようにして発射された遊技球は、遊技盤108に設けられたレール114a、114b間を上昇して遊技領域116に導かれることとなる。
遊技領域116は、遊技盤108と透過板110との間隔に形成される空間であって、遊技球が流下または転動可能な領域である。遊技盤108には、多数の釘や風車(不図示)が設けられており、遊技領域116に導かれた遊技球が釘や風車に衝突して、不規則な方向に流下、転動するようにしている。
遊技領域116は、発射機構の発射強度に応じて遊技球の進入度合いを互いに異にし、遊技球の打ち分けが可能な第1遊技領域116aおよび第2遊技領域116bを備えている。第1遊技領域116aは、遊技機100に正対した遊技者から見て遊技領域116の左側に位置し、第2遊技領域116bは、遊技機100に正対した遊技者から見て遊技領域116の右側に位置している。レール114a、114bが遊技領域116の左側にあることから、発射機構によって所定の強度未満の発射強度で発射された遊技球は第1遊技領域116aに進入し、所定の強度以上の発射強度で発射された遊技球は第2遊技領域116bに進入することとなる。
また、遊技領域116には、遊技球が入球可能な一般入賞口118、第1固定始動口120A、第1可変始動口120B、第2始動口122、普図作動口125が設けられており、これら一般入賞口118、第1固定始動口120A、第1可変始動口120B、第2始動口122、普図作動口125に遊技球が入球すると、それぞれ所定の賞球が遊技者に払い出される。なお、以下では、第1固定始動口120Aおよび第1可変始動口120Bを総称して第1始動口120と呼ぶ。
詳しくは後述するが、第1始動口120内には第1始動領域が設けられ、また、第2始動口122内には第2始動領域が設けられている。そして、第1始動口120または第2始動口122に遊技球が入球して第1始動領域または第2始動領域に遊技球が進入すると、予め設けられた複数の特別図柄の中からいずれか1の特別図柄を決定するための抽選が行われる。各特別図柄には、遊技者にとって有利な大役遊技や小当たり遊技の実行可否が対応付けられている。したがって、遊技者は、第1始動口120または第2始動口122に遊技球が入球すると、所定の賞球を獲得するのと同時に、種々の遊技利益を受ける権利獲得の機会を獲得することとなる。
また、第1固定始動口120A、第2始動口122および普図作動口125は、遊技球が常時入球可能に開口した固定始動口で構成される。一方、第1可変始動口120Bには、可動片120bが開閉可能に設けられており、この可動片120bの状態に応じて、第1可変始動口120Bへの遊技球の進入容易性が変化する可変始動口で構成されている。具体的には、可動片120bは、通常、閉状態に維持されており、この間は、第1可変始動口120Bへの遊技球の入球が困難もしくは不可能となる。
これに対して、遊技領域116(第2遊技領域116b)に設けられたゲート124を遊技球が通過するか、普図作動口125に遊技球が入球すると、後述する普通図柄の抽選が行われ、この抽選によって当たりに当選すると、可動片120bが所定時間、開状態に制御される。可動片120bが開状態になると、第1可変始動口120Bへの遊技球の入球が可能となる。このように、可動片120bは、第1可変始動口120Bへの遊技球の入球を可能とする開状態、および、開状態よりも第1可変始動口120Bへの遊技球の入球が困難もしくは不可能となる閉状態に変移する可動部材(始動可変入賞装置)として機能する。
なお、第1固定始動口120Aは、第1遊技領域116aを流下する遊技球のみが入球可能となり、第1可変始動口120Bおよび第2始動口122は、第2遊技領域116bを流下する遊技球のみが入球可能となる位置に配されている。なお、第1固定始動口120Aは、第2遊技領域116bを流下する遊技球が入球してもよいが、この場合には、第1遊技領域116aを流下する遊技球の方が、第2遊技領域116bを流下する遊技球よりも入球しやすい位置に配することが望ましい。
同様に、第1可変始動口120Bおよび第2始動口122は、第1遊技領域116aを流下する遊技球が入球してもよいが、この場合には、第2遊技領域116bを流下する遊技球の方が、第1遊技領域116aを流下する遊技球よりも入球しやすい位置に配することが望ましい。いずれにしても、第1固定始動口120Aは、少なくとも第1遊技領域116aを流下する遊技球が入球可能な位置に配され、第1可変始動口120Bおよび第2始動口122は、少なくとも第2遊技領域116bを流下する遊技球が入球可能な位置に配されるとよい。
さらに、第2遊技領域116bには、第1大入賞口126および第2大入賞口128が設けられている。第1大入賞口126および第2大入賞口128は、第2遊技領域116bを流下する遊技球のみが入球可能な位置に配される。ただし、第1大入賞口126および第2大入賞口128は、第1遊技領域116aおよび第2遊技領域116bを流下するいずれの遊技球も入球可能に配されてもよい。
第1大入賞口126には、開閉扉126bが開閉可能に設けられており、通常、開閉扉126bが第1大入賞口126を閉鎖して、第1大入賞口126への遊技球の入球が不可能となっている。具体的には、開閉扉126bは、閉鎖状態において、遊技盤108の盤面と面一の状態となり、第1大入賞口126の前を遊技球が流下する。これに対して、前述の大役遊技が実行されると、開閉扉126bが開放されて遊技球を第1大入賞口126に導く受け皿として機能し、第1大入賞口126への遊技球の入球が可能となる。そして、第1大入賞口126に遊技球が入球すると、所定の賞球が遊技者に払い出される。
第2大入賞口128は、第2遊技領域116bにおいて、第1大入賞口126の下方に設けられる。第2大入賞口128は、可動片128bを備えており、通常、可動片128bが閉状態に維持されている。これに対して、後述の小当たり遊技が実行されると、可動片128bが開状態に制御され、第2大入賞口128への遊技球の入球が可能となる。なお、以下では、第1大入賞口126および第2大入賞口128をまとめて単に大入賞口ともよぶ。
図3は、同時回し参考例に係る第2大入賞口128を説明する図である。第2遊技領域116bには、遊技盤108の正面側に突出する構造物129が設けられている。この構造物129は、遊技機100の左右方向と前後方向とに位置する四辺、および、底辺が囲繞されており、上部に開口が形成されている。この構造物129の上部に形成される開口が、第2大入賞口128となる。構造物129の上部には、可動片128bが設けられており、通常、図3(a)に示すように、可動片128bは、第2大入賞口128を閉鎖する閉状態に維持されている。
可動片128bは、遊技機100の上方に臨むようにして、遊技球が転動、流下する遊技領域116に突出している。したがって、可動片128bが閉状態に維持されている場合には、遊技領域116(第2遊技領域116b)を流下する遊技球が、可動片128b上に落下することとなる。ここで、構造物129は、底辺が水平方向に略平行であり、遊技機100の右側の側面は、左側の側面よりも高さ方向に僅かに長い寸法関係となっている。したがって、第2大入賞口128は、遊技機100の左側が右側よりも僅かに低く、閉状態に維持された可動片128bは、遊技機100の左側が右側よりも僅かに低い位置になるように傾斜している。そのため、可動片128bが閉状態にあるときには、図3(a)に矢印で示すように、可動片128b上に落下した遊技球が、可動片128b上を右方から左方へとゆっくりと転動することになる。
そして、後述の小当たり遊技が実行されると、可動片128bは、第2大入賞口128を開放する開状態に変移する。ここで、可動片128bは、図3(b)に示すように、遊技盤108の背面側に向けてスライドすることで、閉状態から開状態へと変移する。その結果、閉状態から開状態に変移する際に、可動片128b上を転動している遊技球が、第2大入賞口128内に自重で落下する。
このように、同時回し参考例では、可動片128bを僅かに傾斜させ、可動片128b上を遊技球が転動する時間を長く確保する。そして、可動片128bが閉状態から開状態に変移することで、可動片128b上を転動している遊技球を第2大入賞口128内に導く。上記の構成により、可動片128bを開状態に維持する時間を僅かに設定したとしても、第2大入賞口128内に所定数の遊技球を導くことができる。換言すれば、第2大入賞口128内に所定数の遊技球を入球させるために必要となる、可動片128bを開状態に維持する時間を短時間とすることができる。なお、構造物129の背面には、遊技盤108の背面側に連通する孔が形成されており、第2大入賞口128に入球した遊技球は、遊技盤108の背面側に排出される。そして、第2大入賞口128に遊技球が入球すると、所定の賞球が遊技者に払い出される。
なお、ここでは、第2大入賞口128の構成について説明したが、第1可変始動口120Bも、第2大入賞口128と同様の構成である。すなわち、第1可変始動口120Bの可動片120bは、閉状態において、遊技盤108の前面側に突出しており、可動片120b上を遊技球が転動する。そして、可動片120bの開状態では、可動片120bが遊技盤108の背面側にスライドし、第1可変始動口120Bへの遊技球の入球が可能となる。ただし、図2に示すように、可動片128bは、遊技機100の正面視で右側が左側よりも高い位置にあるのに対して、可動片120bは、遊技機100の正面視で左側が右側よりも高い位置にある。
ここで、第2遊技領域116bの盤面構成について詳述する。同時回し参考例では、第2遊技領域116bの最上部に、第2始動口122とゲート124とが並列して配置されている。第2遊技領域116bに導かれた遊技球は、全て、第2始動口122に入球するか、ゲート124を通過して下方に流下する。同時回し参考例では、第2始動口122は、1個の遊技球の入球に対して1個の遊技球が賞球として払い出される。
第2始動口122に遊技球が入球すると、賞球として1個の遊技球が払い出されるとともに、大役遊技あるいは小当たり遊技の実行有無等を決定する抽選が行われる。また、ゲート124を遊技球が通過すると、第1可変始動口120B(可動片120b)を開状態とするか否かを決定する抽選が行われる。
第2始動口122およびゲート124の直下には、第1大入賞口126が設けられている。第1大入賞口126が開状態にある場合には、ゲート124を通過して下方に流下した遊技球の全てが第1大入賞口126に入球するように配置されている。同時回し参考例では、第1大入賞口126は、大役遊技においてのみ開放される。つまり、第1大入賞口126は、大役遊技専用の大入賞口と言える。大役遊技中に第1大入賞口126に遊技球が入球すると、1個の遊技球の入球に対して2個以上の所定数(ここでは15個)の遊技球が賞球として払い出される。
第1大入賞口126の下方には第1可変始動口120Bが設けられている。また、第1大入賞口126と第1可変始動口120Bとの間にはアウト口131が設けられている。アウト口131は、遊技領域116から遊技球を排出するための通路の入口であり、アウト口131に遊技球が入球したとしても、賞球が払い出されることはない。
第2遊技領域116bには、第1大入賞口126よりも下方に流下した遊技球の多く(例えば9割以上)が、可動片120b上に落下するように釘が配されている。また、これらの釘により、第1大入賞口126よりも下方に流下した遊技球の一部(例えば1%~10%)が、アウト口131に導かれる。
第1可変始動口120Bの閉状態では、可動片120b上を遊技球が転動する。可動片120b上を遊技球が転動しているときに可動片120bが開状態になると、可動片120b上の遊技球は全て第1可変始動口120B内に導かれる。第1可変始動口120Bに遊技球が入球すると、1個の遊技球の入球に対して1個の遊技球が賞球として払い出されるとともに、大役遊技あるいは小当たり遊技の実行有無等を決定する抽選が行われる。
第1可変始動口120Bに入球しなかった遊技球は、可動片120b上から遊技機100の正面視で右側に落下する。第1可変始動口120Bの下方には、第2大入賞口128が設けられており、可動片120b上から落下した遊技球の殆どが、第2大入賞口128の可動片128b上を転動する。可動片128b上の遊技球は、可動片128bの傾斜により、遊技機100の正面視で右側から左側に向けてゆっくりと転動する。
詳しくは後述するが、同時回し参考例では、第2大入賞口128は、小当たり遊技においてのみ開放される。つまり、第2大入賞口128は、小当たり遊技専用の大入賞口と言える。可動片128b上を遊技球が転動しているときに可動片128bが開状態になると、可動片128b上の遊技球は全て第2大入賞口128内に導かれる。小当たり遊技中に第2大入賞口128に遊技球が入球すると、1個の遊技球の入球に対して2個以上の所定数(ここでは15個)の遊技球が賞球として払い出される。
第2大入賞口128の左下方には、普図作動口125が設けられている。ここでは、第2大入賞口128上から下方に落下した遊技球の殆ど全てが普図作動口125に入球するように、第2遊技領域116bに釘が配されている。同時回し参考例では、普図作動口125は、1個の遊技球の入球に対して1個の遊技球が賞球として払い出される「特定の入賞口」を構成している。また、普図作動口125に遊技球が入球すると、ゲート124を遊技球が通過した場合と同様に、第1可変始動口120B(可動片120b)を開状態とするか否かを決定する抽選が行われる。
なお、遊技領域116の最下部には、一般入賞口118、第1始動口120、第2始動口122、普図作動口125、および、大入賞口のいずれにも入球しなかった遊技球を、遊技領域116から遊技盤108の背面側に排出する排出口130が設けられている。
そして、遊技機100には、遊技の進行中等に演出を行う演出装置として、液晶表示装置からなる演出表示装置200、可動装置からなる演出役物装置202、さまざまな点灯態様や発光色に制御されるランプからなる演出照明装置204、スピーカからなる音声出力装置206、遊技者の操作を受け付ける演出操作装置208が設けられている。
演出表示装置200は、画像を表示する画像表示部からなるメイン演出表示部200aを備えており、このメイン演出表示部200aを、遊技盤108の略中央部分において、遊技機100の正面側から視認可能に配置している。このメイン演出表示部200aには、図示のように、3つの演出図柄210a、210b、210cが変動表示される等、種々の演出が実行されることとなる。
演出役物装置202は、メイン演出表示部200aよりも前面に配置され、通常、遊技盤108の背面側の原点位置において、複数の構成部材に分割された状態で退避しており、遊技者が視認できないようになっている。そして、上記の演出図柄210a、210b、210cの変動表示中などに、アクチュエータの駆動により、メイン演出表示部200aの前面にある可動位置まで各構成部材が移動すると、メイン演出表示部200aの前面で各構成部材が合体して、遊技者に大当たりの期待感を付与する。
演出照明装置204は、演出役物装置202や遊技盤108等に設けられており、メイン演出表示部200aに表示される画像等に合わせて、さまざまに点灯制御される。
音声出力装置206は、前枠106の上部位置や外枠102の最下部位置に設けられ、メイン演出表示部200aに表示される画像等に合わせて、遊技機100の正面側に向けてさまざまな音声を出力する。
演出操作装置208は、遊技者の押下操作を受け付けるボタンで構成され、遊技機100の幅方向略中央位置であって、かつ、透過板110よりも下方位置に設けられている。この演出操作装置208は、メイン演出表示部200aに表示される画像等に合わせて有効化されるものであり、操作有効時間内に遊技者の操作を受け付けると、当該操作に応じて、さまざまな演出が実行される。
なお、図中符号132は、遊技機100から払い出される賞球や、遊技球貸出装置から貸し出される遊技球が導かれる上皿であり、この上皿132が遊技球で一杯になると、遊技球は下皿134に導かれることとなる。また、この下皿134の底面には、当該下皿134から遊技球を排出するための球抜き孔(不図示)が形成されている。この球抜き孔は、通常、開閉板(不図示)によって閉じられているが、球抜きつまみ134aを押下することにより、当該球抜きつまみ134aと一体となって開閉板がスライドし、球抜き孔から下皿134の下方に遊技球を排出することが可能となっている。
また、遊技盤108には、遊技領域116の外方であって、かつ、遊技者が視認可能な位置に、第1特別図柄表示器160、第2特別図柄表示器162、第1特別図柄保留表示器164、第2特別図柄保留表示器166、普通図柄表示器168、普通図柄保留表示器170、右打ち報知表示器172が設けられている。これら各表示器160~172は、遊技に係る種々の状況を表示するための装置であるが、その詳細については後述する。
(制御手段の内部構成)
図4は、同時回し参考例に係る遊技の進行を制御する制御手段の内部構成を示すブロック図である。
主制御基板300は遊技の基本動作を制御する。この主制御基板300は、メインCPU300a、メインROM300b、メインRAM300cを備えている。メインCPU300aは、各検出スイッチやタイマからの入力信号に基づいて、メインROM300bに格納されたプログラムを読み出して演算処理を行うとともに、各装置や表示器を直接制御したり、あるいは演算処理の結果に応じて他の基板にコマンドを送信したりする。メインRAM300cは、メインCPU300aの演算処理時におけるデータのワークエリアとして機能する。
上記主制御基板300には、一般入賞口118に遊技球が入球したことを検出する一般入賞口検出スイッチ118s、第1固定始動口120Aに遊技球が入球したことを検出する第1固定始動口検出スイッチ120As、第1可変始動口120Bに遊技球が入球したことを検出する第1可変始動口検出スイッチ120Bs、第2始動口122に遊技球が入球したことを検出する第2始動口検出スイッチ122s、ゲート124を遊技球が通過したことを検出するゲート検出スイッチ124s、普図作動口125に遊技球が入球したことを検出する普図作動口検出スイッチ125s、第1大入賞口126に遊技球が入球したことを検出する第1大入賞口検出スイッチ126s、第2大入賞口128に遊技球が入球したことを検出する第2大入賞口検出スイッチ128sが接続されており、これら各検出スイッチから主制御基板300に検出信号が入力されるようになっている。
また、主制御基板300には、第1可変始動口120Bの可動片120bを作動する普通電動役物ソレノイド120cと、第1大入賞口126を開閉する開閉扉126bを作動する第1大入賞口ソレノイド126cと、第2大入賞口128を開閉する可動片128bを作動する第2大入賞口ソレノイド128cと、が接続されており、主制御基板300によって、第1可変始動口120B、第1大入賞口126、第2大入賞口128の開閉制御がなされるようになっている。
さらに、主制御基板300には、第1特別図柄表示器160、第2特別図柄表示器162、第1特別図柄保留表示器164、第2特別図柄保留表示器166、普通図柄表示器168、普通図柄保留表示器170、右打ち報知表示器172が接続されており、主制御基板300によって、これら各表示器の表示制御がなされるようになっている。
さらに、遊技盤108の背面には、設定変更スイッチ180sが設けられている。設定変更スイッチ180sは、専用の鍵によってアクセス可能に構成されている。設定変更スイッチ180sがオンしていることを条件として、設定値を変更、確認する操作が可能となる。詳しくは後述するが、同時回し参考例の遊技機100は、有利度合いが異なる6段階の設定値のいずれかが設定値バッファに登録設定値として記憶され、記憶されている登録設定値に応じて遊技が進行する。なお、ここでは、設定値が6段階であることとするが、設定値は高設定および低設定の2段階のみが設けられてもよいし、他の複数段階で設けられてもよい。さらには、設定値は必須ではなく、有利度合いが変更されなくてもよい。
また、遊技盤108の背面には、RAMクリアボタンが押下操作可能に設けられており、このRAMクリアボタンの押下操作がRAMクリアスイッチ182sによって検出される。RAMクリアスイッチ182sは主制御基板300に接続されており、RAMクリアスイッチ182sから主制御基板300にRAMクリア操作信号が入力される。電源投入時にRAMクリアスイッチ182sからRAMクリア操作信号が入力されている場合、メインCPU300aは、メインRAM300cをクリアする。
また、遊技盤108の背面には、性能表示モニタ184が設けられている。主制御基板300により、性能表示モニタ184に登録設定値やベース比率が表示される。
また、同時回し参考例の遊技機100は、主に第1始動口120または第2始動口122への遊技球の入球によって開始される特別遊技と、ゲート124への遊技球の通過、あるいは、普図作動口125への遊技球の入球によって開始される普通遊技とに大別される。そして、主制御基板300のメインROM300bには、特別遊技および普通遊技を進行するための種々のプログラムや、各種の遊技に必要なデータ、テーブルが記憶されている。
また、主制御基板300には、払出制御基板310および副制御基板330が接続されている。払出制御基板310は、遊技球を発射させるための制御、および、賞球を払い出すための制御を行う。この払出制御基板310も、CPU、ROM、RAMを備えており、主制御基板300に対して双方向に通信可能に接続されている。この払出制御基板310には遊技情報出力端子板312が接続されており、主制御基板300から出力される遊技進行上の種々の情報が、払出制御基板310および遊技情報出力端子板312を介して、遊技店のホールコンピュータ等に出力されることとなる。
また、払出制御基板310には、貯留部に貯留された遊技球を賞球として遊技者に払い出すための払出モータ314が接続されている。払出制御基板310は、主制御基板300から送信された払出個数指定コマンドに基づいて払出モータ314を制御して所定の賞球を遊技者に払い出すように制御する。このとき、払い出された遊技球数が払出球計数スイッチ316sによって検出され、払い出すべき賞球が遊技者に払い出されたかが把握されるようになっている。
また、払出制御基板310には、下皿134の満タン状態を検出する皿満タン検出スイッチ318sが接続されている。この皿満タン検出スイッチ318sは、賞球として払い出される遊技球を下皿134に導く通路に設けられており、遊技球検出信号が払出制御基板310に入力されるようになっている。
そして、下皿134に所定量以上の遊技球が貯留されて満タン状態になると、下皿134に向かう通路内に遊技球が滞留し、皿満タン検出スイッチ318sから払出制御基板310に向けて、遊技球検出信号が連続的に入力される。払出制御基板310は、遊技球検出信号が所定時間連続して入力された場合に、下皿134が満タン状態であると判断し、皿満タンコマンドを主制御基板300に送信する。一方、皿満タンコマンドを送信した後、遊技球検出信号の連続入力が途絶えた場合には、満タン状態が解除されたと判断し、皿満タン解除コマンドを主制御基板300に送信する。
また、払出制御基板310には、遊技球の発射制御を行う発射制御回路320が設けられている。払出制御基板310には、操作ハンドル112に設けられ、当該操作ハンドル112に遊技者が触れたことを検出するタッチセンサ112sと、操作ハンドル112の操作角度を検出する操作ボリューム112aと、が接続されている。そして、タッチセンサ112sおよび操作ボリューム112aから信号が入力されると、発射制御回路320において、遊技球発射装置に設けられた発射用ソレノイド112cを通電して遊技球を発射させる制御がなされる。
副制御基板330は、主に遊技中や待機中等の各演出を制御する。この副制御基板330は、サブCPU330a、サブROM330b、サブRAM330cを備えており、主制御基板300に対して、当該主制御基板300から副制御基板330への一方向に通信可能に接続されている。サブCPU330aは、主制御基板300から送信されたコマンドやタイマからの入力信号等に基づいて、サブROM330bに格納されたプログラムを読み出して演算処理を行うとともに、演出を実行制御する。このとき、サブRAM330cは、サブCPU330aの演算処理時におけるデータのワークエリアとして機能する。
具体的には、副制御基板330では、サブCPU330a、サブROM330b、サブRAM330cが協働して、サブメイン、画像制御部、役物制御部、照明制御部、音声制御部として機能する。サブメインは、各種入力コマンドに応じて、実行する演出の内容を決定したり、演出の実行を管理、統括したりする。画像制御部は、上記メイン演出表示部200aに画像を表示させる画像表示制御を行う。サブROM330bには、メイン演出表示部200aに表示される図柄や背景、字幕等の画像データが多数格納されており、画像制御部が、画像データをサブROM330bから不図示のVRAMに読み出して、メイン演出表示部200aの画像表示を制御する。
また、役物制御部は、サブメインによる演出の管理にしたがってアクチュエータを駆動し、演出役物装置202を可動制御する。照明制御部は演出照明装置204を点灯制御する。また、音声制御部は、上記音声出力装置206から音声を出力させる音声出力制御を行う。サブROM330bには、音声出力装置206から出力される音声や楽曲等の音声データが多数格納されており、音声制御部が、音声データをサブROM330bから読み出して、音声出力装置206の音声出力を制御する。
さらに、副制御基板330では、演出操作装置208が押下操作または回転操作されたことを検出する演出操作装置検出スイッチ208sから操作検出信号が入力された際に、所定の演出を実行する。
なお、各基板には、不図示の電源基板が接続されており、電源基板を介して商用電源から各基板に電力供給がなされている。また、電源基板にはコンデンサからなるバックアップ電源が設けられている。
図5は、同時回し参考例に係るメインCPU300aが用いるメモリ領域のアドレスマップである。なお、図5において、アドレスは16進数で示しており、「H」は16進数であることを示している。図5に示すように、メインCPU300aが用いるメモリ領域は、メインROM300bに割り当てられたメモリ領域(0000H~2FFFH)と、メインRAM300cに割り当てられたメモリ領域(F000H~F3FFH)とを含んでいる。
メインROM300bのメモリ領域は、遊技の進行を制御するためのプログラムおよびデータを格納する使用領域(0000H~1BF3H)と、使用領域以外の領域であって、遊技機規則で定める試験を行うための処理や、性能表示モニタ184を表示するための処理(性能表示モニタ184に表示するベース比率を算出するための処理を含む)を実行するためのプログラムおよびデータを格納する使用外領域(2000H~2BFFH)とが設けられている。
メインROM300bの使用領域には、遊技の進行を制御するためのプログラムが格納されるプログラム領域(0000H~0A89H)、未使用領域(0A8AH~11FFH)、プログラム以外のデータが格納されるデータ領域(1200H~1BF3H)が設けられている。なお、使用領域は、未使用領域(0A8AH~0FFFH)を含めないようにしてもよい。
メインROM300bの使用外領域には、遊技機規則で定める試験を行うための処理や、性能表示モニタ184を表示するための処理を実行するためのプログラムが格納されるプログラム領域(2000H~27FFH)、これらのプログラム以外のデータが格納されるデータ領域(2800H~2BFFH)が設けられている。
また、メインROM300bのメモリ領域には、使用領域および使用外領域以外にも、未使用領域(1A7BH~1DFFH)、プログラムのタイトル、バージョン等の任意のデータが格納されるROMコメント領域(1E00H~1EFFH)、未使用領域(1F00H~1FFFH)、未使用領域(2C00H~2FBFH)、メインCPU300aがプログラムを実行するために必要な情報が格納されるプログラム管理領域(2FC0H~2FFFH)が設けられている。
メインRAM300cのメモリ領域は、遊技の進行を制御するためのプログラムが実行されている際に一時的に用いられる使用領域(F000H~F1FFH)と、使用領域以外の領域であって、遊技機規則で定める試験を行うための処理や、性能表示モニタ184を表示するための処理のプログラムが実行されている際に一時的に用いられる使用外領域(F210H~F228H)とが設けられている。
メインRAM300cの使用領域には、遊技の進行を制御するためのプログラムが実行されている際に一時的に用いられるワーク領域(F000H~F12AH)、未使用領域(F12BH~F1D7H)、遊技の進行を制御するためのプログラムの実行中にデータを一時的に退避させるスタック領域(F1D8H~F1FFH)が設けられている。なお、使用領域は、未使用領域(F12BH~F1D7H)を含めないようにしてもよい。
メインRAM300cの使用外領域には、遊技機規則で定める試験を行うための処理や、性能表示モニタ184を表示するための処理のプログラムが実行されている際に一時的に用いられるワーク領域(F210H~F21FH)、これらのプログラムが実行されている際にデータを一時的に退避させるスタック領域(F220H~F228H)が設けられている。
また、メインRAM300cのメモリ領域には、使用領域および使用外領域以外にも、未使用領域(F200H~F20FH)、未使用領域(F229H~F3FFH)が設けられている。
このように、メインROM300bおよびメインRAM300cでは、遊技の進行を制御するために用いられる使用領域と、遊技機規則で定める試験を行うための処理や、性能表示モニタ184の表示制御をするための処理を実行するために用いられる使用外領域とが分かれて設けられている。
そして、メインRAM300cでは、使用領域と使用外領域との間に、16バイトの未使用領域(F200H~F20FH)が設けられている。この未使用領域(F200H~F20FH)は、使用領域および使用外領域を分ける境界領域として設定されており、使用領域と使用外領域との境界が明確となり、遊技の進行を制御するためのプログラムが実行されている際に使用外領域が用いられること、および、遊技機規則で定める試験を行うための処理や、性能表示モニタ184の表示制御をするための処理のプログラムが実行されている際に使用領域が用いられることを防止している。
なお、使用領域と使用外領域との間に設けられる未使用領域は、少なくとも1バイト以上であればよく、不正防止の観点から、4バイト以上であることが望ましく、16バイト以上に設定されることがより望ましい。また、未使用領域は、データの書き込みおよび読み出しが禁止されているが、不正防止の観点から、所定のタイミングでクリアするようにしてもよい。
また、FE00h~FFFFhのメモリ空間には入出力部が割り当てられている。かかる入出力部については後程詳述する。
次に、同時回し参考例の遊技機100における遊技について、メインROM300bに記憶されている各種テーブルと併せて説明する。
前述したように、同時回し参考例の遊技機100は、特別遊技と普通遊技の2種類の遊技が並行して進行するものである。特別遊技は、低確率遊技状態および高確率遊技状態のいずれかの遊技状態にて遊技が進行し、普通遊技は、非時短遊技状態、中時短遊技状態、時短遊技状態のいずれかの遊技状態にて遊技が進行する。
各遊技状態の詳細については後述するが、低確率遊技状態というのは、大入賞口が開放される大役遊技を実行する権利獲得の確率が低く設定された遊技状態であり、高確率遊技状態というのは、大役遊技を実行する権利獲得の確率が高く設定された遊技状態である。また、非時短遊技状態というのは、可動片120bが開状態になりにくく、第1可変始動口120Bに遊技球が入球し難い遊技状態であり、中時短遊技状態というのは、非時短遊技状態よりも可動片120bが開状態になりやすく、第1可変始動口120Bに遊技球が入球しやすい遊技状態である。また、時短遊技状態というのは、中時短遊技状態よりも、さらに、可動片120bが開状態になりやすく、第1可変始動口120Bに遊技球が最も入球しやすい遊技状態である。なお、時短遊技状態では、遊技中に第2遊技領域116bに向けて遊技球を発射し続けている場合に、僅かに遊技球が減少するか、遊技球が殆ど減少しないように設定されている。
上記のように、特別遊技と普通遊技とは同時並行して進行することから、同時回し参考例では、低確率遊技状態または高確率遊技状態と、非時短遊技状態、中時短遊技状態、時短遊技状態のいずれかとが組み合わされた遊技状態となる。以下では、理解を容易とするため、特別遊技に係る遊技状態、すなわち、低確率遊技状態および高確率遊技状態を特別遊技状態と呼び、普通遊技に係る遊技状態、すなわち、非時短遊技状態、中時短遊技状態、時短遊技状態を普通遊技状態と呼ぶ場合がある。遊技機100の初期状態は、低確率遊技状態および非時短遊技状態に設定されている。
遊技者が操作ハンドル112を操作して遊技領域116に遊技球を発射させるとともに、遊技領域116を流下する遊技球が第1始動口120または第2始動口122に入球すると、遊技者に遊技利益を付与するか否かの抽選(以下、「大役抽選」という)が行われる。この大役抽選において、大当たりに当選すると、大入賞口が開放されるとともに当該大入賞口への遊技球の入球が可能となる大役遊技が実行され、また、当該大役遊技の終了後の遊技状態が、上記のいずれかの遊技状態に設定される。以下では、大役抽選方法について説明する。
なお、詳しくは後述するが、第1始動口120または第2始動口122に遊技球が入球すると、大役抽選に係る種々の乱数値(大当たり決定乱数、当たり図柄乱数、リーチグループ決定乱数、リーチモード決定乱数、変動パターン乱数)が取得されるとともに、これら各乱数値がメインRAM300cの特図保留記憶領域に記憶される。以下では、第1始動口120に遊技球が入球して特図保留記憶領域に記憶された種々の乱数を総称して特1保留とよび、第2始動口122に遊技球が入球して特図保留記憶領域に記憶された種々の乱数を総称して特2保留とよぶ。
メインRAM300cの特図保留記憶領域は、第1特図保留記憶領域と第2特図保留記憶領域とを備えている。第1特図保留記憶領域および第2特図保留記憶領域は、それぞれ4つの記憶部(第1~第4記憶部)を有している。そして、第1始動口120に遊技球が入球すると、特1保留を第1特図保留記憶領域の第1記憶部から順に記憶し、第2始動口122に遊技球が入球すると、特2保留を第2特図保留記憶領域の第1記憶部から順に記憶する。
例えば、第1始動口120に遊技球が入球したとき、第1特図保留記憶領域の第1~第4記憶部のいずれにも保留が記憶されていない場合には、第1記憶部に特1保留を記憶する。また、例えば、第1記憶部~第3記憶部に特1保留が記憶されている状態で、第1始動口120に遊技球が入球した場合には、特1保留を第4記憶部に記憶する。また、第2始動口122に遊技球が入球した場合にも、上記と同様に、第2特図保留記憶領域の第1記憶部~第4記憶部の中で、特2保留が記憶されていない、最も番号(序数)の小さい記憶部に特2保留が記憶される。
ただし、第1特図保留記憶領域および第2特図保留記憶領域に記憶可能な特1保留数(X1)および特2保留数(X2)は、それぞれ4つに設定されている。したがって、例えば、第1始動口120に遊技球が入球したときに、第1特図保留記憶領域に既に4つの特1保留が記憶されている場合には、当該第1始動口120への遊技球の入球によって新たに特1保留が記憶されることはない。同様に、第2始動口122に遊技球が入球したときに、第2特図保留記憶領域に既に4つの特2保留が記憶されている場合には、当該第2始動口122への遊技球の入球によって新たに特2保留が記憶されることはない。
図6は、同時回し参考例に係る低確時大当たり決定乱数判定テーブルを説明する図である。第1始動口120または第2始動口122に遊技球が入球すると、0~65535の範囲内から1つの大当たり決定乱数が取得される。そして、大役抽選を開始するとき、すなわち、大当たりの判定を行うときの遊技状態に応じて大当たり決定乱数判定テーブルが選択され、当該選択された大当たり決定乱数判定テーブルと取得された大当たり決定乱数とによって大役抽選が行われる。
低確率遊技状態において、特1保留および特2保留について大役抽選を開始する場合には、低確時大当たり決定乱数判定テーブルが参照される。ここで、同時回し参考例では、有利度合いを異にする6段階の設定値が設けられており、低確時大当たり決定乱数判定テーブルは、設定値ごとに設けられている。遊技中は、設定値が6段階のうちのいずれかに設定されており、現在設定されている設定値(設定値バッファに記憶されている登録設定値)に対応する低確時大当たり決定乱数判定テーブルを参照して大役抽選が行われる。
低確率遊技状態であって、設定値=1に設定されている場合(登録設定値=1)には、図6(a)に示す低確時大当たり決定乱数判定テーブルaを参照して大役抽選が行われる。この低確時大当たり決定乱数判定テーブルaによれば、大当たり決定乱数が10001~10218であった場合に大当たりと判定し、大当たり決定乱数が20001~38996であった場合に小当たりと判定し、その他の大当たり決定乱数であった場合にはハズレと判定する。したがって、この場合の大当たり確率は約1/300.6となり、小当たり確率は約1/3.45となる。
低確率遊技状態であって、設定値=2に設定されている場合(登録設定値=2)には、図6(b)に示す低確時大当たり決定乱数判定テーブルbを参照して大役抽選が行われる。この低確時大当たり決定乱数判定テーブルbによれば、大当たり決定乱数が10001~10225であった場合に大当たりと判定し、大当たり決定乱数が20001~38996であった場合に小当たりと判定し、その他の大当たり決定乱数であった場合にはハズレと判定する。したがって、この場合の大当たり確率は約1/291.2となり、小当たり確率は約1/3.45となる。
低確率遊技状態であって、設定値=3に設定されている場合(登録設定値=3)には、図6(c)に示す低確時大当たり決定乱数判定テーブルcを参照して大役抽選が行われる。この低確時大当たり決定乱数判定テーブルcによれば、大当たり決定乱数が10001~10232であった場合に大当たりと判定し、大当たり決定乱数が20001~38996であった場合に小当たりと判定し、その他の大当たり決定乱数であった場合にはハズレと判定する。したがって、この場合の大当たり確率は約1/282.4となり、小当たり確率は約1/3.45となる。
低確率遊技状態であって、設定値=4に設定されている場合(登録設定値=4)には、図6(d)に示す低確時大当たり決定乱数判定テーブルdを参照して大役抽選が行われる。この低確時大当たり決定乱数判定テーブルdによれば、大当たり決定乱数が10001~10239であった場合に大当たりと判定し、大当たり決定乱数が20001~38996であった場合に小当たりと判定し、その他の大当たり決定乱数であった場合にはハズレと判定する。したがって、この場合の大当たり確率は約1/274.2となり、小当たり確率は約1/3.45となる。
低確率遊技状態であって、設定値=5に設定されている場合(登録設定値=5)には、図6(e)に示す低確時大当たり決定乱数判定テーブルeを参照して大役抽選が行われる。この低確時大当たり決定乱数判定テーブルeによれば、大当たり決定乱数が10001~10246であった場合に大当たりと判定し、大当たり決定乱数が20001~38996であった場合に小当たりと判定し、その他の大当たり決定乱数であった場合にはハズレと判定する。したがって、この場合の大当たり確率は約1/266.4となり、小当たり確率は約1/3.45となる。
低確率遊技状態であって、設定値=6に設定されている場合(登録設定値=6)には、図6(f)に示す低確時大当たり決定乱数判定テーブルfを参照して大役抽選が行われる。この低確時大当たり決定乱数判定テーブルfによれば、大当たり決定乱数が10001~10253であった場合に大当たりと判定し、大当たり決定乱数が20001~38996であった場合に小当たりと判定し、その他の大当たり決定乱数であった場合にはハズレと判定する。したがって、この場合の大当たり確率は約1/259.0となり、小当たり確率は約1/3.45となる。
図7は、同時回し参考例に係る高確時大当たり決定乱数判定テーブルを説明する図である。高確率遊技状態において、特1保留および特2保留について大役抽選を開始する場合には、高確時大当たり決定乱数判定テーブルが参照される。高確時大当たり決定乱数判定テーブルも、低確時大当たり決定乱数判定テーブルと同様に設定値ごとに設けられている。
高確率遊技状態であって、設定値=1に設定されている場合(登録設定値=1)には、図7(a)に示す高確時大当たり決定乱数判定テーブルaを参照して大役抽選が行われる。この高確時大当たり決定乱数判定テーブルaによれば、大当たり決定乱数が10001~10620であった場合に大当たりと判定し、大当たり決定乱数が20001~38996であった場合に小当たりと判定し、その他の大当たり決定乱数であった場合にはハズレと判定する。したがって、この場合の大当たり確率は約1/105.7となり、小当たり確率は約1/3.45となる。
同様に、高確率遊技状態であって、設定値=2~6に設定されている場合(登録設定値=2~6)には、図7(b)~(f)に示す高確時大当たり決定乱数判定テーブルb~fを参照して大役抽選が行われる。これら高確時大当たり決定乱数判定テーブルb~fによれば、それぞれ大当たり決定乱数が図示の値であった場合に大当たりと判定する。したがって、設定値=2~6の場合の大当たり確率は、それぞれ約1/102.4~1/91.0となり、小当たり確率は約1/3.45となる。
以上のように、大役抽選は、登録設定値に応じて行われる。このとき、登録設定値に応じて大当たりの当選確率が異なっており、登録設定値が大きい場合の方が、小さい場合に比べて、大当たりに当選しやすくなっている。なお、ここでは、登録設定値が異なっても、小当たりの当選確率は変わらないこととしたが、登録設定値ごとに小当たりの当選確率を異ならせてもよい。また、小当たりは必須ではなく、大役抽選において、大当たりおよびハズレのいずれかのみが決定されてもよい。
また、ここでは、低確率遊技状態および高確率遊技状態の双方における大当たりの当選確率が、登録設定値に応じて異なることとしたが、低確率遊技状態および高確率遊技状態のいずれか一方における大当たりの当選確率のみが、登録設定値に応じて異なることとしてもよい。
図8は、同時回し参考例に係る当たり図柄乱数判定テーブルおよび小当たり図柄乱数判定テーブルを説明する図である。第1始動口120または第2始動口122に遊技球が入球すると、0~99の範囲内から1つの当たり図柄乱数が取得される。そして、上記の大役抽選により「大当たり」の判定結果が導出された場合に、取得している当たり図柄乱数と当たり図柄乱数判定テーブルとによって、特別図柄の種別が決定される。このとき、特1保留によって「大当たり」に当選した場合には、図8(a)に示すように、特1用当たり図柄乱数判定テーブルaが選択され、特2保留によって「大当たり」に当選した場合には、図8(b)に示すように、特2用当たり図柄乱数判定テーブルbが選択され、特1保留によって「小当たり」に当選した場合には、図8(c)に示すように、特1用小当たり図柄乱数判定テーブルaが選択され、特2保留によって「小当たり」に当選した場合には、図8(d)に示すように、特2用小当たり図柄乱数判定テーブルbが選択される。以下では、当たり図柄乱数によって決定される特別図柄、すなわち、大当たりの判定結果が得られた場合に決定される特別図柄を大当たり図柄と呼び、小当たりの判定結果が得られた場合に決定される特別図柄を小当たり図柄と呼び、ハズレの判定結果が得られた場合に決定される特別図柄をハズレ図柄と呼ぶ。
図8(a)に示す特1用当たり図柄乱数判定テーブルa、および、図8(b)に示す特2用当たり図柄乱数判定テーブルbによれば、取得した当たり図柄乱数の値に応じて、図示のとおり、特別図柄として大当たり図柄(特別図柄A~J)が決定される。また、図8(c)に示す特1用小当たり図柄乱数判定テーブルa、および、図8(d)に示す特2用小当たり図柄乱数判定テーブルbによれば、取得した当たり図柄乱数の値に応じて、図示のとおり、特別図柄として小当たり図柄(特別図柄Z1~Z6)が決定される。
なお、大役抽選結果が「ハズレ」であった場合に、当該抽選結果が特1保留によって導出されたときは、抽選を行うことなくハズレ図柄として特別図柄Xが決定され、当該抽選結果が特2保留によって導出されたときは、抽選を行うことなくハズレ図柄として特別図柄Yが決定される。つまり、当たり図柄乱数判定テーブルは、大役抽選結果が「大当たり」であった場合にのみ参照され、大役抽選結果が「ハズレ」または「小当たり」であった場合に参照されることはない。また、小当たり図柄乱数判定テーブルは、大役抽選結果が「小当たり」であった場合にのみ参照され、大役抽選結果が「大当たり」または「ハズレ」であった場合に参照されることはない。なお、小当たり図柄である特別図柄Z1~Z6をまとめて単に特別図柄Zともよぶ。
図9は、同時回し参考例に係るリーチグループ決定乱数判定テーブルを説明する図である。このリーチグループ決定乱数判定テーブルは複数設けられており、保留種別、保留数、遊技状態等に応じて、予め設定されたテーブルが選択される。第1始動口120または第2始動口122に遊技球が入球すると、0~10006の範囲内から1つのリーチグループ決定乱数が取得される。上記のように、大役抽選結果が導出されると、当該大役抽選結果を報知する変動演出パターンを決定する処理が行われる。同時回し参考例では、大役抽選結果が「ハズレ」であった場合に、変動演出パターンを決定するにあたって、まず、リーチグループ決定乱数とリーチグループ決定乱数判定テーブルとによってグループ種別が決定される。
例えば、遊技状態が詳しくは後述する通常状態に設定されているときに、特1保留に基づいて「ハズレ」の大役抽選結果が導出された場合において、大役抽選を行うときの特1保留の保留数(以下、単に「保留数」という)が0個であれば、図9(a)に示すように、リーチグループ決定乱数判定テーブル1が選択される。同様に、通常状態に設定されているときに、特1保留に基づいて「ハズレ」の大役抽選結果が導出された場合において、大役抽選を行うときの保留数が1~2個であれば、図9(b)に示すように、リーチグループ決定乱数判定テーブル2が選択され、保留数が3個であれば、図9(c)に示すように、リーチグループ決定乱数判定テーブル3が選択される。なお、図9において、グループ種別の欄に記載しているグループxは、任意のグループ番号を示している。したがって、取得したリーチグループ決定乱数と、参照するリーチグループ決定乱数判定テーブルの種類とに応じて、グループ種別として種々のグループ番号が決定されることとなる。
なお、ここでは、通常状態において、特1保留に基づいて「ハズレ」の大役抽選結果が導出されたときに参照されるリーチグループ決定乱数判定テーブルについて説明したが、メインROM300bには、この他にも多数のリーチグループ決定乱数判定テーブルが記憶されている。
なお、大役抽選結果が「大当たり」または「小当たり」であった場合には、変動演出パターンを決定するにあたってグループ種別を決定することはない。つまり、リーチグループ決定乱数判定テーブルは、大役抽選結果が「ハズレ」であった場合にのみ参照され、大役抽選結果が「大当たり」または「小当たり」であった場合に参照されることはない。
図10は、同時回し参考例に係るリーチモード決定乱数判定テーブルを説明する図である。このリーチモード決定乱数判定テーブルは、大役抽選結果が「ハズレ」であった場合に選択されるハズレ時リーチモード決定乱数判定テーブルと、大役抽選結果が「大当たり」であった場合に選択される大当たり時リーチモード決定乱数判定テーブルと、大役抽選結果が「小当たり」であった場合に選択される小当たり時リーチモード決定乱数判定テーブルとに大別される。なお、ハズレ時リーチモード決定乱数判定テーブルは、上記のように決定されたグループ種別ごとに設けられており、大当たり時リーチモード決定乱数判定テーブルおよび小当たり時リーチモード決定乱数判定テーブルは、遊技状態、保留種別ごとに設けられている。
また、各リーチモード決定乱数判定テーブルは、遊技状態や図柄の種別ごとにも設けられている。ここでは、所定の遊技状態および図柄種別において参照されるグループx用ハズレ時リーチモード決定乱数判定テーブルの一例を図10(a)に示し、特1用大当たり時リーチモード決定乱数判定テーブルの一例を図10(b)に示し、特2用大当たり時リーチモード決定乱数判定テーブルの一例を図10(c)に示し、特1用小当たり時リーチモード決定乱数判定テーブルの一例を図10(d)に示し、特2用小当たり時リーチモード決定乱数判定テーブルの一例を図10(e)に示す。
第1始動口120または第2始動口122に遊技球が入球すると、0~250の範囲内から1つのリーチモード決定乱数が取得される。そして、上記の大役抽選の結果が「ハズレ」であった場合には、図10(a)に示すように、上記のグループ種別の抽選により決定されたグループ種別に対応するハズレ時リーチモード決定乱数判定テーブルが選択され、選択されたハズレ時リーチモード決定乱数判定テーブルとリーチモード決定乱数とに基づいて、変動モード番号が決定される。また、上記の大役抽選の結果が「大当たり」であった場合には、図10(b)、(c)に示すように、大当たり当選時の遊技状態、および、読み出された保留種別に対応する大当たり時リーチモード決定乱数判定テーブルが選択され、選択された大当たり時リーチモード決定乱数判定テーブルとリーチモード決定乱数とに基づいて、変動モード番号が決定される。
さらに、上記の大役抽選の結果が「小当たり」であった場合には、図10(d)、(e)に示すように、小当たり当選時の遊技状態、および、読み出された保留種別に対応する小当たり時リーチモード決定乱数判定テーブルが選択され、選択された小当たり時リーチモード決定乱数判定テーブルとリーチモード決定乱数とに基づいて、変動モード番号が決定される。
また、各リーチモード決定乱数判定テーブルにおいては、リーチモード決定乱数に、変動モード番号とともに、後述する変動パターン乱数判定テーブルが対応付けられており、変動モード番号が決定されるのと同時に、変動パターン乱数判定テーブルが決定される。なお、図10において、変動パターン乱数判定テーブルの欄に記載しているテーブルxは、任意のテーブル番号を示している。したがって、取得したリーチグループ決定乱数と、参照するリーチモード決定乱数判定テーブルの種類とに応じて、変動モード番号と、変動パターン乱数判定テーブルのテーブル番号とが決定されることとなる。また、同時回し参考例において、変動モード番号および後述する変動パターン番号は、16進数で設定されている。以下において、16進数を示す場合には「H」を付するが、図10~図12に○○Hと記載しているのは、16進数で示される任意の値を示すものである。
以上のように、大役抽選結果が「ハズレ」であった場合には、まず、図9に示すリーチグループ決定乱数判定テーブルとリーチグループ決定乱数とによってグループ種別が決定される。そして、決定されたグループ種別と遊技状態に応じ、図10(a)に示すハズレ時リーチモード決定乱数判定テーブルとリーチモード決定乱数とによって、変動モード番号および変動パターン乱数判定テーブルが決定される。
一方、大役抽選結果が「大当たり」または「小当たり」であった場合には、決定された大当たり図柄または小当たり図柄(特別図柄の種別)、大当たり、または、小当たり当選時の遊技状態等に対応する、図10に示す大当たり時リーチモード決定乱数判定テーブルを参照し、リーチモード決定乱数を用いて、変動モード番号、変動パターン乱数判定テーブルが決定されることとなる。
図11は、同時回し参考例に係る変動パターン乱数判定テーブルを説明する図である。ここでは、所定のテーブル番号xの変動パターン乱数判定テーブルxを示すが、変動パターン乱数判定テーブルは、この他にも、テーブル番号ごとに多数設けられている。
第1始動口120または第2始動口122に遊技球が入球すると、0~238の範囲内から1つの変動パターン乱数が取得される。そして、上記の変動モード番号と同時に決定された変動パターン乱数判定テーブルと、取得した変動パターン乱数とに基づいて、図示のように変動パターン番号が決定される。
このように、大役抽選が行われると、大役抽選結果、決定された図柄種別、遊技状態、保留数、保留種別等に応じて、変動モード番号、変動パターン番号が決定される。これら変動モード番号、変動パターン番号は、変動演出パターンを特定するものであり、そのそれぞれに、変動演出の態様および時間が対応付けられている。
図12は、同時回し参考例に係る変動時間決定テーブルを説明する図である。上記のように、変動モード番号が決定されると、図12(a)に示す変動時間1決定テーブルにしたがって変動時間1が決定される。この変動時間1決定テーブルによれば、変動モード番号ごとに変動時間1が対応付けられており、決定された変動モード番号に応じて、対応する変動時間1が決定される。
また、上記のように、変動パターン番号が決定されると、図12(b)に示す変動時間2決定テーブルにしたがって変動時間2が決定される。この変動時間2決定テーブルによれば、変動パターン番号ごとに変動時間2が対応付けられており、決定された変動パターン番号に応じて、対応する変動時間2が決定される。このようにして決定された変動時間1、2の合計時間が、大役抽選結果を報知する変動演出の時間、すなわち、変動時間となる。この変動時間というのは、決定された特別図柄を、第1特別図柄表示器160または第2特別図柄表示器162に停止表示させるまでの時間である。
詳しくは後述するが、特1保留に基づいて特別図柄が決定されるとともに、変動モード番号および変動パターン番号すなわち変動時間が決定されると、当該決定された変動時間に亘って第1特別図柄表示器160において図柄の変動表示が行われ、変動時間が経過すると、第1特別図柄表示器160に、決定された特別図柄が停止表示される。また、特2保留に基づいて特別図柄が決定されるとともに、変動パターン番号すなわち変動時間が決定されると、当該決定された変動時間に亘って第2特別図柄表示器162において図柄の変動表示が行われ、変動時間が経過すると、第2特別図柄表示器162に、決定された特別図柄が停止表示される。このとき、ハズレ図柄が第1特別図柄表示器160に停止表示されることで、大役抽選の結果としてハズレが確定し、次の特1保留に基づく大役抽選が実行可能となり、ハズレ図柄が第2特別図柄表示器162に停止表示されることで、大役抽選の結果としてハズレが確定し、次の特2保留に基づく大役抽選が実行可能となる。一方、大当たり図柄が第1特別図柄表示器160または第2特別図柄表示器162に停止表示されると、大役抽選の結果として大当たりが確定し、大役遊技が実行され、小当たり図柄が第1特別図柄表示器160または第2特別図柄表示器162に停止表示されると、大役抽選の結果として小当たりが確定し、小当たり遊技が実行されることとなる。
このように、変動時間は、第1特別図柄表示器160または第2特別図柄表示器162における図柄の変動表示の時間、換言すれば、大役抽選の結果を確定させるまでの時間を規定するものとなる。
以上のようにして変動モード番号が決定されると、当該決定された変動モード番号に対応する変動モードコマンドが副制御基板330に送信され、変動パターン番号が決定されると、当該決定された変動パターン番号に対応する変動パターンコマンドが副制御基板330に送信される。副制御基板330においては、受信した変動モードコマンドに基づいて、主に変動演出の前半の態様が決定され、受信した変動パターンコマンドに基づいて、主に変動演出の後半の態様が決定されることとなるが、その詳細については後述する。なお、以下では、変動モード番号および変動パターン番号を総称して変動情報と呼び、変動モードコマンドおよび変動パターンコマンドを総称して変動コマンドと呼ぶ場合がある。
図13は、同時回し参考例に係る遊技状態および変動時間を説明する図である。上述のように、特別遊技状態と普通遊技状態とが組み合わされて1の遊技状態となり、設定中の遊技状態に応じて遊技の進行制御がなされる。既に説明したように、特別遊技状態は、大当たりの当選確率を異にする低確率遊技状態および高確率遊技状態の2種類が設けられている。また、普通遊技状態は、互いに第1可変始動口120Bへの遊技球の入球容易性(入球頻度)を異にする非時短遊技状態、中時短遊技状態、時短遊技状態の3種類が設けられている。
ここで、普通遊技において、第1可変始動口120Bへの遊技球の入球容易性は、当選確率、変動時間、開放時間の3つの要素によって決定される。詳しくは後述するが、普通遊技では、ゲート124を遊技球が通過するか、あるいは、普図作動口125に遊技球が入球すると普図保留が記憶される。そして、記憶された普図保留に基づいて、可動片120bを開放するか否かを決定する普図抽選が行われる。この普図抽選の結果は、所定の変動時間が経過したところで確定する。普図抽選の結果として当たりが確定すると、可動片120bが開放される。このとき、普図抽選における当選確率、変動時間、および、可動片120bを開放する際の開放時間が、それぞれ普通遊技状態ごとに設定されている。
同時回し参考例では、図13(a)に示すように、特別遊技状態および普通遊技状態の組み合わせにより6種類の遊技状態が設けられる。遊技機100の初期状態は、低確率遊技状態および非時短遊技状態となっている。なお、非時短遊技状態では、普図抽選における当選確率が低く、変動時間が長く、可動片120bの開放時間が短い。同時回し参考例では、低確率遊技状態および非時短遊技状態が組み合わされた遊技状態を通常状態と呼ぶ。
また、同時回し参考例では、高確率遊技状態および非時短遊技状態に設定される場合があり、この両者が組み合わされた遊技状態を最優位状態と呼ぶ。なお、この最優位状態は、6つの遊技状態の中で最も有利度合いが高く、適切に遊技球を発射していると、大当たりに当選せずとも、遊技中に徐々に遊技球が増加していくように設定されている。
また、同時回し参考例では、低確率遊技状態および時短遊技状態に設定される場合がある。なお、時短遊技状態では、普図抽選における当選確率が高く、変動時間が短く、可動片120bの開放時間が長い。以下では、低確率遊技状態および時短遊技状態が組み合わされた遊技状態を低確時短状態と呼ぶ。
また、同時回し参考例では、高確率遊技状態および時短遊技状態に設定される場合がある。以下では、高確率遊技状態および時短遊技状態が組み合わされた遊技状態を高確時短状態または高確前兆状態と呼ぶ。なお、高確時短状態および高確前兆状態について、詳しくは後述する。
また、同時回し参考例では、高確率遊技状態および中時短遊技状態に設定される場合がある。なお、中時短遊技状態では、普図抽選における当選確率が、非時短遊技状態よりも高く時短遊技状態よりも低く、変動時間が短く、可動片120bの開放時間が長い。この遊技状態は、適切に遊技球を発射させなかった場合等、不測の事態が生じた場合に設定され得るものである。以下では、高確率遊技状態および中時短遊技状態が組み合わされた遊技状態をペナルティ状態と呼ぶ。
なお、副制御基板330においては、主制御基板300で設定されている遊技状態に対応する演出モードが設定される。演出モードというのは、メイン演出表示部200aに表示される背景画像やBGM等を規定するものであり、演出モードごとに、演出の内容が異なっている。つまり、遊技者は、演出モードによって、現在の遊技状態を識別することができる。
以上のように、同時回し参考例では、6つの遊技状態が設けられている。そして、上記したように、大役抽選が行われたときの遊技状態、保留種別、当該遊技状態における変動回数、図柄の種別に応じて、変動モード番号および変動パターン番号、すなわち、変動時間が決定される。
ここで、遊技機100では、遊技状態ごとに、実質変動対象が設定されている。実質変動対象というのは、本来、大役抽選を行うべき保留の種別を示しており、遊技状態ごとに、特1保留および特2保留のいずれかが実質変動対象に設定されている。通常状態では、特1保留が実質変動対象に設定されている。また、通常状態では、普通遊技状態が非時短遊技状態であるため、第1可変始動口120Bが殆ど開放されることがない。したがって、通常状態では、遊技者は、第1固定始動口120Aに遊技球を入球させるべく、第1遊技領域116aに向けて遊技球を発射させる必要がある。
通常状態において、実質変動対象である特1保留によって大役抽選が行われ、ハズレ図柄もしくは小当たり図柄が決定されると、3~100秒の範囲内で変動時間が決定される。また、通常状態において、特1保留によって大役抽選が行われ、大当たり図柄が決定されると、40~100秒の範囲内で変動時間が決定される。
一方、通常状態において、実質変動対象ではない特2保留によって大役抽選が行われた場合には、決定された図柄種別に拘わらず、変動時間が必ず10分に決定される。このように、変動時間を10分といった長時間に設定することで、通常状態では、仮に遊技者が第2始動口122に遊技球を入球させたとしても、特2保留に基づく大役抽選の実行機会が極めて少なくなる。
具体的に説明すると、第2始動口122が第2遊技領域116bに設けられており、また、第2始動口122は、常に遊技球が入球可能となる固定始動口で構成されている。さらに、遊技機100の遊技性により、第2始動口122は、第1始動口120よりも、容易に遊技球が入球する位置に配されている。そのため、仮に、通常状態において、特2保留に係る変動時間を短時間としてしまうと、大役抽選の機会が必要以上に遊技者に与えられてしまう。そこで、通常状態における本来の遊技性に則り、適切に第1遊技領域116aに向けて遊技球を発射させるべく、変動時間を10分といった長時間に設定している。
最優位状態では、特2保留が実質変動対象に設定されている。したがって、最優位状態では、遊技者は、第2始動口122に遊技球を入球させるべく、第2遊技領域116bに向けて遊技球を発射させる必要がある。最優位状態において、実質変動対象ではない特1保留によって大役抽選が行われた場合には、決定された図柄種別に拘わらず、変動時間が必ず10秒に決定される。なお、最優位状態において実質変動対象ではない特1保留によって大役抽選が行われる場合の方が、通常状態で実質変動対象ではない特2保留によって大役抽選が行われる場合に比べて、遊技性に与える影響が小さい。そのため、最優位状態では、実質変動対象ではない特1保留によって大役抽選が行われた場合の変動時間を、10秒と短く設定している。
最優位状態において、実質変動対象である特2保留によって大役抽選が行われ、ハズレ図柄または小当たり図柄が決定されると、1秒~3秒の範囲内で変動時間が決定される。また、最優位状態において、特2保留によって大役抽選が行われ、大当たり図柄が決定されると、変動時間が3秒~10秒の範囲内で決定される。
低確時短状態、高確時短状態では、いずれも特1保留が実質変動対象に設定されている。また、低確時短状態、高確時短状態では、普通遊技状態が時短遊技状態に設定されており、第1可変始動口120Bが頻繁に開状態に制御される。したがって、これら2つの遊技状態では、遊技者は、第1可変始動口120Bに遊技球を入球させるべく、第2遊技領域116bに向けて遊技球を発射させる必要がある。これら2つの遊技状態では、いずれも同一の変動パターン乱数判定テーブルが選択されるが、これら2つの遊技状態は、普通遊技状態が時短遊技状態である点で共通している。つまり、普通遊技状態が時短遊技状態である場合において、実質変動対象である特1保留によって大役抽選が行われ、ハズレ図柄もしくは小当たり図柄が決定されると、必ず1秒の変動時間が決定される。また、低確時短状態、高確時短状態である場合において、特1保留によって大役抽選が行われ、大当たり図柄が決定されると、変動時間が必ず30秒に決定される。
高確前兆状態では、特1保留が実質変動対象に設定されている。また、高確前兆状態では、普通遊技状態が時短遊技状態に設定されており、第1可変始動口120Bが頻繁に開状態に制御される。したがって、高確前兆状態では、遊技者は、第1可変始動口120Bに遊技球を入球させるべく、第2遊技領域116bに向けて遊技球を発射させる必要がある。高確前兆状態において、実質変動対象である特1保留によって大役抽選が行われ、ハズレ図柄もしくは小当たり図柄が決定されると、3秒~10秒の範囲内で変動時間が決定される。また、高確前兆状態において、特1保留によって大役抽選が行われ、大当たり図柄が決定されると、変動時間が必ず30秒に決定される。
一方、低確時短状態、高確時短状態および高確前兆状態、すなわち、普通遊技状態が時短遊技状態である場合において、実質変動対象ではない特2保留によって大役抽選が行われた場合には、決定された図柄種別に拘わらず、変動時間が必ず10分に決定される。
ペナルティ状態では、特1保留が実質変動対象に設定されている。また、ペナルティ状態では、普通遊技状態が中時短遊技状態に設定されており、第1可変始動口120Bが一定の頻度で開状態に制御される。したがって、ペナルティ状態では、遊技者は、第1可変始動口120Bに遊技球を入球させるべく、第2遊技領域116bに向けて遊技球を発射させる必要がある。ペナルティ状態において、実質変動対象である特1保留によって大役抽選が行われ、ハズレ図柄または小当たり図柄が決定されると、3~100秒の範囲内で変動時間が決定される。また、ペナルティ状態において、特1保留によって大役抽選が行われ、大当たり図柄が決定されると、40~100秒の範囲内で変動時間が決定される。
一方、ペナルティ状態において、実質変動対象ではない特2保留によって大役抽選が行われた場合には、決定された図柄種別に拘わらず、変動時間が必ず10分に決定される。
以上のように、遊技状態ごとに実質変動対象が設定されており、実質変動対象としての保留種別に基づく大役抽選が行われた場合には、最長でも変動時間が100秒となっている。一方、実質変動対象ではない保留種別に基づく大役抽選が行われた場合には、変動時間が概ね10分となり、本来の遊技性に反した遊技が行われないようにしている。
なお、同時回し参考例では、高確時短状態の変動時間の平均が、高確前兆状態の変動時間の平均よりも短い場合について説明するが、高確時短状態の変動時間の平均が、高確前兆状態の変動時間の平均よりも長くてもよい。つまり、高確時短状態の変動時間の平均と、高確前兆状態の変動時間の平均とが異なっていてもよい。
図14は、同時回し参考例に係る特別電動役物作動ラムセットテーブルを説明する第1の図であり、図15は、同時回し参考例に係る特別電動役物作動ラムセットテーブルを説明する第2の図である。なお、特別電動役物作動ラムセットテーブルは、大役遊技または小当たり遊技を制御するための各種データが記憶されたものであり、大役遊技中および小当たり遊技中は、特別電動役物作動ラムセットテーブルを参照して、第1大入賞口ソレノイド126cまたは第2大入賞口ソレノイド128cが通電制御される。なお、実際は、特別電動役物作動ラムセットテーブルは、特別図柄(大当たり図柄および小当たり図柄)の種別ごとに複数設けられており、決定された特別図柄の種別に応じて、対応するテーブルが大役遊技または小当たり遊技の開始時にセットされるが、ここでは、説明の都合上、図柄の種別ごとに特別図柄の制御データを示す。
図14に示すように、大役遊技は、大入賞口が所定回数開閉される複数回のラウンド遊技で構成され、小当たり遊技は、ラウンド遊技が1回のみ実行される。この特別電動役物作動ラムセットテーブルによれば、オープニング時間(最初のラウンド遊技が開始されるまでの待機時間)、特別電動役物最大作動回数(1回の大役遊技または小当たり遊技中に実行されるラウンド遊技の回数)、特別電動役物開閉切替回数(1ラウンド中の大入賞口の開放回数)、ソレノイド通電時間(大入賞口の開放回数ごとの第1大入賞口ソレノイド126cまたは第2大入賞口ソレノイド128cの通電時間、すなわち、1回の大入賞口の開放時間)、規定数(1回のラウンド遊技における大入賞口への最大入賞可能数)、大入賞口閉鎖有効時間(ラウンド遊技間の大入賞口の閉鎖時間、すなわち、インターバル時間)、エンディング時間(最後のラウンド遊技が終了してから、通常の特別遊技(後述する図柄の変動表示)が再開されるまでの待機時間)が、制御データとして、特別図柄の種別ごとに、図示のように予め記憶されている。
なお、特1保留によって大当たりに当選し、大当たり図柄として特別図柄A、B、Dが決定された場合には、4回のラウンド遊技で構成される大役遊技が実行される。この大役遊技においては、1~4回目のラウンド遊技において第1大入賞口126がそれぞれ1回のみ開放される。各ラウンド遊技では、第1大入賞口126が最大で29.0秒開放され、この間に規定数の遊技球が入球するか、もしくは、最大開放時間(29.0秒)が経過すると、第1大入賞口126が閉鎖されて1回のラウンド遊技が終了となる。
また、特1保留によって大当たりに当選し、大当たり図柄として特別図柄C、Eが決定された場合には、10回のラウンド遊技で構成される大役遊技が実行される。これらの大役遊技においては、1~10回目のラウンド遊技において第1大入賞口126がそれぞれ1回のみ開放される。各ラウンド遊技では、第1大入賞口126が最大で29.0秒開放され、この間に規定数の遊技球が入球するか、もしくは、最大開放時間(29.0秒)が経過すると、第1大入賞口126が閉鎖されて1回のラウンド遊技が終了となる。
また、特1保留によって小当たりに当選し、小当たり図柄として特別図柄Z1~Z3が決定された場合には、1回のラウンド遊技で構成される小当たり遊技が実行される。この小当たり遊技では、1回のラウンド遊技において、第2大入賞口128が0.1秒×1回開放される。
また、図15に示すように、特2保留によって大当たりに当選し、大当たり図柄として特別図柄F、G、Iが決定された場合には、4回のラウンド遊技で構成される大役遊技が実行される。この大役遊技においては、1~4回目のラウンド遊技において第1大入賞口126がそれぞれ1回のみ開放される。各ラウンド遊技では、第1大入賞口126が最大で29.0秒開放され、この間に規定数の遊技球が入球するか、もしくは、最大開放時間(29.0秒)が経過すると、第1大入賞口126が閉鎖されて1回のラウンド遊技が終了となる。
また、特2保留によって大当たりに当選し、大当たり図柄として特別図柄H、Jが決定された場合には、10回のラウンド遊技で構成される大役遊技が実行される。この大役遊技においては、1~10回目のラウンド遊技において第1大入賞口126がそれぞれ1回のみ開放される。各ラウンド遊技では、第1大入賞口126が最大で29.0秒開放され、この間に規定数の遊技球が入球するか、もしくは、最大開放時間(29.0秒)が経過すると、第1大入賞口126が閉鎖されて1回のラウンド遊技が終了となる。
また、特2保留によって小当たりに当選し、小当たり図柄として特別図柄Z4~Z6が決定された場合にも、1回のラウンド遊技からなる小当たり遊技が実行される。ここで、小当たり図柄として特別図柄Z4が決定された場合の小当たり遊技では、1回のラウンド遊技において、第2大入賞口128が0.1秒×2回開放される。なお、第2大入賞口128の2回の開放の間の休止時間であるラウンド中インターバル時間は、1.78秒に設定されている。遊技球は最短で0.6秒間隔で発射されるため、第2大入賞口128の開放時間と、遊技球の発射間隔とから考えると、この小当たり遊技中に遊技球が第2大入賞口128に入球する確率は低い。
しかしながら、同時回し参考例では、第2大入賞口128を閉状態に維持する可動片128b上に遊技球が滞留しやすい構造となっており、可動片128bが開状態に変移することで、可動片128b上に滞留する遊技球が第2大入賞口128内に導かれる。そのため、第2大入賞口128の0.1秒×2回の開放により、平均で2~3個の遊技球が第2大入賞口128に入球することとなる。
また、小当たり図柄として特別図柄Z5が決定された場合の小当たり遊技では、1回のラウンド遊技において、第2大入賞口128が0.1秒×3回開放される。なお、この場合のラウンド中インターバル時間は、0.84秒に設定されている。この小当たり遊技においては、平均で3~4個の遊技球が第2大入賞口128に入球する。
さらに、小当たり図柄として特別図柄Z6が決定された場合の小当たり遊技では、1回のラウンド遊技において、第2大入賞口128が0.1秒×12回開放される。なお、この場合のラウンド中インターバル時間は、0.84秒に設定されている。この小当たり遊技においては、第2遊技領域116bに向けて遊技球を発射し続けることにより、ほぼ確実に規定数(例えば10個)の遊技球を第2大入賞口128に入球させることができる。
なお、遊技機100の設計段階では、遊技球の発射球数と、払い出された賞球数との比率である発射賞球比率を厳密に管理、調整する必要がある。そのため、同時回し参考例では、小当たり遊技において0.1秒の開放が2回なされる特別図柄Z4と、小当たり遊技において0.1秒の開放が3回なされる特別図柄Z5とを設け、これらの選択比率を変更するだけで、発射賞球比率を容易に調整、変更することができるようにしている。
図16は、同時回し参考例に係る大役遊技の終了後の遊技状態を設定するための遊技状態設定テーブルを説明する図である。同時回し参考例においては、大役遊技が実行された場合、大当たり当選時の遊技状態、保留種別、特別図柄(大当たり図柄)の種別に応じて、遊技状態設定テーブルを参照し、大役遊技の終了後の遊技状態を設定する。
大当たり当選時の遊技状態が通常状態またはペナルティ状態である場合、実質変動対象である特1保留によって大当たりに当選すると、大当たり図柄の種別に応じて大役遊技後の遊技状態が設定される。具体的には、大当たり図柄として特別図柄Aが決定された場合には、低確時短状態(特別遊技状態が低確率遊技状態、普通遊技状態が時短遊技状態)に設定される。このとき、時短遊技状態の継続回数(以下、「時短回数」という)は100回に設定される。これは、大役抽選が100回行われるまで、時短遊技状態が継続することを意味している。ただし、上記した時短回数は1の時短遊技状態における最大継続回数を示すものであり、上記の継続回数に到達するまでの間に大当たりに当選した場合には、再度、遊技状態の設定が行われることとなる。したがって、大役遊技の終了後に時短遊技状態に設定された場合に、当該時短遊技状態において大当たりの抽選結果が導出されることなく、大当たり以外の抽選結果が100回導出されると、非時短遊技状態(通常状態)に遊技状態が変更されることとなる。
また、大当たり図柄として特別図柄B、Dが決定された場合には、高確時短状態(特別遊技状態が高確率遊技状態、普通遊技状態が時短遊技状態)に設定される。このとき、高確回数として「次回」が設定され、高確率遊技状態は、次回の大当たりに当選するまで継続する。また、時短回数として「次回」が設定され、時短遊技状態は、次回の大当たりに当選するまで継続する。したがって、特別図柄B、Dが決定された場合には、大役遊技後、次回の大当たりに当選するまで、高確時短状態が継続することとなる。
また、大当たり図柄として特別図柄C、Eが決定された場合には、高確前兆状態(特別遊技状態が高確率遊技状態、普通遊技状態が時短遊技状態)に設定される。このとき、高確回数として「次回」が設定され、時短回数が100回に設定される。特別図柄C、Eが決定された場合には、次回の大当たりの当選まで高確率遊技状態が継続する一方で、時短遊技状態は100回で終了となる。したがって、特別図柄C、Eが決定された場合には、大役遊技後、大役抽選の結果が100回導出されたところで、遊技状態が最優位状態に移行することとなる。
また、大当たり当選時の遊技状態が通常状態またはペナルティ状態である場合、実質変動対象ではない特2保留によって大当たりに当選すると、大役遊技後の遊技状態が次のように設定される。すなわち、大当たり図柄として特別図柄Fが決定された場合には、通常状態(特別遊技状態が低確率遊技状態、普通遊技状態が非時短遊技状態)に設定される。また、大当たり図柄として特別図柄G~Jが決定された場合には、ペナルティ状態(特別遊技状態が高確率遊技状態、普通遊技状態が中時短遊技状態)に設定される。このとき、高確回数および時短回数は、いずれも「次回」に設定される。
また、大当たり当選時の遊技状態が最優位状態である場合、実質変動対象ではない特1保留によって大当たりに当選すると、大役遊技後の遊技状態が次のように設定される。すなわち、大当たり図柄として特別図柄Aが決定された場合には、低確時短状態(特別遊技状態が低確率遊技状態、普通遊技状態が時短遊技状態)に設定される。このとき、時短回数は100回に設定される。また、大当たり図柄として特別図柄B~Eが決定された場合には、通常状態およびペナルティ状態と同様に、大役遊技後の遊技状態が設定される。
一方、大当たり当選時の遊技状態が最優位状態である場合、実質変動対象である特2保留によって大当たりに当選すると、大役遊技後の遊技状態が次のように設定される。すなわち、大当たり図柄として特別図柄Fが決定された場合には、低確時短状態(特別遊技状態が低確率遊技状態、普通遊技状態が時短遊技状態)に設定される。このとき、時短回数は100回に設定される。また、大当たり図柄として特別図柄G、Iが決定された場合には、高確時短状態(特別遊技状態が高確率遊技状態、普通遊技状態が時短遊技状態)に設定される。このとき、高確回数および時短回数が「次回」に設定される。
また、大当たり図柄として特別図柄H、Jが決定された場合には、高確前兆状態(特別遊技状態が高確率遊技状態、普通遊技状態が時短遊技状態)に設定される。このとき、高確回数が「次回」に設定され、時短回数が100回に設定される。
また、大当たり当選時の遊技状態が低確時短状態、高確時短状態、高確前兆状態である場合、つまり、普通遊技状態が時短遊技状態である場合、大役遊技後の遊技状態は、通常状態およびペナルティ状態と同様に設定される。
図17は、同時回し参考例に係る当たり決定乱数判定テーブルを説明する図である。遊技領域116を流下する遊技球がゲート124を通過するか、もしくは、普図作動口125に入球すると、第1可変始動口120Bの可動片120bを通電制御するか否かが対応付けられた普通図柄の判定処理(以下、「普図抽選」という)が行われる。
なお、詳しくは後述するが、遊技球がゲート124を通過するか、もしくは、普図作動口125に入球すると、0~99の範囲内から1つの当たり決定乱数が取得されるとともに、この乱数値がメインRAM300cの普図保留記憶領域に4つを上限として記憶される。つまり、普図保留記憶領域は、当たり決定乱数をセーブする4つの記憶部を備えている。したがって、普図保留記憶領域の4つの記憶部全てに当たり決定乱数が記憶された状態で、遊技球がゲート124を通過するか、もしくは、普図作動口125に入球した場合には、当該遊技球の通過に基づいて当たり決定乱数が記憶されることはない。以下では、ゲート124を遊技球が通過するか、もしくは、普図作動口125に遊技球が入球して普図保留記憶領域に記憶された当たり決定乱数を普図保留とよぶ。
普通遊技状態が非時短遊技状態であるときに普図抽選を開始する場合には、図17(a)に示すように、非時短遊技状態用当たり決定乱数判定テーブルが参照される。この非時短遊技状態用当たり決定乱数判定テーブルによれば、当たり決定乱数が0であった場合に、普通図柄の種別として当たり図柄が決定され、当たり決定乱数が1~99であった場合に、普通図柄の種別としてハズレ図柄が決定される。したがって、非時短遊技状態において当たり図柄が決定される確率、すなわち、当選確率は1/100となる。詳しくは後述するが、この普図抽選において当たり図柄が決定されると、第1可変始動口120Bの可動片120bが開状態に制御され、ハズレ図柄が決定された場合には、第1可変始動口120Bの可動片120bが閉状態に維持される。
また、中時短遊技状態において普図抽選を開始する場合には、図17(b)に示すように、中時短遊技状態用当たり決定乱数判定テーブルが参照される。この中時短遊技状態用当たり決定乱数判定テーブルによれば、当たり決定乱数が0~49であった場合に、普通図柄の種別として当たり図柄が決定され、当たり決定乱数が50~99であった場合に、普通図柄の種別としてハズレ図柄が決定される。したがって、中時短遊技状態において当たり図柄が決定される確率、すなわち、当選確率は50/100となる。
また、時短遊技状態において普図抽選を開始する場合には、図17(c)に示すように、時短遊技状態用当たり決定乱数判定テーブルが参照される。この時短遊技状態用当たり決定乱数判定テーブルによれば、当たり決定乱数が0~98であった場合に、普通図柄の種別として当たり図柄が決定され、当たり決定乱数が99であった場合に、普通図柄の種別としてハズレ図柄が決定される。したがって、時短遊技状態において当たり図柄が決定される確率、すなわち、当選確率は99/100となる。
図18(a)は、同時回し参考例に係る普通図柄変動時間データテーブルを説明する図であり、図18(b)は、同時回し参考例に係る開閉制御パターンテーブルを説明する図である。上記のように、普図抽選が行われると、普通図柄の変動時間が決定される。普通図柄変動時間データテーブルは、普図抽選によって当たり図柄もしくはハズレ図柄が決定されたときに、当該普通図柄の変動時間を決定する際に参照されるものである。この普通図柄変動時間データテーブルによれば、遊技状態が非時短遊技状態および中時短遊技状態に設定されている場合には変動時間が10秒に決定され、遊技状態が時短遊技状態に設定されている場合には変動時間が1秒に決定される。このようにして変動時間が決定されると、当該決定された時間にわたって普通図柄表示器168が変動表示(点滅表示)される。そして、当たり図柄が決定された場合には普通図柄表示器168が点灯し、ハズレ図柄が決定された場合には普通図柄表示器168が消灯する。
そして、普図抽選によって当たり図柄が決定されるとともに、普通図柄表示器168が点灯した場合には、第1可変始動口120Bの可動片120bが、図18(b)に示すように、開閉制御パターンテーブルを参照して通電制御される。なお、実際は、開閉制御パターンテーブルは、遊技状態ごとに設けられており、普通図柄が決定されたときの遊技状態に応じて、対応するテーブルが普通電動役物ソレノイド120cの通電開始時にセットされる。
当たり図柄が決定されると、図18(b)に示すように、開閉制御パターンテーブルを参照して第1可変始動口120Bが開閉制御される。この開閉制御パターンテーブルによれば、普電開放前時間(第1可変始動口120Bの開放が開始されるまでの待機時間)、普通電動役物最大開閉切替回数(第1可変始動口120Bの開放回数)、ソレノイド通電時間(第1可変始動口120Bの開放回数ごとの普通電動役物ソレノイド120cの通電時間、すなわち、1回の第1可変始動口120Bの開放時間)、規定数(第1可変始動口120Bの全開放中における第1可変始動口120Bへの最大入賞可能数)、普電閉鎖有効時間(第1可変始動口120Bの各開放間の閉鎖時間、すなわち、休止時間)、普電有効状態時間(第1可変始動口120Bの最後の開放終了からの待機時間)、普電終了ウェイト時間(普電有効状態時間の経過後、後述する普通図柄の変動表示が再開されるまでの待機時間)が、第1可変始動口120Bの制御データとして、遊技状態ごとに、図示のように予め記憶されている。
このように、普通図柄の当選確率、変動時間および開放時間を設定することにより、図18(b)の下部に示すように、発射賞球比率(遊技領域116に発射される遊技球に対して第1可変始動口120B、第2始動口122、普図作動口125および大入賞口に遊技球が入球して遊技者に払い出される賞球数の比率)は、非時短遊技状態では発射数:賞球数=100:20、中時短遊技状態では発射数:賞球数=100:40、時短遊技状態では発射数:賞球数=100:99となる。
なお、第1可変始動口120Bの開閉条件は、普通図柄の当選確率、普通図柄の変動表示の時間、第1可変始動口120Bの開放時間の3つの要素を規定するものである。つまり、普通図柄の当選確率、普通図柄の変動表示の時間、第1可変始動口120Bの開放時間の3つの要素を組み合わせることにより、非時短遊技状態、中時短遊技状態、時短遊技状態それぞれにおける、第1可変始動口120Bへの遊技球の入球頻度や、発射賞球比率を設定可能である。いずれにしても、ここに示した3つの要素の組み合わせは一例にすぎず、非時短遊技状態よりも時短遊技状態の方が、発射賞球比率が高くなるように、3つの要素を組み合わせればよい。
図19は、同時回し参考例に係る本来の遊技性に則った遊技状態の遷移を説明する図である。上記の構成により、遊技機100は、次のような遊技性を実現する。なお、ここでは、登録設定値が「1」に設定されている場合について説明する。まず、遊技機100の初期状態では、図19の(a)に示す通常状態に設定されている。通常状態では、実質変動対象が特1保留に設定されているため、遊技者は第1固定始動口120Aに遊技球を入球させるべく、第1遊技領域116aに向けて遊技球を発射させる。第1遊技領域116aは、遊技盤108の左側に位置することから、遊技者は、通常状態において、所謂「左打ち」を行うこととなる。
第1固定始動口120Aに遊技球が入球すると特1保留が第1特図保留記憶領域に記憶される。第1特図保留記憶領域に記憶された特1保留は、始動条件の成立により順次読み出され、読み出した特1保留に基づく大役抽選が行われる。このとき、大当たりの当選確率は約1/300.6に設定されている。通常状態では、この特1保留に基づく大役抽選において、大当たりに当選することを目的として遊技を行うこととなる。なお、第1遊技領域116aに向けて遊技球を発射した場合の発射賞球比率は100:20に設定されており、遊技中に遊技球が減少していくことになる。
そして、通常状態において、特1保留による大役抽選で大当たりに当選すると、大役遊技が実行される。この大役遊技では、第1大入賞口126が開放されるラウンド遊技が4回または10回実行され、遊技者は4ラウンドまたは10ラウンド分の賞球を獲得することができる。そして、特1保留によって大当たりに当選した場合には、大当たり図柄として特別図柄A~Eのいずれかが決定される。
通常状態において、第1特別図柄表示器160に停止表示された大当たり図柄が特別図柄Aであった場合、大役遊技後の遊技状態は、図19の(b)に示す低確時短状態となる。特1保留で大当たりに当選した場合に、大当たり図柄として特別図柄Aが決定される確率は30%である。したがって、通常状態で大当たりに当選した場合、30%の確率で、遊技状態が低確時短状態に移行する。低確時短状態では、実質変動対象が特1保留に設定されているが、普通遊技状態が時短遊技状態であるため、遊技者は第1可変始動口120Bに遊技球を入球させるべく、第2遊技領域116bを狙った右打ちを行うこととなる。
つまり、この低確時短状態では、通常状態と同様、特1保留に基づく大役抽選において、大当たりに当選することを目的として遊技を行うこととなる。なお、低確時短状態は、大当たりの当選確率が約1/300.6であるが、普通遊技状態が時短遊技状態であることから、可動片120bが頻繁に開状態となる。そのため、発射賞球比率は100:99となり、遊技者は、遊技球の費消を低減しながら、大当たりの当選を狙うことができる。
なお、低確時短状態に移行すると、時短回数が100回に設定され、100回の大役抽選で大当たりに当選しなかった場合には、遊技状態が再び通常状態に移行することとなる(時短抜け)。
また、通常状態において、第1特別図柄表示器160に停止表示された大当たり図柄が特別図柄B、Dであった場合、大役遊技後の遊技状態は、図19の(c)に示す高確時短状態となる。特1保留で大当たりに当選した場合に、大当たり図柄として特別図柄B、Dが決定される確率は35%である。したがって、通常状態で大当たりに当選した場合、35%の確率で、遊技状態が高確時短状態に移行する。高確時短状態では、実質変動対象が特1保留に設定されているが、普通遊技状態が時短遊技状態であるため、遊技者は第1可変始動口120Bに遊技球を入球させるべく、第2遊技領域116bを狙った右打ちを行うこととなる。
つまり、この高確時短状態では、通常状態と同様、特1保留に基づく大役抽選において、大当たりに当選することを目的として遊技を行うこととなる。なお、高確時短状態は、大当たりの当選確率が約1/105.7であり、普通遊技状態が時短遊技状態であることから、可動片120bが頻繁に開状態となる。そのため、発射賞球比率は100:99となり、遊技者は、遊技球の費消を低減しながら、大役抽選を行うことができる。したがって、高確時短状態では、実質上、次回の大当たりの当選が確約された状態と言える。
また、通常状態において、第1特別図柄表示器160に停止表示された大当たり図柄が特別図柄C、Eであった場合、大役遊技後の遊技状態は、図19の(d)に示す高確前兆状態となる。特1保留で大当たりに当選した場合に、大当たり図柄として特別図柄C、Eが決定される確率は35%である。したがって、通常状態で大当たりに当選した場合、35%の確率で、遊技状態が高確前兆状態に移行する。高確前兆状態では、実質変動対象が特1保留に設定されているが、普通遊技状態が時短遊技状態であるため、遊技者は第1可変始動口120Bに遊技球を入球させるべく、第2遊技領域116bを狙った右打ちを行うこととなる。
そして、特別図柄C、Eが決定された場合には、高確前兆状態に設定されるとともに、時短回数が100回に設定される。このとき、大役遊技後の変動回数が100回に到達すると、時短遊技状態が終了し、普通遊技状態が非時短遊技状態となる。その結果、時短抜けにより、遊技状態が図19の(e)に示す最優位状態に移行することとなる。詳しくは後述するように、最優位状態では、第2遊技領域116bに向けて遊技球を発射し続けるだけで、遊技球を増加させることができる。したがって、高確前兆状態では、大当たりの当選が遊技の目的となるのではなく、大当たりに当選せずに、時短抜けすることが遊技の目的となる。
上記の高確前兆状態、高確時短状態、低確時短状態における実質変動対象の特1保留によれば、大当たりに当選した場合に、大当たり図柄として特別図柄A~Eが決定される。特別図柄Aが決定されると、大役遊技において4回のラウンド遊技が実行されるとともに、大役遊技後の遊技状態が、図19の(b)に示す低確時短状態となる。また、特別図柄B、Dが決定された場合、大役遊技において4回または10回のラウンド遊技が実行されるとともに、大役遊技後の遊技状態が高確時短状態となる。また、特別図柄C、Eが決定された場合、大役遊技において4回または10回のラウンド遊技が実行されるとともに、大役遊技後の遊技状態が、高確前兆状態となる。
最優位状態では、第2始動口122に遊技球が入球すると特2保留が第2特図保留記憶領域に記憶される。第2特図保留記憶領域に記憶された特2保留は、始動条件の成立により順次読み出され、読み出した特2保留に基づく大役抽選が行われる。このとき、大当たりの当選確率は約1/105.7に設定されており、また、小当たりの当選確率は約1/3.45に設定されている。最優位状態では、この特2保留に基づく大役抽選において、小当たりに当選することが遊技の最大の目的となる。
具体的には、第2遊技領域116bに遊技球を発射させた場合、発射球数に対する、第2始動口122への遊技球の入球によって払い出される賞球の比率は、100:60~80程度に設定されている。そして、最優位状態では、特2保留による大役抽選において、約1/3.45の確率で小当たりに当選するため、小当たり遊技が頻繁に行われる。ここで、特2保留によって小当たりに当選した場合には、小当たり図柄Z4~Z6が決定される。上記したように、小当たり図柄Z4が第2特別図柄表示器162に停止表示された場合の小当たり遊技では、平均2~3個の遊技球が第2大入賞口128に入球する。小当たり図柄Z5が第2特別図柄表示器162に停止表示された場合の小当たり遊技では、平均3~4個の遊技球が第2大入賞口128に入球する。さらに、小当たり図柄Z6が第2特別図柄表示器162に停止表示された場合の小当たり遊技では、ほぼ規定数の遊技球が第2大入賞口128に入球する。
第2大入賞口128に遊技球が入球すると、例えば、1個の遊技球の入球に対して15個の賞球が払い出される。これにより、最優位状態では、発射球数に対する全ての賞球数の比率である発射賞球比率が100:120となり、第2遊技領域116bに向けて遊技球を発射し続けるだけで、遊技球を増加させることができる。
なお、この最優位状態では、普通遊技状態が非時短遊技状態となっており、可動片120bが開状態となることは殆どない。また、最優位状態では、特別遊技状態が高確率遊技状態となっており、最優位状態における大当たりの当選確率が約1/105.7であることから、最優位状態では、実質上、次回の大当たりの当選が確約された状態と言える。
この最優位状態における実質変動対象の特2保留によれば、大当たりに当選した場合に、大当たり図柄として特別図柄F~Jが決定される。特別図柄Fが決定された場合、大役遊技において4回のラウンド遊技が実行されるとともに、大役遊技後の遊技状態が、図19の(b)に示す低確時短状態となる。また、特別図柄G、Iが決定された場合、大役遊技において4回または10回のラウンド遊技が実行されるとともに、大役遊技後の遊技状態が高確時短状態となる。また、特別図柄H、Jが決定された場合、大役遊技において4回または10回のラウンド遊技が実行されるとともに、大役遊技後の遊技状態が、高確前兆状態となる。
最優位状態は、他の遊技状態に比べて、有利度合いが極めて高いため、遊技機100における遊技の最大の目的は、遊技状態を最優位状態に移行させることとなる。上記のとおり、遊技はまず、通常状態で開始されるが、この通常状態から一気に最優位状態に移行することはない。そのため、高確前兆状態を経由して最優位状態へ移行するという移行ルートが、遊技機100における最優位状態への移行ルートとなる。
さらに、同時回し参考例では、高確前兆状態における時短抜けとは別に、特定の小当たり図柄に当選することが、高確前兆状態から最優位状態への移行条件として設定されている。具体的には、高確前兆状態における実質変動対象である特1保留によって小当たりに当選した場合、小当たり図柄として、特別図柄Z1が1%、特別図柄Z2が69%、特別図柄Z3が30%の確率で決定される(図8(c)参照)。
このとき、小当たり図柄として特別図柄Z1が決定されると、小当たり遊技の終了に伴って時短遊技状態が終了し、その結果、遊技状態が最優位状態へと移行することとなる。
このように、特定の小当たりの当選によって最優位状態に移行することから、変動回数が規定回数(100回)に達したときにのみ最優位状態に移行する場合に比べて、遊技者に対して、常時、期待感と緊張感とが付与される。
なお、上記の高確前兆状態、高確時短状態、低確時短状態においては、約1/3.45の確率で小当たりに当選する。そのため、高確前兆状態、高確時短状態、低確時短状態においても、最優位状態と同様に、頻繁に小当たり遊技が実行される。しかしながら、高確前兆状態、高確時短状態、低確時短状態は、いずれも普通遊技状態が時短遊技状態である。また、詳しくは後述するが、小当たり遊技中も、普通遊技状態は時短遊技状態に維持されている。そのため、小当たり遊技中に第2大入賞口128が開放されるものの、この間に、第1可変始動口120Bも開放されてしまう。
上記したように、第1可変始動口120Bは、第2大入賞口128よりも上方に設けられており、しかも、時短遊技状態では、第1可変始動口120Bの開放時間が、第2大入賞口128の開放時間よりも極めて長い。そのため、高確前兆状態、高確時短状態、低確時短状態においては、第2遊技領域116bを流下する遊技球の殆どが第1可変始動口120Bに入球し、第2大入賞口128には殆ど遊技球が入球することはない。その結果、高確前兆状態、高確時短状態、低確時短状態においては、最優位状態とは異なり、遊技中に右打ちを行ったとしても、遊技球が徐々に減少することとなる。
以上のように、本来の遊技性に則って実質変動対象によって遊技が進行すると、大当たりに当選した場合、大役遊技後の遊技状態が、低確時短状態、高確時短状態、高確前兆状態のいずれかに設定される。そして、高確時短状態および高確前兆状態は、特別遊技状態が高確率遊技状態であり、普通遊技状態が時短遊技状態であることが共通している。一方で、高確時短状態は、次回の大当たりに当選するまで継続するのに対して、高確前兆状態は、特定の小当たり(特別図柄Z1)に当選するか、時短抜けすることで、遊技状態が最優位状態に移行される点で相違する。
また、高確時短状態では、小当たり時およびハズレ時の変動時間が1秒に設定されるのに対して、高確前兆状態では、小当たり時およびハズレ時の変動時間が3~10秒の範囲内で設定される点で相違する(図13(b)参照)。つまり、高確時短状態における変動時間の平均は、高確前兆状態における変動時間の平均よりも短く設定される。
したがって、高確時短状態では、小当たり時およびハズレ時の変動時間が相対的に短いため、大当たりに当選するまで、実質変動対象を高速で消化することができる。詳しい説明は省略するが、特別図柄の変動時間では、副制御基板330において演出図柄210a、210b、210cの変動表示が行われる。高確時短状態では、演出図柄210a、210b、210cの変動表示も相対的に短くなる。そのため、高確時短状態では、特1保留が記憶され続ける限り、特1保留(演出図柄210a、210b、210cの変動表示)が高速で消化され続けることになり、大当たりに当選するまでの時間を短くすることができ、遊技者にストレスを感じさせることなく(低減して)、次回の大当たりまで遊技を行わせることができる。
一方、高確前兆状態では、小当たり時およびハズレ時の変動時間が相対的に長いが、副制御基板330においては、最優位状態に移行するか否かの演出が行われる。そのため、遊技者は最優位状態に移行するのではないかと期待しながら遊技を行うことができる。
このように、高確時短状態では、特定の小当たり(特別図柄Z1)に当選しても最優位状態に移行することはないが、変動時間の平均が短く設定されることで、次回の大当たりの当選までの時間を短くでき、遊技者へのストレスを低減することができる。また、高確前兆状態では、高確時短状態と比べて変動時間の平均が長く設定されているが、その変動時間で、最優位状態に移行するか否かの演出を行うことができ、遊技者に期待感と緊張感とを付与することができる。
以上のように、特別遊技状態が高確率遊技状態であり、普通遊技状態が時短遊技状態であることが共通している高確時短状態および高確前兆状態が設けられ、高確時短状態の変動時間の平均を高確前兆状態の変動時間の平均よりも短くすることで、新たな遊技性を提供することができる。
図20は、同時回し参考例に係る適切に遊技が行われなかった場合の遊技状態の遷移を説明する図である。上記のように、遊技機100では、第1特別図柄表示器160における図柄の変動表示と、第2特別図柄表示器162における図柄の変動表示とが、同時並行して行われる。このとき、実質変動対象以外の保留によって大役抽選が行われた結果、遊技者に不利益が生じる可能性がある場合については、変動時間を10分といった長時間に設定している。しかしながら、実質変動対象以外の保留によって大役抽選が行われた後、例えば、遊技を中断してしまう等した結果、実質変動対象以外の保留による大当たりが確定してしまうこともある。この場合には、図20に示すように遊技状態が遷移することとなる。
以下に、上記の遊技性を実現するための、主制御基板300の主な処理について説明する。
図21は、同時回し参考例に係る遊技機状態フラグを説明する図である。主制御基板300においては、遊技を進行可能な状態であるか否かが遊技機状態フラグにより管理される。遊技機状態フラグには、00H~05Hの6種類のフラグ値のいずれかがセットされる。遊技機状態フラグのフラグ値=00Hは遊技可能状態を示しており、遊技機状態フラグが00Hである場合に、遊技が進行制御され、遊技機状態フラグが00H以外である場合には、遊技が停止される。
遊技機状態フラグのフラグ値=01Hは設定変更状態を示しており、遊技機状態フラグが01Hである場合には、登録設定値の変更操作が可能となる。遊技機状態フラグのフラグ値=02Hは設定確認状態を示しており、遊技機状態フラグが02Hである場合には、登録設定値が性能表示モニタ184に表示される等して、登録設定値を確認することが可能となる。遊技機状態フラグのフラグ値=03Hは設定異常状態を示しており、遊技機状態フラグが03Hである場合には、登録設定値が異常であるとして遊技が停止される。遊技機状態フラグのフラグ値=04HはRAM異常状態を示しており、遊技機状態フラグが04Hである場合には、遊技が停止される。遊技機状態フラグのフラグ値=05Hはチェックサム異常状態を示しており、遊技機状態フラグが05Hである場合には、遊技が停止される。電源が投入されると、遊技機状態フラグがいずれかのフラグ値にセットされ、遊技機状態フラグに応じた処理が行われる。
(主制御基板300のCPU初期化処理)
図22は、同時回し参考例に係る主制御基板300におけるCPU初期化処理を説明する第1のフローチャートであり、図23は、同時回し参考例に係る主制御基板300におけるCPU初期化処理を説明する第2のフローチャートである。
電源基板より電源が供給されると、メインCPU300aにシステムリセットが発生し、メインCPU300aは、以下のCPU初期化処理(S100)を行う。
(ステップS100-1)
メインCPU300aは、電源投入に応じて、初期設定処理として、メインROM300bから起動プログラムを読み込むとともに、各種処理を実行するために必要な設定処理を行う。
(ステップS100-3)
メインCPU300aは、タイマカウンタにウェイト処理時間を設定する。
(ステップS100-5)
メインCPU300aは、電源断予告信号を検出しているかを判定する。なお、主制御基板300には、電源断検知回路が設けられており、電源電圧が所定値以下になると、電源断検知回路から電源断予告信号が出力される。電源断予告信号を検出している場合には、上記ステップS100-3に処理を移し、電源断予告信号を検出していない場合には、ステップS100-7に処理を移す。
(ステップS100-7)
メインCPU300aは、上記ステップS100-3で設定したウェイト時間が経過したか否かを判定する。その結果、ウェイト時間が経過したと判定した場合にはステップS100-9に処理を移し、ウェイト時間は経過していないと判定した場合には上記ステップS100-5に処理を移す。
(ステップS100-9)
メインCPU300aは、メインRAM300cへのアクセスを許可するために必要な処理を実行する。
(ステップS100-11)
メインCPU300aは、Dレジスタに電源断前の遊技機状態フラグのフラグ値をロードする。
(ステップS100-13)
メインCPU300aは、チェックサムを算出するとともに、算出したチェックサムが、電源断時に保存されたチェックサムと一致する(正常である)か、ならびに、バックアップフラグが正常であるかを判定する。その結果、バックアップフラグおよびチェックサムが正常であると判定した場合にはステップS100-15に処理を移し、いずれか一方または双方が正常ではないと判定した場合にはステップS100-25に処理を移す。
(ステップS100-15)
メインCPU300aは、メインRAM300cのクリア対象の先頭アドレスに、設定値および遊技機状態フラグを含まない番地をセットする。
(ステップS100-17)
メインCPU300aは、RAMクリアスイッチ182sからRAMクリア操作信号が入力されているか(RAMクリアボタンが押下操作されているか)を判定する。その結果、RAMクリア操作信号が入力されていると判定した場合にはステップS100-31に処理を移し、RAMクリア操作信号は入力されていないと判定した場合にはステップS100-19に処理を移す。
(ステップS100-19)
メインCPU300aは、上記ステップS100-11でロードした遊技機状態フラグのフラグ値が00H(遊技可能状態)であり、設定変更スイッチ180sがオンしており、かつ、中枠104が開放しているかを判定する。その結果、3つの条件をすべて満たすと判定した場合にはステップS100-21に処理を移し、3つの条件の1つでも満たされないと判定した場合にはステップS100-23に処理を移す。
(ステップS100-21)
メインCPU300aは、遊技機状態フラグに02H(設定確認状態)をセットする。すなわち、中枠104が開放されており、設定変更スイッチ180sがオンしており、RAMクリアボタンが押下されていない状態で正常に電源投入がなされると、設定確認状態となる。
(ステップS100-23)
メインCPU300aは、メインRAM300cのうち、上記ステップS100-15でセットされた先頭アドレス以降の領域である電源復帰時のクリア対象をクリアする初期化処理を実行し、ステップS100-49に処理を移す。
(ステップS100-25)
メインCPU300aは、Dレジスタに05H(チェックサム異常状態)をセットする。
(ステップS100-27)
メインCPU300aは、使用外領域のリードライトメモリのチェックおよびクリアを行う領域外リードライトチェック処理を行う。
(ステップS100-29)
メインCPU300aは、メインRAM300cのクリア対象の先頭アドレスに、設定値および遊技機状態フラグを含む番地をセットする。
(ステップS100-31)
メインCPU300aは、使用領域のリードライトメモリのチェックおよびクリアを行う。
(ステップS100-33)
メインCPU300aは、上記ステップS100-31におけるリードライトメモリのチェック結果が正常であるかを判定する。その結果、正常であると判定した場合にはステップS100-37に処理を移し、正常ではないと判定した場合にはステップS100-35に処理を移す。
(ステップS100-35)
メインCPU300aは、Dレジスタに04H(RAM異常状態)をセットし、ステップS100-45に処理を移す。
(ステップS100-37)
メインCPU300aは、Dレジスタに02H(設定確認状態)がセットされているかを判定する。その結果、02Hがセットされていると判定した場合にはステップS100-39に処理を移し、02Hはセットされていないと判定した場合にはステップS100-41に処理を移す。
(ステップS100-39)
メインCPU300aは、Dレジスタに00H(遊技可能状態)をセットする。
(ステップS100-41)
メインCPU300aは、設定変更条件を満たしているかを判定する。その結果、設定変更条件を満たしていると判定した場合にはステップS100-43に処理を移し、設定変更条件は満たしていないと判定した場合にはステップS100-45に処理を移す。なお、ここでは、設定変更条件に、設定変更スイッチ180sがオンしていること、中枠104が開放していること、および、RAMクリアスイッチ182sからRAMクリア操作信号が入力されていることが少なくとも含まれる。
(ステップS100-43)
メインCPU300aは、Dレジスタに01H(設定変更状態)をセットする。
(ステップS100-45)
メインCPU300aは、Dレジスタにセットされている値を遊技機状態フラグにセーブする。
(ステップS100-47)
メインCPU300aは、メインRAM300cのうち、RAMクリア時のクリア対象をクリアする初期化処理を実行し、ステップS100-49に処理を移す。
(ステップS100-49)
メインCPU300aは、メインRAM300cがクリアされたことを払出制御基板310に伝達するための払出コマンド(RAMクリア指定コマンド)の送信処理(RAMクリア指定コマンドを送信バッファに格納)を行う。
(ステップS100-51)
メインCPU300aは、遊技機状態フラグをロードする。
(ステップS100-53)
メインCPU300aは、上記ステップS100-51でロードした遊技機状態フラグが00H(遊技可能状態)であるかを判定する。その結果、00Hであると判定した場合にはステップS110に処理を移し、00Hではないと判定した場合にはステップS100-55に処理を移す。
(ステップS110)
メインCPU300aは、サブコマンド群セット処理を行う。なお、このサブコマンド群セット処理については後述する。
(ステップS100-55)
メインCPU300aは、所定のコマンドを副制御基板330に送信するためのサブコマンド群セット処理を行う。
(ステップS100-57)
メインCPU300aは、タイマ割込みの周期を設定する。
(ステップS100-59)
メインCPU300aは、割込みを禁止するための処理を行う。
(ステップS100-61)
メインCPU300aは、当たり図柄乱数用初期値更新乱数を更新する。なお、当たり図柄乱数用初期値更新乱数は、当たり図柄乱数の初期値および終了値を決定するためのものである。つまり、後述する当たり図柄乱数の更新処理によって当たり図柄乱数が、当たり図柄乱数用初期値更新乱数から、当該当たり図柄乱数用初期値更新乱数-1まで1周すると、当たり図柄乱数は、そのときの当たり図柄乱数用初期値更新乱数に更新されることとなる。
(ステップS100-63)
メインCPU300aは、払出制御基板310から受信した受信データ(主コマンド)を解析し、受信データに応じた種々の処理を実行する。
(ステップS100-65)
メインCPU300aは、送信バッファに格納されているサブコマンドを副制御基板330に送信するための処理を行う。
(ステップS100-67)
メインCPU300aは、割込みを許可するための処理を行う。
(ステップS100-69)
メインCPU300aは、リーチグループ決定乱数、リーチモード決定乱数、変動パターン乱数を更新し、以後、上記ステップS100-59から処理を繰り返す。なお、以下では、変動演出パターンを決定するためのリーチグループ決定乱数、リーチモード決定乱数、変動パターン乱数を総称して変動演出用乱数と呼ぶ。
図24は、同時回し参考例に係る主制御基板300におけるサブコマンド群セット処理(S110)を説明するフローチャートである。
(ステップS110-1)
メインCPU300aは、遊技機状態フラグのフラグ値をロードする。
(ステップS110-3)
メインCPU300aは、所定のコマンドを副制御基板330に送信するためのサブコマンド群セット処理を行う。
(ステップS110-5)
メインCPU300aは、遊技機100の機種情報を示す機種コマンドを送信バッファにセットする機種コマンド設定処理を行う。
(ステップS110-7)
メインCPU300aは、登録設定値を示す設定値指定コマンドを送信バッファにセットする設定値指定コマンド設定処理を行う。
(ステップS110-9)
メインCPU300aは、特1保留数を示す特図1保留指定コマンドを送信バッファにセットする特図1保留指定コマンド設定処理を行う。
(ステップS110-11)
メインCPU300aは、特2保留数を示す特図2保留指定コマンドを送信バッファにセットする特図2保留指定コマンド設定処理を行う。
(ステップS110-13)
メインCPU300aは、時短遊技状態の残り回数を示す回数コマンドを送信バッファにセットする回数コマンド設定処理を行う。
(ステップS110-15)
メインCPU300aは、変動パターン選択状態を示す変動パターン選択状態指定コマンドを送信バッファにセットする変動パターン選択状態指定コマンド設定処理を行う。
(ステップS110-17)
メインCPU300aは、特別遊技管理フェーズを示す特図フェーズ指定コマンドを送信バッファにセットする特図フェーズ指定コマンド設定処理を行う。なお、特別遊技管理フェーズについては後述する。
(ステップS110-19)
メインCPU300aは、特別遊技管理フェーズが特別図柄変動待ち状態であるかを判定する。その結果、特別図柄変動待ち状態であると判定した場合にはステップS110-21に処理を移し、特別図柄変動待ち状態ではないと判定した場合には当該サブコマンド群セット処理を終了する。
(ステップS110-21)
メインCPU300aは、客待ち指定コマンドを送信バッファにセットし、当該サブコマンド群セット処理を終了する。
次に、主制御基板300における割込み処理について説明する。ここでは、電源断時退避処理(XINT割込み処理)およびタイマ割込み処理について説明する。
(主制御基板300の電源断時退避処理(XINT割込み処理))
図25は、同時回し参考例に係る主制御基板300における電源断時退避処理(XINT割込み処理)を説明するフローチャートである。メインCPU300aは、電源断検知回路を監視しており、電源電圧が所定値以下になると、CPU初期化処理に割り込んで電源断時退避処理を実行する。
(ステップS300-1)
電源断予告信号が入力されると、メインCPU300aは、レジスタを退避する。
(ステップS300-3)
メインCPU300aは、電源断予告信号をチェックする。
(ステップS300-5)
メインCPU300aは、電源断予告信号を検出しているかを判定する。その結果、電源断予告信号を検出していると判定した場合にはステップS300-11に処理を移し、電源断予告信号を検出していないと判定した場合にはステップS300-7に処理を移す。
(ステップS300-7)
メインCPU300aは、レジスタを復帰させる。
(ステップS300-9)
メインCPU300aは、割込みを許可するための処理を行い、当該電源断時退避処理を終了する。
(ステップS300-11)
メインCPU300aは、出力ポートの出力を停止する出力ポートクリア処理を実行する。
(ステップS300-13)
メインCPU300aは、チェックサムを算出して保存するチェックサム設定処理を実行する。
(ステップS300-15)
メインCPU300aは、メインRAM300cへのアクセスを禁止するために必要なRAMプロテクト設定処理を実行する。
(ステップS300-17)
メインCPU300aは、電源断発生監視時間を設定すべく、ループカウンタのカウンタ値に所定の電源断検出信号検出回数をセットする。
(ステップS300-19)
メインCPU300aは、電源断予告信号をチェックする。
(ステップS300-21)
メインCPU300aは、電源断予告信号を検出しているかを判定する。その結果、電源断予告信号を検出していると判定した場合にはステップS300-17に処理を移し、電源断予告信号を検出していないと判定した場合にはステップS300-23に処理を移す。
(ステップS300-23)
メインCPU300aは、上記ステップS300-17でセットしたループカウンタの値を1減算する。
(ステップS300-25)
メインCPU300aは、ループカウンタのカウンタ値が0でないかを判定する。その結果、カウンタ値が0ではないと判定した場合にはステップS300-19に処理を移し、カウンタ値が0であると判定した場合には上記したCPU初期化処理(ステップS100)に移行する。
なお、実際に電源断が生じた場合には、ステップS300-17~ステップS300-25をループしている間に遊技機100の稼働が停止する。
(主制御基板300のタイマ割込み処理)
図26は、同時回し参考例に係る主制御基板300におけるタイマ割込み処理を説明するフローチャートである。主制御基板300には、所定の周期(同時回し参考例では4ミリ秒、以下「4ms」という)毎にクロックパルスを発生させるリセット用クロックパルス発生回路が設けられている。そして、リセット用クロックパルス発生回路によって、クロックパルスが発生すると、CPU初期化処理(ステップS100)に割り込んで、以下のタイマ割込み処理が実行される。
(ステップS400-1)
メインCPU300aは、レジスタを退避する。
(ステップS400-3)
メインCPU300aは、割込みを許可するための処理を行う。
(ステップS400-5)
メインCPU300aは、コモン出力バッファにセットされたコモンデータを出力ポートに出力し、第1特別図柄表示器160、第2特別図柄表示器162、第1特別図柄保留表示器164、第2特別図柄保留表示器166、普通図柄表示器168、普通図柄保留表示器170、右打ち報知表示器172、性能表示モニタ184を点灯制御するダイナミックポート出力処理を実行する。
(ステップS400-7)
メインCPU300aは、各種の入力ポート情報を読み込み、最新のスイッチ状態を正確に取得するためのポート入力処理を実行する。
(ステップS400-9)
メインCPU300aは、遊技機状態フラグのフラグ値をロードする。
(ステップS400-11)
メインCPU300aは、上記ステップS400-9でロードしたフラグ値が00H(遊技可能状態)であるかを判定する。その結果、00Hであると判定した場合にはステップS400-15に処理を移し、00Hではないと判定した場合にはステップS400-13に処理を移す。
(ステップS400-13)
メインCPU300aは、上記ステップS400-9でロードしたフラグ値が03H(設定異常状態)以上であるかを判定する。その結果、03H以上であると判定した場合にはステップS400-29に処理を移し、03H以上ではないと判定した場合にはステップS450に処理を移す。
(ステップS450)
メインCPU300aは、設定関連処理を実行し、ステップS400-29に処理を移す。なお、設定関連処理については後述する。
(ステップS400-15)
メインCPU300aは、各種タイマカウンタを更新するタイマ更新処理を行う。ここで、各種タイマカウンタは、特に断る場合を除き、当該主制御基板300のタイマ割込み処理の度に減算され、0になると減算を停止する。
(ステップS400-17)
メインCPU300aは、上記ステップS100-61と同様、当たり図柄乱数用初期値更新乱数の更新処理を実行する。
(ステップS400-19)
メインCPU300aは、当たり図柄乱数を更新する処理を行う。具体的には、乱数カウンタを1加算して更新し、加算した結果が乱数範囲の最大値を超えた場合には、乱数カウンタを0に戻し、乱数カウンタが1周した場合には、その時の当たり図柄乱数用初期値更新乱数の値から乱数を更新する。
なお、詳しい説明は省略するが、同時回し参考例では、大当たり決定乱数および当たり決定乱数は、主制御基板300に内蔵されたハードウェア乱数生成部によって更新されるハードウェア乱数を用いている。ハードウェア乱数生成部は、大当たり決定乱数および当たり決定乱数を、いずれも一定の規則にしたがって更新し、乱数列が一巡するごとに自動的に乱数列を変更するとともに、システムリセット毎にスタート値を変更している。
(ステップS500)
メインCPU300aは、第1固定始動口検出スイッチ120As、第1可変始動口検出スイッチ120Bs、第2始動口検出スイッチ122s、ゲート検出スイッチ124s、普図作動口検出スイッチ125s、第1大入賞口検出スイッチ126s、第2大入賞口検出スイッチ128sから信号の入力があったか否か判定するスイッチ管理処理を実行する。なお、このスイッチ管理処理の詳細については後述する。
(ステップS600)
メインCPU300aは、特別遊技のうちの特2保留に基づく特別図柄の変動表示を進行制御するための特別遊技管理処理を実行する。なお、この特別遊技管理処理の詳細については後述する。
(ステップS600)
メインCPU300aは、特別遊技のうちの特1保留に基づく特別図柄の変動表示を進行制御するための特別遊技管理処理を実行する。なお、ここでは、特2保留に基づく特別図柄の変動表示を進行制御するための特別遊技管理処理と同一のプログラム(モジュール)が読み出されて、特1保留に基づく特別図柄の変動表示を進行制御するための特別遊技管理処理が実行されることになる。
(ステップS700)
メインCPU300aは、特別遊技における大役遊技および小当たり遊技を進行制御するための特別電動役物遊技管理処理を実行する。なお、この特別電動役物遊技管理処理の詳細については後述する。
(ステップS800)
メインCPU300aは、上記の普通遊技を進行制御するための普通遊技管理処理を実行する。なお、この普通遊技管理処理の詳細については後述する。
(ステップS400-21)
メインCPU300aは、各種エラーの判定およびエラー判定結果に応じた設定を行うためのエラー管理処理を実行する。
(ステップS400-23)
メインCPU300aは、一般入賞口検出スイッチ118s、第1始動口検出スイッチ120s、第2始動口検出スイッチ122s、第1大入賞口検出スイッチ126s、第2大入賞口検出スイッチ128sのチェックを行い、該当する賞球制御用のカウンタ等を加算するための入賞口スイッチ処理を実行する。
(ステップS400-25)
メインCPU300aは、上記ステップS400-23でセットされた賞球制御用のカウンタのカウンタ値等に基づく払出コマンドの作成および送信を行うための払出制御管理処理を実行する。
(ステップS400-27)
メインCPU300aは、遊技球の発射位置、すなわち、第1遊技領域116aおよび第2遊技領域116bのどちらに遊技球を発射させるかを指示する発射位置指定コマンドを副制御基板330に送信するための発射位置指定管理処理を実行する。
(ステップS400-29)
メインCPU300aは、遊技情報出力端子板312から外部へ出力する外部情報用の出力データをセットするための外部情報管理処理を実行する。
(ステップS400-31)
メインCPU300aは、第1特別図柄表示器160、第2特別図柄表示器162、第1特別図柄保留表示器164、第2特別図柄保留表示器166、普通図柄表示器168、普通図柄保留表示器170、右打ち報知表示器172等の各種表示器(LED)を点灯制御するための表示データを、各コモンに対応した出力バッファにセットするLED表示設定処理を実行する。
(ステップS400-33)
メインCPU300aは、普通電動役物ソレノイド120c、第1大入賞口ソレノイド126c、第2大入賞口ソレノイド128cのソレノイド出力イメージを合成し、出力ポートバッファに格納するためのソレノイド出力イメージ合成処理を実行する。
(ステップS400-35)
メインCPU300aは、各出力ポートバッファに格納されたコモン出力バッファの値を出力ポートに出力するためのポート出力処理を実行する。
(ステップS400-37)
メインCPU300aは、割込みを禁止するための処理を行う。
(ステップS400-39)
メインCPU300aは、メインRAM300cの使用外領域を用いて、性能表示モニタ184に表示するベース比率を算出するための処理を行い、算出したベース比率を性能表示モニタ184に表示するためのコモンデータをコモン出力バッファにセットする性能表示モニタ制御処理を実行する。なお、性能表示モニタ制御処理においては、所定期間ごとにベース比率が算出される。ここで、性能表示モニタ184には、現在の期間のベース比率と、それ以前の期間のベース比率とが所定時間ごとに切り替え表示されてもよい。また、所定の操作に応じて、性能表示モニタ184に表示されるベース比率が切り替わってもよい。
(ステップS400-41)
メインCPU300aは、レジスタを復帰してタイマ割込み処理を終了する。
図27は、同時回し参考例に係る設定関連処理(S450)を説明するフローチャートである。
(ステップS450-1)
メインCPU300aは、遊技機状態フラグのフラグ値が01H(設定変更状態)であるかを判定する。その結果、01Hであると判定した場合にはステップS450-3に処理を移し、01Hではないと判定した場合にはステップS450-15に処理を移す。
(ステップS450-3)
メインCPU300aは、設定値バッファに記憶されている登録設定値を所定の処理領域にロードする。
(ステップS450-5)
メインCPU300aは、RAMクリアスイッチ182sが押下されたか(RAMクリア操作信号が入力されているか)を判定する。その結果、RAMクリアスイッチ182sが押下されていると判定した場合にはステップS450-7に処理を移し、RAMクリアスイッチ182sが押下されていないと判定した場合にはステップS450-9に処理を移す。
(ステップS450-7)
メインCPU300aは、処理領域の設定値に1を加算する。
(ステップS450-9)
メインCPU300aは、処理領域の設定値が1~6の範囲であるかを判定する。その結果、設定値が1~6の範囲であると判定した場合にはステップS450-13に処理を移し、設定値が1~6の範囲ではないと判定した場合にはステップS450-11に処理を移す。
(ステップS450-11)
メインCPU300aは、処理領域の設定値を1にセットする。
(ステップS450-13)
メインCPU300aは、処理領域の設定値を設定値バッファにセットする。
(ステップS450-15)
メインCPU300aは、設定変更スイッチ180sがオンしているかを判定する。その結果、設定変更スイッチ180sがオンしていると判定した場合には当該設定関連処理を終了し、設定変更スイッチ180sはオンしていないと判定した場合にはステップS450-17に処理を移す。
(ステップS450-17)
メインCPU300aは、設定関連処理の終了を示す設定関連終了指定コマンドを送信バッファにセットする。
(ステップS110)
メインCPU300aは、図24のサブコマンド群セット処理を実行する。すなわち、設定関連処理が実行された場合、その終了時に、機種コマンド、設定値指定コマンド、特図1保留指定コマンド、特図2保留指定コマンド、回数コマンド、変動パターン選択状態指定コマンド、特図フェーズ指定コマンド、客待ち指定コマンドが副制御基板330に送信されることとなる。
(ステップS450-19)
メインCPU300aは、遊技機状態フラグに00H(遊技可能状態)をセットし、当該設定関連処理を終了する。
以上のように、同時回し参考例によれば、中枠104が開放され、設定変更スイッチ180sがオンされ、RAMクリアボタンが押下操作された状態で、正常に電源投入がなされると、CPU初期化処理(図22)において、遊技機状態フラグに01H(設定変更状態)がセットされる。その後、タイマ割込み処理が実行されるが、遊技機状態フラグに01H(設定変更状態)がセットされているため、遊技の進行に係る全ての処理(図26のステップS400-15~ステップS400-27)が停止され、設定関連処理が実行される。
設定関連処理は、設定変更スイッチ180sがオンしている間、繰り返し実行され、この設定関連処理中は、RAMクリアボタンの押下操作が、登録設定値の設定変更操作として受け付けられる。すなわち、設定変更操作を受け付ける設定変更処理(S450-1~S450-13)中は、設定変更操作に応じて、設定値バッファに記憶する登録設定値が、複数段階設けられた設定値のいずれかに切り替えられる。
そして、遊技機状態フラグに01H(設定変更状態)がセットされている状態で、設定変更スイッチ180sがオフに切り替わると、設定変更処理が終了となり、遊技機状態フラグに00H(遊技可能状態)がセットされる。これにより、次のタイマ割込み処理から、遊技の進行に係る処理が実行可能となる。
ここで、同時回し参考例の設定関連処理では、RAMクリアボタンの押下操作、すなわち、登録設定値の設定変更操作の受け付け終了後に、サブコマンド群セット処理において、登録設定値に対応する設定値指定コマンドが副制御基板330に送信される。一方で、設定変更操作の受け付け中は、設定値指定コマンドが副制御基板330に送信されることはない。このように、設定変更操作の受け付け中は、設定値指定コマンドを送信せずに、設定変更操作の受け付けが終了し、遊技の進行が可能な状態に移行する場合に、設定値指定コマンドを送信することで、登録設定値が不正に取得されるリスクを低減することができる。
また、同時回し参考例では、01H(設定変更状態)を少なくとも含む複数のフラグ値が切り替えられる。そして、遊技機状態フラグに01H(設定変更状態)がセットされている場合に設定関連処理が実行可能となり、かつ、遊技の進行が停止される。このように、遊技の進行中に設定関連処理が実行されることがないため、遊技の進行中に設定値指定コマンドが送信されることもなく、登録設定値が不正に取得されるリスクが低減される。
次に、上記したタイマ割込み処理のうち、ステップS500のスイッチ管理処理、ステップS600の特別遊技管理処理、ステップS700の特別電動役物遊技管理処理、ステップS800の普通遊技管理処理について、詳細に説明する。
図28は、同時回し参考例に係る主制御基板300におけるスイッチ管理処理(ステップS500)を説明するフローチャートである。
(ステップS500-1)
メインCPU300aは、ゲート検出スイッチオン検出時であるか、すなわち、ゲート124を遊技球が通過してゲート検出スイッチ124sからの検出信号がオンされたかを判定する。その結果、ゲート検出スイッチオン検出時であると判定した場合にはステップS510に処理を移し、ゲート検出スイッチオン検出時ではないと判定した場合にはステップS500-7に処理を移す。
(ステップS510)
メインCPU300aは、ゲート124への遊技球の通過に基づいてゲート通過処理を実行する。なお、このゲート通過処理の詳細については後述する。
(ステップS500-3)
メインCPU300aは、普図作動口検出スイッチオン検出時であるか、すなわち、普図作動口125に遊技球が入球して普図作動口検出スイッチ125sからの検出信号がオンされたかを判定する。その結果、普図作動口検出スイッチオン検出時であると判定した場合にはステップS510に処理を移し、普図作動口検出スイッチオン検出時ではないと判定した場合にはステップS500-5に処理を移す。
(ステップS510)
メインCPU300aは、普図作動口125への遊技球の入球に基づいてゲート通過処理を実行する。
(ステップS500-5)
メインCPU300aは、第1固定始動口検出スイッチオン検出時であるか、すなわち、第1固定始動口120Aに遊技球が入球して第1固定始動口検出スイッチ120Asから検出信号が入力されたかを判定する。その結果、第1固定始動口検出スイッチオン検出時であると判定した場合にはステップS520に処理を移し、第1固定始動口検出スイッチオン検出時ではないと判定した場合にはステップS500-7に処理を移す。
(ステップS520)
メインCPU300aは、第1固定始動口120Aへの遊技球の入球に基づいて第1始動口通過処理を実行する。なお、この第1始動口通過処理の詳細については後述する。
(ステップS500-7)
メインCPU300aは、第1可変始動口検出スイッチオン検出時であるか、すなわち、第1可変始動口120Bに遊技球が入球して第1可変始動口検出スイッチ120Bsから検出信号が入力されたかを判定する。その結果、第1可変始動口検出スイッチオン検出時であると判定した場合にはステップS520に処理を移し、第1可変始動口検出スイッチオン検出時ではないと判定した場合にはステップS500-11に処理を移す。
(ステップS520)
メインCPU300aは、第1可変始動口120Bへの遊技球の入球に基づいて第1始動口通過処理を実行する。なお、この第1始動口通過処理の詳細については後述する。
(ステップS500-9)
メインCPU300aは、第1可変始動口120Bへの遊技球の入球が適正になされたものであるかを判定し、遊技球の入球が適正になされていないと判定した場合には、第1可変始動口120Bへの不正な遊技球の入球を示す普電不正入賞エラー発生指定コマンドを副制御基板330に送信するための普通電動役物入賞時確認処理を実行する。
(ステップS500-11)
メインCPU300aは、第2始動口検出スイッチオン検出時であるか、すなわち、第2始動口122に遊技球が入球して第2始動口検出スイッチ122sから検出信号が入力されたかを判定する。その結果、第2始動口検出スイッチオン検出時であると判定した場合にはステップS530に処理を移し、第2始動口検出スイッチオン検出時ではないと判定した場合にはステップS500-13に処理を移す。
(ステップS530)
メインCPU300aは、第2始動口122への遊技球の入球に基づいて第2始動口通過処理を実行する。なお、この第2始動口通過処理の詳細については後述する。
(ステップS500-13)
メインCPU300aは、大入賞口検出スイッチオン検出時であるか、すなわち、第1大入賞口126または第2大入賞口128に遊技球が入球して第1大入賞口検出スイッチ126sまたは第2大入賞口検出スイッチ128sから検出信号が入力されたかを判定する。その結果、大入賞口検出スイッチオン検出時であると判定した場合にはステップS540に処理を移し、大入賞口検出スイッチオン検出時ではないと判定した場合には当該スイッチ管理処理を終了する。
(ステップS540)
メインCPU300aは、第1大入賞口126または第2大入賞口128への遊技球の入球が適正になされたものであるかを判定し、遊技球の入球が適正になされたと判定した場合には、第1大入賞口126または第2大入賞口128への遊技球の入球を示す大入賞口入球コマンドを副制御基板330に送信するための大入賞口通過処理を実行する。なお、この大入賞口通過処理の詳細については後述する。
図29は、同時回し参考例に係る主制御基板300におけるゲート通過処理(ステップS510)を説明するフローチャートである。
(ステップS510-1)
メインCPU300aは、ハードウェア乱数生成部によって更新された当たり決定乱数をロードする。
(ステップS510-3)
メインCPU300aは、普通図柄保留球数カウンタのカウンタ値が最大値以上であるか、つまり、普通図柄保留球数カウンタのカウンタ値が4以上であるかを判定する。その結果、普通図柄保留球数カウンタのカウンタ値が最大値以上であると判定した場合には当該ゲート通過処理を終了し、普通図柄保留球数カウンタは最大値以上ではないと判定した場合にはステップS510-5に処理を移す。
(ステップS510-5)
メインCPU300aは、普通図柄保留球数カウンタのカウンタ値を、現在のカウンタ値に「1」加算した値に更新する。
(ステップS510-7)
メインCPU300aは、普図保留記憶領域の4つの記憶部のうち、取得した当たり決定乱数をセーブする対象となる対象記憶部を算定する。
(ステップS510-9)
メインCPU300aは、上記ステップS510-1で取得した当たり決定乱数を、上記ステップS510-7で算定した対象記憶部にセーブする。
(ステップS510-11)
メインCPU300aは、普図保留記憶領域に記憶されている普図保留数を示す普図保留指定コマンドを送信バッファにセットし、当該ゲート通過処理を終了する。
図30は、同時回し参考例に係る主制御基板300における第1始動口通過処理(ステップS520)を説明するフローチャートである。
(ステップS520-1)
メインCPU300aは、特別図柄識別値として「00H」をセットする。なお、特別図柄識別値は、保留種別として特1保留および特2保留のいずれであるかを識別するためのもので、特別図柄識別値(00H)は特1保留を示し、特別図柄識別値(01H)は特2保留を示す。
(ステップS520-3)
メインCPU300aは、特別図柄1保留球数カウンタのアドレスをセットする。
(ステップS535)
メインCPU300aは、特別図柄乱数取得処理を実行し、当該第1始動口通過処理を終了する。なお、この特別図柄乱数取得処理は、第2始動口通過処理(ステップS530)と共通のモジュールを利用して実行される。したがって、特別図柄乱数取得処理の詳細は、第2始動口通過処理の説明後に説明する。
図31は、同時回し参考例に係る主制御基板300における第2始動口通過処理(ステップS530)を説明するフローチャートである。
(ステップS530-1)
メインCPU300aは、特別図柄識別値として「01H」をセットする。
(ステップS530-3)
メインCPU300aは、特別図柄2保留球数カウンタのアドレスをセットする。
(ステップS535)
メインCPU300aは、後述する特別図柄乱数取得処理を実行し、当該第2始動口通過処理を終了する。
図32は、同時回し参考例に係る主制御基板300における特別図柄乱数取得処理(ステップS535)を説明するフローチャートである。この特別図柄乱数取得処理は、上記した第1始動口通過処理(ステップS520)および第2始動口通過処理(ステップS530)において、共通のモジュールを用いて実行される。
(ステップS535-1)
メインCPU300aは、上記ステップS520-1またはステップS530-1でセットした特別図柄識別値をロードする。
(ステップS535-3)
メインCPU300aは、対象特別図柄保留球数をロードする。ここでは、上記ステップS535-1でロードした特別図柄識別値が「00H」であれば、特別図柄1保留球数カウンタのカウンタ値、すなわち、特1保留数をロードする。また、上記ステップS535-1でロードした特別図柄識別値が「01H」であれば、特別図柄2保留球数カウンタのカウンタ値、すなわち、特2保留数をロードする。
(ステップS535-5)
メインCPU300aは、ハードウェア乱数生成部によって更新された大当たり決定乱数をロードする。
(ステップS535-7)
メインCPU300aは、上記ステップS535-3でロードした対象特別図柄保留球数が上限値以上であるかを判定する。その結果、上限値以上であると判定した場合には、当該特別図柄乱数取得処理を終了し、上限値以上ではないと判定した場合には、ステップS535-9に処理を移す。
(ステップS535-9)
メインCPU300aは、対象特別図柄保留球数カウンタのカウンタ値を、現在のカウンタ値に「1」加算した値に更新する。
(ステップS535-11)
メインCPU300aは、特図保留記憶領域の記憶部のうち、取得した大当たり決定乱数をセーブする対象となる対象記憶部を算定する。
(ステップS535-13)
メインCPU300aは、上記ステップS535-5でロードした大当たり決定乱数、上記ステップS400-19で更新された当たり図柄乱数、上記ステップS100-69で更新された変動パターン乱数を取得し、上記ステップS535-11で算定した対象記憶部に格納する。
(ステップS535-15)
メインCPU300aは、特別図柄1保留球数カウンタおよび特別図柄2保留球数カウンタのカウンタ値をロードする。
(ステップS535-17)
メインCPU300aは、上記ステップS535-15でロードしたカウンタ値に基づいて、特図保留指定コマンドを送信バッファにセットする。ここでは、特別図柄1保留球数カウンタのカウンタ値(特1保留数)に基づいて特図1保留指定コマンドをセットし、特別図柄2保留球数カウンタのカウンタ値(特2保留数)に基づいて特図2保留指定コマンドをセットする。これにより、特1保留または特2保留が記憶されるたびに、特1保留数および特2保留数が副制御基板330に伝達されることとなる。
(ステップS536)
メインCPU300aは、取得時演出判定処理を行い、当該特別図柄乱数取得処理を終了する。この取得時演出判定処理では、大役抽選の結果や、変動パターン番号等が仮判定され、仮判定の結果に応じた先読み指定コマンドを副制御基板330に送信する。この取得時演出判定処理について、図33を用いて説明する。
図33は、同時回し参考例に係る主制御基板300における取得時演出判定処理(ステップS536)を説明するフローチャートである。
(ステップS536-1)
メインCPU300aは、設定中の設定値に基づいて、対応する大当たり決定乱数判定テーブルを選択する。具体的には、現在の遊技状態、および、設定中の設定値に基づいて、対応する大当たり決定乱数判定テーブルを選択する。そして、選択したテーブルと、上記ステップS535-13で対象記憶部に記憶した大当たり決定乱数とに基づいて、大当たり、小当たり、ハズレのいずれかを仮判定する特別図柄当たり仮判定処理を行う。
(ステップS536-3)
メインCPU300aは、特別図柄を仮決定するための特別図柄図柄仮判定処理を実行する。ここでは、上記ステップS536-1の仮大役抽選の結果(特別図柄当たり仮判定処理によって導出された結果)が大当たりまたは小当たりであった場合には、上記ステップS535-13で対象記憶部に記憶した当たり図柄乱数、当選種別(大当たりであるか小当たりであるか)、保留種別をロードし、対応する当たり図柄乱数判定テーブルを選択して特別図柄判定データを抽出し、抽出した特別図柄判定データ(大当たり図柄または小当たり図柄の種別)をセーブする。また、上記ステップS536-1の仮大役抽選の結果がハズレであった場合には、所定のハズレ用の特別図柄判定データ(ハズレ図柄の種別)をセーブする。
(ステップS536-5)
メインCPU300aは、ステップS536-3でセーブした特別図柄判定データに対応する先読み図柄種別指定コマンド(先読み指定コマンド)を送信バッファにセットする。
(ステップS536-7)
メインCPU300aは、上記ステップS536-1の特別図柄当たり仮判定処理によって導出された結果が、大当たりまたは小当たりであるかを判定する。その結果、大当たりまたは小当たりであると判定した場合にはステップS536-9に処理を移し、大当たりまたは小当たりではない(ハズレである)と判定した場合にはステップS536-11に処理を移す。
(ステップS536-9)
メインCPU300aは、大当たり時リーチモード決定乱数判定テーブル(図10(b)、(c)参照)または小当たり時リーチモード決定乱数判定テーブル(図10(d)、(e))をセットし、ステップS536-19に処理を移す。
(ステップS536-11)
メインCPU300aは、上記ステップS535-13で対象記憶部に記憶したリーチグループ決定乱数をロードする。
(ステップS536-13)
メインCPU300aは、上記ステップS536-11でロードしたリーチグループ決定乱数が固定値(9000以上)であるかを判定する。ここで、グループ種別は、リーチグループ決定乱数判定テーブルを参照して決定されるが、このリーチグループ決定乱数判定テーブルは、記憶されている保留数に応じて選択される。このとき、リーチグループ決定乱数は、0~10006の範囲から取得され、リーチグループ決定乱数の値が9000以上であれば、保留数に拘わらず、同一のリーチグループ決定乱数判定テーブルが選択され、リーチグループ決定乱数の値が9000未満であれば、保留数に応じて異なるリーチグループ決定乱数判定テーブルが選択される。以下では、リーチグループ決定乱数のうち、保留数に応じて異なるリーチグループ決定乱数判定テーブルが選択される0~8999の範囲の値を不定値とし、保留数に拘わらず同一のリーチグループ決定乱数判定テーブルが選択される9000~10006の範囲の値を固定値と呼ぶ。上記ステップS536-11でロードしたリーチグループ決定乱数が固定値(9000以上)であると判定した場合にはステップS536-15に処理を移し、上記ステップS536-11でロードしたリーチグループ決定乱数が固定値(9000以上)ではないと判定した場合にはステップS536-27に処理を移す。
(ステップS536-15)
メインCPU300aは、リーチグループ決定乱数判定テーブル(図9参照)をセットする。なお、リーチグループ決定乱数判定テーブルは、保留数に応じて複数種類設けられているが、ここでは、保留数が0のときに用いられるテーブルが選択される。そして、セットしたリーチグループ決定乱数判定テーブルと、上記ステップS535-13で対象記憶部に記憶したリーチグループ決定乱数とに基づいて、リーチグループ(グループ種別)を仮決定する。
(ステップS536-17)
メインCPU300aは、上記ステップS536-15で仮決定されたグループ種別に対応するハズレ時リーチモード決定乱数判定テーブル(図10(a)参照)をセットし、ステップS536-19に処理を移す。
(ステップS536-19)
メインCPU300aは、上記ステップS536-9または上記ステップS536-17でセットしたリーチモード決定乱数判定テーブルと、上記ステップS535-13で対象記憶部に記憶したリーチモード決定乱数とに基づいて、変動モード番号を仮決定する。また、ここでは、変動モード番号とともに、変動パターン乱数判定テーブルが仮決定される。
(ステップS536-21)
メインCPU300aは、上記ステップS536-19で仮決定した変動モード番号に対応する先読み指定変動モードコマンド(先読み指定コマンド)を送信バッファにセットする。
(ステップS536-23)
メインCPU300aは、上記ステップS536-19で仮決定した変動パターン乱数判定テーブルと、上記ステップS535-13で対象記憶部に記憶した変動パターン乱数とに基づいて、変動パターン番号を仮決定する。
(ステップS536-25)
メインCPU300aは、上記ステップS536-23で仮決定した変動パターン番号に対応する先読み指定変動パターンコマンド(先読み指定コマンド)を送信バッファにセットし、当該取得時演出判定処理を終了する。
(ステップS536-27)
メインCPU300aは、対象記憶部に新たに記憶された保留について、当該保留が読み出されたときの保留数に応じて、グループ種別、すなわち、変動演出パターンが変化することを示す不定値コマンド(先読み指定変動モードコマンドおよび先読み指定変動パターンコマンド=7FH)を送信バッファにセットし、当該取得時演出判定処理を終了する。
図34は、同時回し参考例に係る主制御基板300における大入賞口通過処理(ステップS540)を説明するフローチャートである。
(ステップS540-1)
メインCPU300aは、上記ステップS500-13で大入賞口検出スイッチオン検出時であると判定した場合には、詳しくは後述する特別電動役物遊技管理フェーズをロードする。なお、詳しくは後述するが、特別電動役物遊技管理フェーズは、大役遊技または小当たり遊技の実行処理の段階、すなわち、大役遊技または小当たり遊技の進行状況を示すものであり、大役遊技または小当たり遊技の実行処理の段階に応じて更新される。
(ステップS540-3)
メインCPU300aは、上記ステップS540-1でロードした特別電動役物遊技管理フェーズが、大入賞口開放前処理以上の実行処理の段階を示すものであるかを判定する。なお、特別電動役物遊技管理フェーズは、00H~08Hの9段階が設けられており、このうち、01H~08Hが、大入賞口開放前処理以上の実行処理の段階に相当する。大役遊技または小当たり遊技は、特別電動役物遊技管理フェーズが01H~08Hである場合に実行されることから、ここでは、現在、大役遊技中または小当たり遊技中であるかを判定することとなる。特別電動役物遊技管理フェーズが、大入賞口開放前処理以上の実行処理の段階を示すものであると判定した場合にはステップS540-5に処理を移し、特別電動役物遊技管理フェーズは、大入賞口開放前処理以上の実行処理の段階を示すものではないと判定した場合にはステップS540-7に処理を移す。
(ステップS540-5)
メインCPU300aは、第1大入賞口126または第2大入賞口128に適正に遊技球が入球したことを示す大入賞口入球コマンドを送信バッファにセットし、大入賞口通過処理を終了する。
(ステップS540-7)
メインCPU300aは、第1大入賞口126または第2大入賞口128への遊技球の入球が不適切なものであるとして、所定のエラー処理を実行し、大入賞口通過処理を終了する。
図35は、同時回し参考例に係る特別遊技管理フェーズを説明する図である。既に説明したとおり、同時回し参考例では、第1始動口120または第2始動口122への遊技球の入球を契機とする特別遊技と、ゲート124への遊技球の通過もしくは普図作動口125への遊技球の入球を契機とする普通遊技とが、同時並行して進行する。特別遊技に係る処理は、段階的に、かつ、繰り返し実行されるが、主制御基板300では、こうした特別遊技に係る各処理を特別遊技管理フェーズおよび特別電動役物遊技管理フェーズによって管理している。
図35に示すように、メインROM300bには、特別遊技のうちの特別図柄の変動表示を実行制御するための複数の特別遊技制御モジュールが格納されており、これら特別遊技制御モジュールごとに、特別遊技管理フェーズが対応付けられている。具体的には、特別遊技管理フェーズが「00H」である場合には、「特別図柄変動待ち処理」を実行するためのモジュールがコールされ、特別遊技管理フェーズが「01H」である場合には、「特別図柄変動中処理」を実行するためのモジュールがコールされ、特別遊技管理フェーズが「02H」である場合には、「特別図柄停止図柄表示処理」を実行するためのモジュールがコールされる。
また、メインROM300bには、特別遊技のうちの大役遊技および小当たり遊技を実行制御するための複数の特別電動役物遊技制御モジュールが格納されており、これら特別電動役物遊技制御モジュールごとに、特別電動役物遊技管理フェーズが対応付けられている。具体的には、特別電動役物遊技管理フェーズが「01H」または「05H」である場合には、「大入賞口開放前処理」を実行するためのモジュールがコールされ、特別電動役物遊技管理フェーズが「02H」または「06H」である場合には、「大入賞口開放制御処理」を実行するためのモジュールがコールされ、特別電動役物遊技管理フェーズが「03H」または「07H」である場合には、「大入賞口閉鎖有効処理」を実行するためのモジュールがコールされ、特別電動役物遊技管理フェーズが「04H」または「08H」である場合には、「大入賞口終了ウェイト処理」を実行するためのモジュールがコールされる。なお、特別電動役物遊技管理フェーズが「00H」である場合には、いずれの特別電動役物遊技制御モジュールもコールされることはない。
図36は、同時回し参考例に係る主制御基板300における特別遊技管理処理(ステップS600)を説明するフローチャートである。
(ステップS600-1)
メインCPU300aは、特別電動役物遊技管理フェーズをロードする。
(ステップS600-3)
メインCPU300aは、上記ステップS600-1でロードした特別電動役物遊技管理フェーズが、「00H」以外であるかを判定する。すなわち、ここでは、現在、大役遊技中または小当たり遊技中であるかを判定することとなる。特別電動役物遊技管理フェーズが「00H」以外であると判定した場合には当該特別遊技管理処理を終了し、特別電動役物遊技管理フェーズが「00H」以外でないと判定した場合にはステップS600-5に処理を移す。
(ステップS600-5)
メインCPU300aは、特別遊技特別図柄判定フラグをロードする。なお、特別遊技特別図柄判定フラグは、特別遊技管理処理の対象となる保留種別として特1保留および特2保留のいずれであるかを判定するためのものであり、特別遊技特別図柄判定フラグ(00H)は特1保留を示し、特別遊技特別図柄判定フラグ(01H)は特2保留を示す。
(ステップS600-7)
メインCPU300aは、上記ステップS600-5でロードした特別遊技特別図柄判定フラグを反転する。ここでは、特別遊技特別図柄判定フラグが「00H」であった場合には「01H」に反転し、特別遊技特別図柄判定フラグが「01H」であった場合には「00H」に反転する。特別遊技特別図柄判定フラグは初期値が「00H」に設定されているため、図26に示した2回の特別遊技管理処理S600のうち、1回目の特別遊技管理処理S600で特別遊技特別図柄判定フラグが「01H」にされ、特2保留について後続の処理が実行され、2回目の特別遊技管理処理S600で特別遊技特別図柄判定フラグが「00H」にされ、特1保留について後続の処理が実行される。つまり、特2保留が優先して処理されることになる。
(ステップS600-9)
メインCPU300aは、上記ステップS600-7で反転した特別遊技特別図柄判定フラグをセーブする。
(ステップS600-11)
メインCPU300aは、特別遊技管理フェーズをロードする。
(ステップS600-13)
メインCPU300aは、上記ステップS600-11でロードした特別遊技管理フェーズに対応する特別遊技制御モジュールを選択する。
(ステップS600-15)
メインCPU300aは、上記ステップS600-13で選択した特別遊技制御モジュールをコールして処理を開始する。
(ステップS600-17)
メインCPU300aは、特別遊技の制御時間を管理する特別遊技タイマをロードし、当該特別遊技管理処理を終了する。
図37は、同時回し参考例に係る主制御基板300における特別図柄変動待ち処理を説明するフローチャートである。この特別図柄変動待ち処理は、特別遊技管理フェーズが「00H」であった場合に実行される。
(ステップS610-1)
メインCPU300aは、特別遊技管理処理の対象となる保留(特1保留または特2保留、以下、対象保留と呼ぶ)の特別図柄保留球数が1以上であるかを判定する。その結果、特別図柄保留球数が1以上であると判定した場合にはステップS610-3に処理を移し、特別図柄保留球数が1以上ではないと判定した場合には当該特別図柄変動待ち処理を終了する。
(ステップS610-3)
メインCPU300aは、特別遊技管理処理の対象となっていない保留(特2保留または特1保留、以下、非対象保留と呼ぶ)に基づく特別図柄(以下、非対象特別図柄と呼ぶ)が確定中であるかを判定する。その結果、非対象特別図柄が確定中であると判定した場合にはステップS610-5に処理を移し、非対象特別図柄に基づく特別図柄が確定中ではないと判定した場合にはステップS610-9に処理を移す。
(ステップS610-5)
メインCPU300aは、非対象特別図柄が大当たり図柄であるかを判定する。その結果、大当たり図柄であると判定した場合には当該特別図柄変動待ち処理を終了し、大当たり図柄でないと判定した場合にはステップS610-7に処理を移す。
(ステップS610-7)
メインCPU300aは、非対象特別図柄が小当たり図柄であるかを判定する。その結果、小当たり図柄であると判定した場合には当該特別図柄変動待ち処理を終了し、小当たり図柄でないと判定した場合にはステップS610-9に処理を移す。
(ステップS610-9)
メインCPU300aは、対象保留に対応する特図保留記憶領域の第1記憶部~第4記憶部に記憶されている対象保留を、1つ序数の小さい記憶部にブロック転送する。具体的には、第2記憶部~第4記憶部に記憶されている対象保留を、第1記憶部~第3記憶部に転送する。また、メインRAM300cには、処理対象となる第0記憶部が設けられており、第1記憶部に記憶されている対象保留を、第0記憶部にブロック転送する。なお、この特別図柄記憶エリアシフト処理においては、対象保留に対応する対象特別図柄保留球数カウンタのカウンタ値を「1」減算するとともに、対象保留が「1」減算されたことを示す、保留減指定コマンドを送信バッファにセットする。
(ステップS611)
メインCPU300aは、大役抽選を行う特別図柄当たり判定処理を実行する。この特別図柄当たり判定処理については後述する。
(ステップS610-11)
メインCPU300aは、特別図柄を決定するための特別図柄図柄判定処理を実行する。ここでは、上記ステップS611における大役抽選の結果が大当たりまたは小当たりであった場合、第0記憶部に転送された当たり図柄乱数、保留種別をロードし、対応する当たり図柄乱数判定テーブルまたは小当たり図柄乱数判定テーブルを選択して特別図柄判定データを抽出し、抽出した特別図柄判定データ(大当たり図柄の種別)をセーブする。また、上記ステップS611における大役抽選の結果がハズレであった場合には、ハズレ用の特別図柄判定データをセーブする。そして、特別図柄判定データをセーブしたら、当該特別図柄判定データに対応する図柄種別指定コマンドを送信バッファにセットする。
(ステップS610-13)
メインCPU300aは、上記ステップS610-11で抽出した特別図柄判定データに対応する特別図柄停止図柄番号をセーブする。なお、第1特別図柄表示器160および第2特別図柄表示器162は、それぞれ7セグで構成されており、7セグを構成する各セグメントには番号(カウンタ値)が対応付けられている。ここで決定する特別図柄停止図柄番号は、最終的に点灯するセグメントの番号(カウンタ値)を示すものである。
(ステップS612)
メインCPU300aは、変動モード番号および変動パターン番号を決定する特別図柄変動番号決定処理を実行する。この特別図柄変動番号決定処理の詳細は後述する。
(ステップS610-15)
メインCPU300aは、上記ステップS612で決定された変動モード番号および変動パターン番号をロードするとともに、変動時間決定テーブルを参照して、変動時間1および変動時間2を決定する。そして、決定した変動時間1、2の合計時間を、特別図柄変動タイマにセットする。
(ステップS610-17)
メインCPU300aは、大役抽選の結果が大当たりであるか否かを判定し、大当たりであった場合には、上記ステップS610-11でセーブした特別図柄判定データをロードして、大当たり図柄の種別を確認する。そして、遊技状態設定テーブルおよび現在の遊技状態を参照して、大役遊技終了後に設定される遊技状態および高確回数、時短回数を判定し、その判定結果を特別図柄確率状態予備フラグ、時短状態予備フラグ、および、高確回数切り予備カウンタ、時短回数切り予備カウンタにセーブする。なお、ハズレ図柄がセーブされている場合には、当該処理を実行することなく、次の処理に移行する。
(ステップS610-19)
メインCPU300aは、第1特別図柄表示器160または第2特別図柄表示器162において、特別図柄の変動表示を開始するために、特別図柄表示図柄カウンタを設定する処理を実行する。第1特別図柄表示器160および第2特別図柄表示器162を構成する7セグの各セグメントにはカウンタ値が対応付けられており、特別図柄表示図柄カウンタに設定されたカウンタ値に対応するセグメントが点灯制御される。ここでは、特別図柄の変動表示の開始時に点灯させるセグメントに対応するカウンタ値が特別図柄表示図柄カウンタに設定されることとなる。なお、特別図柄表示図柄カウンタは、第1特別図柄表示器160に対応する特別図柄1表示図柄カウンタと、第2特別図柄表示器162に対応する特別図柄2表示図柄カウンタとが別個に設けられており、ここでは、保留種別に対応するカウンタにカウンタ値が設定される。
(ステップS613)
メインCPU300aは、回数切り管理処理を実行する。ここでは、変動回数に応じて時短遊技状態を終了させるための処理が行われる。この回数切り管理処理については後述する。
(ステップS610-21)
メインCPU300aは、高確回数および時短回数が0になるまでの残り回数(実残り回数)を示す回数コマンドを送信バッファにセットする。
(ステップS610-23)
メインCPU300aは、特別図柄の変動表示の開始時の遊技状態を示す遊技状態変化指定コマンドを送信バッファにセットする。
(ステップS610-25)
メインCPU300aは、特別遊技管理フェーズを「01H」に更新し、当該特別図柄変動待ち処理を終了する。
図38は、同時回し参考例に係る特別図柄当たり判定処理(S611)を説明するフローチャートである。
(ステップS611-1)
メインCPU300aは、特別図柄確率状態フラグをロードする。
(ステップS611-3)
メインCPU300aは、設定値バッファの登録設定値をロードする。
(ステップS611-5)
メインCPU300aは、上記ステップS611-3でロードした登録設定値が正常範囲内の値であるかを判定する。その結果、正常範囲内の値であると判定した場合にはステップS611-11に処理を移し、正常範囲内の値ではないと判定した場合にはステップS611-7に処理を移す。
(ステップS611-7)
メインCPU300aは、遊技機状態フラグに03H(設定異常状態)をセットする。
(ステップS611-9)
メインCPU300aは、設定異常状態コマンド(サブコマンド)を送信バッファにセットし、当該特別図柄当たり判定処理を終了する。この設定異常状態コマンドが副制御基板330に送信されると、設定異常である旨の報知がなされる。
(ステップS611-11)
メインCPU300aは、上記ステップS611-1およびステップS611-3でロードした情報に対応する大当たり決定乱数判定テーブルを参照し、大当たりまたは小当たりと判定する際の下限値および上限値をそれぞれセットする。
(ステップS611-13)
メインCPU300aは、第0記憶部に転送された大当たり決定乱数と、上記の下限値および上限値とを比較し、大当たりまたは小当たりの当選有無を判定する判定処理(大役抽選)を行う。
(ステップS611-15)
メインCPU300aは、非対象特別図柄が大当たり図柄であるかを判定する。その結果、大当たり図柄であると判定した場合にはステップS611-17に処理を移し、大当たり図柄でないと判定した場合にはステップS611-21に処理を移す。
(ステップS611-17)
メインCPU300aは、上記ステップS611-13における大役抽選結果が小当たりまたはハズレであるかを判定する。その結果、小当たりまたはハズレであると判定した場合にはステップS611-21に処理を移し、小当たりおよびハズレでないと判定した場合にはステップS611-19に処理を移す。
(ステップS611-19)
メインCPU300aは、上記ステップS611-13における大役抽選結果をハズレに変更する。
(ステップS611-21)
メインCPU300aは、上記ステップS611-13の判定処理の結果、または、上記ステップS611-19で変更された結果を判定情報としてセットし、当該特別図柄当たり判定処理を終了する。
図39は、同時回し参考例に係る主制御基板300における特別図柄変動番号決定処理(ステップS612)を説明するフローチャートである。
(ステップS612-1)
メインCPU300aは、上記ステップS611における大役抽選の結果が大当たりまたは小当たりであるかを判定する。その結果、大当たりまたは小当たりであると判定した場合にはステップS612-3に処理を移し、大当たりおよび小当たりのいずれでもない(ハズレである)と判定した場合にはステップS612-5に処理を移す。
(ステップS612-3)
メインCPU300aは、現在の遊技状態および保留種別に対応するリーチモード決定乱数判定テーブルをセットする。
(ステップS612-5)
メインCPU300aは、読み出した保留の保留種別が特2保留である場合には、特別図柄2保留球数カウンタのカウンタ値を確認し、読み出した保留の保留種別が特1保留である場合には、特別図柄1保留球数カウンタのカウンタ値を確認する。
(ステップS612-7)
メインCPU300aは、現在の遊技状態、上記ステップS612-5で確認した保留数、保留種別に基づいて、対応するリーチグループ決定乱数判定テーブルをセットする。そして、セットしたリーチグループ決定乱数判定テーブルと、上記ステップS610-9で第0記憶部に転送したリーチグループ決定乱数とに基づいて、リーチグループ(グループ種別)を決定する。
(ステップS612-9)
メインCPU300aは、上記ステップS612-7で決定されたグループ種別に対応するハズレ時リーチモード決定乱数判定テーブルをセットする。
(ステップS612-11)
メインCPU300aは、上記ステップS612-3または上記ステップS612-9でセットしたリーチモード決定乱数判定テーブルと、上記ステップS610-9で第0記憶部に転送したリーチモード決定乱数とに基づいて、変動モード番号を決定する。また、ここでは、変動モード番号とともに、変動パターン乱数判定テーブルが決定される。
(ステップS612-13)
メインCPU300aは、上記ステップS612-11で決定した変動モード番号に対応する変動モードコマンドを送信バッファにセットする。
(ステップS612-15)
メインCPU300aは、上記ステップS612-11で決定した変動パターン乱数判定テーブルと、上記ステップS610-9で第0記憶部に転送した変動パターン乱数とに基づいて、変動パターン番号を決定する。
(ステップS612-17)
メインCPU300aは、上記ステップS612-15で決定した変動パターン番号に対応する変動パターンコマンドを送信バッファにセットして、当該特別図柄変動番号決定処理を終了する。
図40は、同時回し参考例に係る主制御基板300における回数切り管理処理(ステップS613)を説明するフローチャートである。
(ステップS613-1)
メインCPU300aは、時短回数、すなわち、時短回数切りカウンタのカウンタ値が0よりも大きいかを判定する。その結果、時短回数が0よりも大きいと判定した場合にはステップS613-3に処理を移し、時短回数が0であると判定した場合には、当該回数切り管理処理を終了する。
(ステップS613-3)
メインCPU300aは、時短回数切りカウンタをデクリメントする。
(ステップS613-5)
メインCPU300aは、上記ステップS613-3において、カウンタ値(時短回数)が0に更新されたかを判定する。その結果、時短回数が0であると判定した場合にはステップS613-7に処理を移し、時短回数は0ではないと判定した場合には当該回数切り管理処理を終了する。
(ステップS613-7)
メインCPU300aは、普通遊技状態を非時短遊技状態に設定するべく、時短状態フラグの設定を行う。これにより、普通遊技状態が時短遊技状態に設定された後、変動回数が時短回数(ここでは50回または100回)に到達したときの変動開始時に、普通遊技状態が非時短遊技状態に変更されることとなる。例えば、高確前兆状態に設定されていた場合には、最優位状態に設定されることとなる。
(ステップS613-9)
メインCPU300aは、時短終了フラグをオンして、当該回数切り管理処理を終了する。
図41は、同時回し参考例に係る主制御基板300における特別図柄変動中処理を説明するフローチャートである。
(ステップS620-1)
メインCPU300aは、中断中フラグがオンしているかを判定する。なお、詳しくは後述するが、同時回し参考例では、第1特別図柄表示器160における図柄の変動表示中に、第2特別図柄表示器162に小当たり図柄が停止表示される場合がある。この場合、第2特別図柄表示器162に小当たり図柄が停止表示されると、小当たり遊技が実行されるが、この間、第1特別図柄表示器160における特別図柄の変動時間の減算が中断され、小当たり遊技の終了後に、第1特別図柄表示器160における図柄の変動表示が再開される。中断中フラグは、第2特別図柄表示器162に小当たり図柄が停止表示されたときに、第1特別図柄表示器160において図柄の変動表示中であった場合にオンされる。ここでは、中断中フラグがオンであると判定した場合には当該特別図柄変動中処理を終了し、中断中フラグがオンではないと判定した場合にはステップS620-3に処理を移す。
(ステップS620-3)
メインCPU300aは、特別図柄変動ベースカウンタを更新する処理を実行する。なお、特別図柄変動ベースカウンタは、所定周期(例えば100ms)で1周するようにカウンタ値が設定される。具体的には、特別図柄変動ベースカウンタのカウンタ値が「0」であった場合には、所定のカウンタ値(例えば25)がセットされ、カウンタ値が「1」以上であった場合には、現在のカウンタ値から「1」減算した値にカウンタ値を更新する。
(ステップS620-5)
メインCPU300aは、上記ステップS620-3で更新した特別図柄変動ベースカウンタのカウンタ値が「0」であるかを判定する。その結果、カウンタ値が「0」であった場合にはステップS620-7に処理を移し、カウンタ値が「0」ではなかった場合にはステップS620-11に処理を移す。
(ステップS620-7)
メインCPU300aは、上記ステップS610-15で設定された特別図柄変動タイマのタイマ値を所定値減算する特別図柄変動タイマ更新処理を行う。
(ステップS620-9)
メインCPU300aは、上記ステップS620-7で更新した特別図柄変動タイマのタイマ値が「0」であるかを判定する。その結果、タイマ値が「0」であった場合にはステップS620-17に処理を移し、タイマ値が「0」ではなかった場合にはステップS620-11に処理を移す。
(ステップS620-11)
メインCPU300aは、第1特別図柄表示器160および第2特別図柄表示器162を構成する7セグの各セグメントの点灯時間を計時する特別図柄表示タイマを更新する。具体的には、特別図柄表示タイマのタイマ値が「0」であった場合には、所定のタイマ値がセットされ、タイマ値が「1」以上であった場合には、現在のタイマ値から「1」減算した値にタイマ値を更新する。
(ステップS620-13)
メインCPU300aは、特別図柄表示タイマのタイマ値が「0」であるかを判定する。その結果、特別図柄表示タイマのタイマ値が「0」であると判定した場合にはステップS620-15に処理を移し、特別図柄表示タイマのタイマ値が「0」でないと判定した場合には当該特別図柄変動中処理を終了する。
(ステップS620-15)
メインCPU300aは、更新対象の特別図柄表示図柄カウンタのカウンタ値を更新し、当該特別図柄変動中処理を終了する。これにより、7セグを構成する各セグメントが、所定時間おきに順次点灯することとなる。
(ステップS620-17)
メインCPU300aは、非対象特別図柄が変動表示中であるかを判定する。その結果、非対象特別図柄が変動表示中であると判定した場合にはステップS621に処理を移し、非対象特別図柄が変動表示中でないと判定した場合にはステップS620-19に処理を移す。
(ステップS621)
メインCPU300aは、図柄強制停止処理を実行する。この図柄強制停止処理については、図42を用いて後述する。
(ステップS620-19)
メインCPU300aは、特別遊技管理フェーズを「02H」に更新する。
(ステップS620-21)
メインCPU300aは、対象の特別図柄表示図柄カウンタに、上記ステップS610-13で決定した特別図柄停止図柄番号(カウンタ値)をセーブする。これにより、第1特別図柄表示器160または第2特別図柄表示器162に、決定された特別図柄が停止表示されることとなる。
(ステップS620-23)
メインCPU300aは、第1特別図柄表示器160または第2特別図柄表示器162に特別図柄が停止表示されたことを示す特図停止指定コマンドを送信バッファにセットする。
(ステップS620-25)
メインCPU300aは、特別図柄を停止表示する時間である特別図柄変動停止時間を特別遊技タイマにセットし、当該特別図柄変動中処理を終了する。
図42は、同時回し参考例に係る主制御基板300における図柄強制停止処理(ステップS621)を説明するフローチャートである。
(ステップS621-1)
メインCPU300aは、停止表示中(当該)の特別図柄が小当たり図柄であるかを判定する。その結果、小当たり図柄であると判定した場合にはステップS621-3に処理を移し、小当たり図柄ではないと判定した場合にはステップS621-11に処理を移す。
(ステップS621-3)
メインCPU300aは、特別遊技特別図柄判定フラグが00Hであるか、つまり、小当たり図柄が停止表示されたのが、第1特別図柄表示器160であるかを判定する。その結果、特別遊技特別図柄判定フラグが00Hであると判定した場合にはステップS621-11に処理を移し、特別遊技特別図柄判定フラグが00Hではないと判定した場合にはステップS621-5に処理を移す。
(ステップS621-5)
メインCPU300aは、変動表示中(他方)の特別図柄が大当たり図柄であるかを判定する。その結果、大当たり図柄であると判定した場合にはステップS621-11に処理を移し、大当たり図柄ではないと判定した場合にはステップS621-7に処理を移す。
(ステップS621-7)
メインCPU300aは、中断中フラグをオンする。
(ステップS621-9)
メインCPU300aは、特別図柄の変動表示を中断する変動中断処理を実行し、当該図柄強制停止処理を終了する。ここでは、変動時間の残り時間や、特別図柄にかかる情報を一時的に所定の記憶領域に退避させる処理を行う。
(ステップS621-11)
メインCPU300aは、図柄が変動表示されている第1特別図柄表示器160または第2特別図柄表示器162にハズレ図柄を強制停止させるとともに、残りの変動時間を強制的に終了させるための変動時間特殊停止フラグをオンにする処理を行い、当該図柄強制停止処理を終了する。
上記の処理により、第1特別図柄表示器160に小当たり図柄が停止表示された場合には、第2特別図柄表示器162にハズレ図柄が強制停止表示される。また、第2特別図柄表示器162に小当たり図柄が停止表示された場合、大当たり図柄が第1特別図柄表示器160に最終的に停止表示される変動表示中であれば、第1特別図柄表示器160にハズレ図柄が強制停止表示される。一方、第2特別図柄表示器162に小当たり図柄が停止表示された場合、小当たり図柄またはハズレ図柄が第1特別図柄表示器160に最終的に停止表示される変動表示中であれば、第1特別図柄表示器160における変動表示が一時的に中断されることとなる。
図43は、同時回し参考例に係る主制御基板300における特別図柄停止図柄表示処理を説明するフローチャートである。
(ステップS630-1)
メインCPU300aは、上記ステップS620-25でセットした特別遊技タイマのタイマ値が「0」でないかを判定する。その結果、特別遊技タイマのタイマ値が「0」ではないと判定した場合には当該特別図柄停止図柄表示処理を終了し、特別遊技タイマのタイマ値が「0」であると判定した場合にはステップS630-3に処理を移す。
(ステップS630-3)
メインCPU300aは、変動時間特殊停止フラグがオンであるかを判定する。その結果、変動時間特殊停止フラグがオンであると判定した場合にはステップS630-5に処理を移し、変動時間特殊停止フラグがオンでないと判定した場合には当該特別図柄停止図柄表示処理を終了する。
(ステップS630-5)
メインCPU300aは、大役抽選の結果を確認する。
(ステップS630-7)
メインCPU300aは、大役抽選の結果がハズレであるかを判定する。その結果、ハズレであると判定した場合にはステップS630-27に処理を移し、ハズレではないと判定した場合にはステップS630-9に処理を移す。
(ステップS630-9)
メインCPU300aは、遊技状態を更新する遊技状態更新処理を行う。ここでは、停止表示中の特別図柄が大当たり図柄である場合に遊技状態を初期状態に設定し、停止表示中の特別図柄が小当たり図柄である場合には、そのまま次の処理に移る。
(ステップS630-11)
メインCPU300aは、確定した特別図柄の種別に応じて、特別電動役物作動ラムセットテーブルのデータをセットする。なお、メインCPU300aは、変動時間特殊停止フラグがオンである場合にはオフにする。
(ステップS630-13)
メインCPU300aは、特別電動役物最大作動回数設定処理を行う。具体的には、上記ステップS630-11でセットしたデータを参照し、特別電動役物最大作動回数カウンタに、カウンタ値として所定数(特別図柄の種別に対応するカウンタ値=ラウンド数)をセットする。なお、この特別電動役物最大作動回数カウンタは、これから開始する大役遊技において実行可能なラウンド数を示すものである。一方、メインRAM300cには、特別電動役物連続作動回数カウンタが設けられており、各ラウンド遊技の開始時に、特別電動役物連続作動回数カウンタのカウンタ値を「1」加算することで、現在のラウンド遊技数が管理される。ここでは、大役遊技の開始に伴って、この特別電動役物連続作動回数カウンタのカウンタ値をリセット(「0」に更新)する処理が併せて実行される。
(ステップS630-15)
メインCPU300aは、上記ステップS630-11でセットしたデータを参照し、特別電動役物遊技タイマに、タイマ値として所定のオープニング時間をセーブする。
(ステップS630-17)
メインCPU300aは、大役遊技の開始を副制御基板330に伝達するためのオープニング指定コマンドを送信バッファにセットする。
(ステップS630-19)
メインCPU300aは、大役遊技を開始する場合には特別電動役物遊技管理フェーズを「01H」に更新し、小当たり遊技を開始する場合には特別電動役物遊技管理フェーズを「05H」に更新する。
(ステップS630-21)
メインCPU300aは、特別遊技管理フェーズを「00H」に更新する。
(ステップS630-23)
メインCPU300aは、上記ステップS630-19で更新した特別電動役物遊技管理フェーズが「01H」であるか、すなわち、大当たりかを判定する。その結果、特別電動役物遊技管理フェーズが「01H」であると判定した場合にはステップS630-25に処理を移し、特別電動役物遊技管理フェーズは「01H」ではないと判定した場合には、ステップS630-27に処理を移す。
(ステップS630-25)
メインCPU300aは、遊技情報出力端子板312から大当たり信号を出力するための大当たり信号出力開始処理を行い、当該特別図柄停止図柄表示処理を終了する。この処理により、大役遊技(オープニング)の開始に伴って大当たり信号が出力されることとなる。なお、遊技情報出力端子板312から出力される信号は複数設けられているが、ここでは、所定の大当たり信号についてのみ説明する。
(ステップS630-27)
メインCPU300aは、特別図柄が確定したときの遊技状態を示す特図確定時遊技状態確認指定コマンドを送信バッファにセットする。
(ステップS630-29)
メインCPU300aは、時短終了フラグがオンしているかを判定する。上記したように、時短終了フラグは、時短遊技状態から非時短遊技状態に変更される際の変動開始時に、図40のステップS613-9においてオンされる。すなわち、ここで時短終了フラグがオンしている場合というのは、高確前兆状態における50回目もしくは100回目の変動開始時に、時短抜けによって、普通遊技状態が時短遊技状態から非時短遊技状態に変更された場合である。つまり、ここでは、時短抜け時の変動が終了するときに限り、時短終了フラグがオンしていると判定されることとなる。時短終了フラグがオンしていると判定した場合には、ステップS630-31に処理を移し、時短終了フラグはオンしていないと判定した場合にはステップS630-35に処理を移す。
(ステップS630-31)
メインCPU300aは、遊技情報出力端子板312から出力されている大当たり信号を停止するための大当たり信号出力停止処理を行う。すなわち、大当たり信号は、大役遊技中もしくは時短遊技状態中に出力されることとなる。
(ステップS630-33)
メインCPU300aは、時短終了フラグをオフする。
(ステップS630-35)
メインCPU300aは、特別遊技管理フェーズを「00H」に更新し、当該特別図柄停止図柄表示処理を終了する。
図44は、同時回し参考例に係る主制御基板300における特別電動役物遊技管理処理(ステップS700)を説明するフローチャートである。
(ステップS700-1)
メインCPU300aは、特別電動役物遊技管理フェーズをロードする。
(ステップS700-3)
メインCPU300aは、上記ステップS700-1でロードした特別電動役物遊技管理フェーズが、「00H」であるかを判定する。すなわち、ここでは、現在、大役遊技中および小当たり遊技中でないかを判定することとなる。特別電動役物遊技管理フェーズが「00H」であると判定した場合には当該特別電動役物遊技管理処理を終了し、特別電動役物遊技管理フェーズが「00H」でないと判定した場合にはステップS700-5に処理を移す。
(ステップS700-5)
メインCPU300aは、上記ステップS700-1でロードした特別電動役物遊技管理フェーズに対応する特別電動役物遊技制御モジュールを選択する。
(ステップS700-7)
メインCPU300aは、上記ステップS700-5で選択した特別電動役物遊技制御モジュールをコールして処理を開始する。
(ステップS700-9)
メインCPU300aは、特別電動役物遊技の制御時間を管理する特別電動役物遊技タイマをロードし、当該特別電動役物遊技管理処理を終了する。
図45は、同時回し参考例に係る主制御基板300における大入賞口開放前処理を説明するフローチャートである。この大入賞口開放前処理は、特別電動役物遊技管理フェーズが「01H」、「05H」であった場合に実行される。
(ステップS710-1)
メインCPU300aは、上記ステップS630-15等でセットした特別電動役物遊技タイマのタイマ値が「0」でないかを判定する。その結果、特別電動役物遊技タイマのタイマ値が「0」ではないと判定した場合には当該大入賞口開放前処理を終了し、特別電動役物遊技タイマのタイマ値が「0」であると判定した場合にはステップS710-3に処理を移す。
(ステップS710-3)
メインCPU300aは、特別電動役物連続作動回数カウンタのカウンタ値を、現在のカウンタ値に「1」加算した値に更新する。
(ステップS710-5)
メインCPU300aは、大入賞口の開放開始(ラウンド遊技の開始)を副制御基板330に伝達するための大入賞口開放指定コマンドを送信バッファにセットする。
(ステップS711)
メインCPU300aは、大入賞口開閉切替処理を実行する。この大入賞口開閉切替処理については後述する。
(ステップS710-7)
メインCPU300aは、特別電動役物遊技管理フェーズを、現在の値に01Hを加算した値(「02H」または「06H」)に更新し、当該大入賞口開放前処理を終了する。
図46は、同時回し参考例に係る主制御基板300における大入賞口開閉切替処理(S711)を説明するフローチャートである。
(ステップS711-1)
メインCPU300aは、特別電動役物開閉切替回数カウンタのカウンタ値が、特別電動役物開閉切替回数(1回のラウンド遊技中における大入賞口の開閉回数)の上限値であるかを判定する。その結果、カウンタ値が上限値であると判定した場合には当該大入賞口開閉切替処理を終了し、カウンタ値は上限値ではないと判定した場合にはステップS711-3に処理を移す。
(ステップS711-3)
メインCPU300aは、特別電動役物作動ラムセットテーブルのデータを参照し、特別電動役物開閉切替回数カウンタのカウンタ値に基づいて、第1大入賞口ソレノイド126c、第2大入賞口ソレノイド128cを通電制御するためのソレノイド制御データ、および、通電時間もしくは通電停止時間であるタイムデータを抽出する。
(ステップS711-5)
メインCPU300aは、上記ステップS711-3で抽出したソレノイド制御データに基づいて、第1大入賞口ソレノイド126cまたは第2大入賞口ソレノイド128cの通電を開始するか、もしくは、通電を停止するための大入賞口ソレノイド通電制御処理を実行する。この大入賞口ソレノイド通電制御処理の実行により、上記ステップS400-33およびステップS400-35において、第1大入賞口ソレノイド126cまたは第2大入賞口ソレノイド128cの通電開始もしくは通電停止の制御がなされることとなる。
(ステップS711-7)
メインCPU300aは、上記ステップS711-3で抽出したタイムデータに基づくタイマ値を、特別電動役物遊技タイマにセーブする。なお、ここで特別電動役物遊技タイマにセーブされるタイマ値は、大入賞口の1回の最大開放時間となる。
(ステップS711-9)
メインCPU300aは、第1大入賞口ソレノイド126cまたは第2大入賞口ソレノイド128cの通電開始状態か、すなわち、上記ステップS711-5において、第1大入賞口ソレノイド126cまたは第2大入賞口ソレノイド128cの通電を開始する制御処理がなされたかを判定する。その結果、通電開始状態であると判定した場合にはステップS711-11に処理を移し、通電開始状態ではないと判定した場合には当該大入賞口開閉切替処理を終了する。
(ステップS711-11)
メインCPU300aは、特別電動役物開閉切替回数カウンタのカウンタ値を、現在のカウンタ値に「1」加算した値に更新し、当該大入賞口開閉切替処理を終了する。
図47は、同時回し参考例に係る主制御基板300における大入賞口開放制御処理を説明するフローチャートである。この大入賞口開放制御処理は、特別電動役物遊技管理フェーズが「02H」、「06H」であった場合に実行される。
(ステップS720-1)
メインCPU300aは、上記ステップS711-7でセーブした特別電動役物遊技タイマのタイマ値が「0」でないかを判定する。その結果、特別電動役物遊技タイマのタイマ値が「0」ではないと判定した場合にはステップS720-5に処理を移し、特別電動役物遊技タイマのタイマ値が「0」であると判定した場合にはステップS720-3に処理を移す。
(ステップS720-3)
メインCPU300aは、特別電動役物開閉切替回数カウンタのカウンタ値が、特別電動役物開閉切替回数の上限値であるかを判定する。その結果、カウンタ値が上限値であると判定した場合にはステップS720-7に処理を移し、カウンタ値は上限値ではないと判定した場合にはステップS711に処理を移す。
(ステップS711)
上記ステップS720-3において、特別電動役物開閉切替回数カウンタのカウンタ値が、特別電動役物開閉切替回数の上限値ではないと判定した場合には、メインCPU300aは、上記ステップS711の処理を実行する。
(ステップS720-5)
メインCPU300aは、上記ステップS500-9で更新された大入賞口入賞球数カウンタのカウンタ値が規定数に到達していないか、すなわち、大入賞口に、1ラウンド中の最大入賞可能数と同数の遊技球が入球していないかを判定する。その結果、規定数に到達していないと判定した場合には当該大入賞口開放制御処理を終了し、規定数に到達したと判定した場合にはステップS720-7に処理を移す。
(ステップS720-7)
メインCPU300aは、第1大入賞口ソレノイド126cまたは第2大入賞口ソレノイド128cの通電を停止して大入賞口を閉鎖するために必要な大入賞口閉鎖処理を実行する。これにより、大入賞口は閉鎖状態となる。
(ステップS720-9)
メインCPU300aは、大入賞口閉鎖有効時間(インターバル時間)を特別電動役物遊技タイマにセーブする。
(ステップS720-11)
メインCPU300aは、特別電動役物遊技管理フェーズを、現在の値に01Hを加算した値(「03H」または「07H」)に更新する。
(ステップS720-13)
メインCPU300aは、大入賞口が閉鎖されたことを示す大入賞口閉鎖指定コマンドを送信バッファにセットし、当該大入賞口開放制御処理を終了する。
図48は、同時回し参考例に係る主制御基板300における大入賞口閉鎖有効処理を説明するフローチャートである。この大入賞口閉鎖有効処理は、特別電動役物遊技管理フェーズが「03H」、「07H」であった場合に実行される。
(ステップS730-1)
メインCPU300aは、上記ステップS720-9でセーブした特別電動役物遊技タイマのタイマ値が「0」でないかを判定する。その結果、特別電動役物遊技タイマのタイマ値が「0」でないと判定した場合には当該大入賞口閉鎖有効処理を終了し、特別電動役物遊技タイマのタイマ値が「0」であると判定した場合にはステップS730-3に処理を移す。
(ステップS730-3)
メインCPU300aは、特別電動役物連続作動回数カウンタのカウンタ値が、特別電動役物最大作動回数カウンタのカウンタ値と一致するか、すなわち、予め設定された回数のラウンド遊技が終了したかを判定する。その結果、特別電動役物連続作動回数カウンタのカウンタ値が、特別電動役物最大作動回数カウンタのカウンタ値と一致すると判定した場合にはステップS730-9に処理を移し、一致しないと判定した場合にはステップS730-5に処理を移す。
(ステップS730-5)
メインCPU300aは、特別電動役物遊技管理フェーズを「01H」に更新する。なお、特別電動役物遊技管理フェーズが07Hである場合、すなわち、小当たり遊技の制御中は、小当たり遊技のラウンド遊技回数が「1」であることから、上記ステップS730-3で必ずYESと判定され、当該ステップに処理が移行することはない。
(ステップS730-7)
メインCPU300aは、所定の大入賞口閉鎖時間を特別遊技タイマにセーブし、当該大入賞口閉鎖有効処理を終了する。これにより、次のラウンド遊技が開始されることとなる。
(ステップS730-9)
メインCPU300aは、エンディング時間を特別電動役物遊技タイマにセーブするエンディング時間設定処理を実行する。
(ステップS730-11)
メインCPU300aは、特別電動役物遊技管理フェーズを、現在の値に01Hを加算した値(「04H」または「08H」)に更新する。
(ステップS730-13)
メインCPU300aは、エンディングの開始を示すエンディング指定コマンドを送信バッファにセットし、当該大入賞口閉鎖有効処理を終了する。
図49は、同時回し参考例に係る主制御基板300における大入賞口終了ウェイト処理を説明するフローチャートである。この大入賞口終了ウェイト処理は、特別電動役物遊技管理フェーズが「04H」、「08H」であった場合に実行される。
(ステップS740-1)
メインCPU300aは、上記ステップS730-9でセーブした特別電動役物遊技タイマのタイマ値が「0」でないかを判定する。その結果、特別電動役物遊技タイマのタイマ値が「0」ではないと判定した場合には当該大入賞口終了ウェイト処理を終了し、特別電動役物遊技タイマのタイマ値が「0」であると判定した場合にはステップS740-3に処理を移す。
(ステップS740-3)
メインCPU300aは、特別電動役物遊技管理フェーズが「08H」であるか、すなわち、小当たり遊技の終了であるかを判定する。その結果、特別電動役物遊技管理フェーズが「08H」であると判定した場合にはステップS740-11に処理を移し、特別電動役物遊技管理フェーズは「08H」ではないと判定した場合にはステップS740-5に処理を移す。
(ステップS740-5)
メインCPU300aは、大役遊技終了後の遊技状態を設定するための状態設定処理を実行する。ここでは、上記ステップS610-17で予備領域に設定した遊技状態や高確回数、時短回数をロードし、大役遊技後の遊技状態として各フラグの設定やカウンタ値をセットする。
(ステップS740-7)
メインCPU300aは、上記ステップS740-5において、普通遊技状態が非時短遊技状態に設定されたかを判定する。その結果、非時短遊技状態に設定されたと判定した場合にはステップS740-9に処理を移し、非時短遊技状態に設定されていないと判定した場合にはステップS740-21に処理を移す。
(ステップS740-9)
メインCPU300aは、遊技情報出力端子板312から出力されている大当たり信号を停止するための大当たり信号出力停止処理を行う。すなわち、大役遊技後に最優位状態に設定される場合には、大役遊技の終了とともに、大当たり信号の出力が停止されることとなる。
(ステップS740-11)
メインCPU300aは、現在の遊技状態が高確前兆状態(高確率遊技状態かつ時短遊技状態)であるかを判定する。その結果、高確前兆状態であると判定した場合にはステップS740-13に処理を移し、高確前兆状態ではないと判定した場合にはステップS740-21に処理を移す。
(ステップS740-13)
メインCPU300aは、停止表示された小当たり図柄が特別図柄Z1であるかを判定する。その結果、特別図柄Z1であると判定した場合にはステップS740-15に処理を移し、特別図柄Z1ではないと判定した場合にはステップS740-21に処理を移す。
(ステップS740-15)
メインCPU300aは、普通遊技状態を非時短遊技状態に変更するべく、時短状態フラグをセットする。これにより、高確前兆状態において特別図柄Z1が決定された場合には、その小当たり遊技の終了時に、遊技状態が最優位状態に変更されることとなる。
(ステップS740-17)
メインCPU300aは、時短回数カウンタをリセットするカウンタリセット処理を行う。
(ステップS740-19)
メインCPU300aは、遊技情報出力端子板312から出力されている大当たり信号を停止するための大当たり信号出力停止処理を行う。すなわち、特別図柄Z1に当選して小当たり遊技後に最優位状態に設定される場合には、小当たり遊技の終了とともに、大当たり信号の出力が停止されることとなる。
(ステップS740-21)
メインCPU300aは、大役遊技の終了後に設定される遊技状態を伝達するための遊技状態変化指定コマンドを送信バッファにセットする。
(ステップS740-23)
メインCPU300aは、高確回数、時短回数に対応する回数コマンドを送信バッファにセットする。
(ステップS740-25)
メインCPU300aは、特別電動役物遊技管理フェーズを「00H」に更新し、当該大入賞口終了ウェイト処理を終了する。これにより、特1保留または特2保留が記憶されている場合には、図柄の変動表示が再開されることとなる。
図50は、同時回し参考例に係る普通遊技管理フェーズを説明する図である。既に説明したとおり、同時回し参考例では、ゲート124への遊技球の通過もしくは普図作動口125への遊技球の入球を契機とする普通遊技に係る処理が、段階的に、かつ、繰り返し実行されるが、主制御基板300では、こうした普通遊技に係る各処理を普通遊技管理フェーズによって管理している。
図50に示すように、メインROM300bには、普通遊技を実行制御するための複数の普通遊技制御モジュールが格納されており、これら普通遊技制御モジュールごとに、普通遊技管理フェーズが対応付けられている。具体的には、普通遊技管理フェーズが「00H」である場合には、「普通図柄変動待ち処理」を実行するためのモジュールがコールされ、普通遊技管理フェーズが「01H」である場合には、「普通図柄変動中処理」を実行するためのモジュールがコールされ、普通遊技管理フェーズが「02H」である場合には、「普通図柄停止図柄表示処理」を実行するためのモジュールがコールされ、普通遊技管理フェーズが「03H」である場合には、「普通電動役物入賞口開放前処理」を実行するためのモジュールがコールされ、普通遊技管理フェーズが「04H」である場合には、「普通電動役物入賞口開放制御処理」を実行するためのモジュールがコールされ、普通遊技管理フェーズが「05H」である場合には、「普通電動役物入賞口閉鎖有効処理」を実行するためのモジュールがコールされ、普通遊技管理フェーズが「06H」である場合には、「普通電動役物入賞口終了ウェイト処理」を実行するためのモジュールがコールされる。
図51は、同時回し参考例に係る主制御基板300における普通遊技管理処理(ステップS800)を説明するフローチャートである。
(ステップS800-1)
メインCPU300aは、普通遊技管理フェーズをロードする。
(ステップS800-3)
メインCPU300aは、上記ステップS800-1でロードした普通遊技管理フェーズに対応する普通遊技制御モジュールを選択する。
(ステップS800-5)
メインCPU300aは、上記ステップS800-3で選択した普通遊技制御モジュールをコールして処理を開始する。
(ステップS800-7)
メインCPU300aは、普通遊技の制御時間を管理する普通遊技タイマをロードする。
図52は、同時回し参考例に係る主制御基板300における普通図柄変動待ち処理を説明するフローチャートである。この普通図柄変動待ち処理は、普通遊技管理フェーズが「00H」であった場合に実行される。
(ステップS810-1)
メインCPU300aは、普通図柄保留球数カウンタのカウンタ値をロードし、カウンタ値が「0」であるか、すなわち、普図保留が「0」であるかを判定する。その結果、カウンタ値が「0」であると判定した場合には当該普通図柄変動待ち処理を終了し、カウンタ値は「0」ではないと判定した場合にはステップS810-3に処理を移す。
(ステップS810-3)
メインCPU300aは、普図保留記憶領域の第1記憶部~第4記憶部に記憶されている普図保留(当たり決定乱数)を、1つ序数の小さい記憶部にブロック転送する。具体的には、第2記憶部~第4記憶部に記憶されている普図保留を、第1記憶部~第3記憶部に転送する。また、メインRAM300cには、処理対象となる第0記憶部が設けられており、第1記憶部に記憶されている普図保留を、第0記憶部に転送する。なお、この普通図柄記憶エリアシフト処理においては、普通図柄保留球数カウンタのカウンタ値を「1」減算するとともに、普図保留が「1」減算したことを示す、普図保留減指定コマンドを送信バッファにセットする。
(ステップS810-5)
メインCPU300aは、第0記憶部に転送された当たり決定乱数をロードし、現在の遊技状態に対応する当たり決定乱数判定テーブルを選択して普図抽選を行い、その抽選結果を記憶する普通図柄当たり判定処理を実行する。
(ステップS810-7)
メインCPU300aは、上記ステップS810-5の普図抽選の結果に対応する普通図柄停止図柄番号をセーブする。なお、同時回し参考例では、普通図柄表示器168は1つのLEDランプで構成されており、当たりの場合には普通図柄表示器168を点灯させ、ハズレの場合には普通図柄表示器168を消灯させる。ここで決定する普通図柄停止図柄番号は、最終的に普通図柄表示器168を点灯するか否かを示すものであり、例えば、当たりに当選した場合には、普通図柄停止図柄番号として「0」が決定され、ハズレの場合には、普通図柄停止図柄番号として「1」が決定される。
(ステップS810-9)
メインCPU300aは、現在の遊技状態を確認し、対応する普通図柄変動時間データテーブルを選択してセットする。
(ステップS810-11)
メインCPU300aは、上記ステップS810-3で第0記憶部に転送した当たり決定乱数と、上記ステップS810-9でセットした普通図柄変動時間データテーブルとに基づいて、普通図柄変動時間を決定する。
(ステップS810-13)
メインCPU300aは、上記ステップS810-11で決定した普通図柄変動時間を普通遊技タイマにセーブする。
(ステップS810-15)
メインCPU300aは、普通図柄表示器168において、普通図柄の変動表示を開始するために、普通図柄表示図柄カウンタを設定する処理を実行する。この普通図柄表示図柄カウンタに、カウンタ値として例えば「0」が設定されている場合には普通図柄表示器168が点灯制御され、カウンタ値として「1」が設定されている場合には普通図柄表示器168が消灯制御される。ここでは、普通図柄の変動表示の開始時に所定のカウンタ値が普通図柄表示図柄カウンタに設定されることとなる。
(ステップS810-17)
メインCPU300aは、普図保留記憶領域に記憶されている普図保留数を示す普図保留指定コマンドを送信バッファにセットする。
(ステップS810-19)
メインCPU300aは、上記ステップS810-7で決定された普通図柄停止図柄番号、すなわち、普通図柄当たり判定処理によって決定された図柄種別(当たり図柄またはハズレ図柄)に基づいて、普通図柄指定コマンドを送信バッファにセットする。
(ステップS810-21)
メインCPU300aは、普通遊技管理フェーズを「01H」に更新し、当該普通図柄変動待ち処理を終了する。
図53は、同時回し参考例に係る主制御基板300における普通図柄変動中処理を説明するフローチャートである。この普通図柄変動中処理は、普通遊技管理フェーズが「01H」であった場合に実行される。
(ステップS820-1)
メインCPU300aは、上記ステップS810-13でセーブした普通遊技タイマのタイマ値が「0」であるかを判定する。その結果、タイマ値が「0」であった場合にはステップS820-9に処理を移し、タイマ値が「0」ではなかった場合にはステップS820-3に処理を移す。
(ステップS820-3)
メインCPU300aは、普通図柄表示器168の点灯時間および消灯時間を計時する普通図柄表示タイマを更新する。具体的には、普通図柄表示タイマのタイマ値が「0」であった場合には、所定のタイマ値がセットされ、タイマ値が「1」以上であった場合には、現在のタイマ値から「1」減算した値にタイマ値を更新する。
(ステップS820-5)
メインCPU300aは、普通図柄表示タイマのタイマ値が「0」であるかを判定する。その結果、普通図柄表示タイマのタイマ値が「0」であると判定した場合にはステップS820-7に処理を移し、普通図柄表示タイマのタイマ値が「0」でないと判定した場合には当該普通図柄変動中処理を終了する。
(ステップS820-7)
メインCPU300aは、普通図柄表示図柄カウンタのカウンタ値を更新する。ここでは、普通図柄表示図柄カウンタのカウンタ値が、普通図柄表示器168の消灯を示すカウンタ値であった場合には点灯を示すカウンタ値に更新し、普通図柄表示器168の点灯を示すカウンタ値であった場合には消灯を示すカウンタ値に更新し、当該普通図柄変動中処理を終了する。これにより、普通図柄表示器168は、普通図柄変動時間に亘って、所定時間おきに点灯、消灯を繰り返す(点滅する)こととなる。
(ステップS820-9)
メインCPU300aは、普通図柄表示図柄カウンタに、上記ステップS810-7で決定した普通図柄停止図柄番号(カウンタ値)をセーブする。これにより、普通図柄表示器168が最終的に点灯もしくは消灯制御され、普図抽選の結果が報知されることとなる。
(ステップS820-11)
メインCPU300aは、普通図柄を停止表示する時間である普通図柄変動停止時間を普通遊技タイマにセットする。
(ステップS820-13)
メインCPU300aは、普通図柄の停止表示が開始されたことを示す普図停止指定コマンドを送信バッファにセットする。
(ステップS820-15)
メインCPU300aは、普通遊技管理フェーズを「02H」に更新し、当該普通図柄変動中処理を終了する。
図54は、同時回し参考例に係る主制御基板300における普通図柄停止図柄表示処理を説明するフローチャートである。この普通図柄停止図柄表示処理は、普通遊技管理フェーズが「02H」であった場合に実行される。
(ステップS830-1)
メインCPU300aは、上記ステップS820-11でセットした普通遊技タイマのタイマ値が「0」でないかを判定する。その結果、普通遊技タイマのタイマ値が「0」ではないと判定した場合には当該普通図柄停止図柄表示処理を終了し、普通遊技タイマのタイマ値が「0」であると判定した場合にはステップS830-3に処理を移す。
(ステップS830-3)
メインCPU300aは、普図抽選の結果を確認する。
(ステップS830-5)
メインCPU300aは、普図抽選の結果が当たりであるかを判定する。その結果、当たりであると判定した場合にはステップS830-9に処理を移し、当たりではない(ハズレである)と判定した場合にはステップS830-7に処理を移す。
(ステップS830-7)
メインCPU300aは、普通遊技管理フェーズを「00H」に更新し、当該普通図柄停止図柄表示処理を終了する。これにより、1の普図保留に基づく普通遊技管理処理が終了し、普図保留が記憶されている場合には、次の保留に基づく普通図柄の変動表示を開始するための処理が行われることとなる。
(ステップS830-9)
メインCPU300aは、開閉制御パターンテーブルのデータを参照し、普通遊技タイマに、タイマ値として普電開放前時間をセーブする。
(ステップS830-11)
メインCPU300aは、普通遊技管理フェーズを「03H」に更新し、当該普通図柄停止図柄表示処理を終了する。これにより、第1可変始動口120Bの開閉制御が開始されることとなる。
図55は、同時回し参考例に係る主制御基板300における普通電動役物入賞口開放前処理を説明するフローチャートである。この普通電動役物入賞口開放前処理は、普通遊技管理フェーズが「03H」であった場合に実行される。
(ステップS840-1)
メインCPU300aは、上記ステップS830-9でセットした普通遊技タイマのタイマ値が「0」でないかを判定する。その結果、普通遊技タイマのタイマ値が「0」ではないと判定した場合には当該普通電動役物入賞口開放前処理を終了し、普通遊技タイマのタイマ値が「0」であると判定した場合にはステップS841に処理を移す。
(ステップS841)
メインCPU300aは、普通電動役物入賞口開閉切替処理を実行する。この普通電動役物入賞口開閉切替処理については後述する。
(ステップS840-3)
メインCPU300aは、普通遊技管理フェーズを「04H」に更新し、当該普通電動役物入賞口開放前処理を終了する。
図56は、同時回し参考例に係る主制御基板300における普通電動役物入賞口開閉切替処理を説明するフローチャートである。
(ステップS841-1)
メインCPU300aは、普通電動役物開閉切替回数カウンタのカウンタ値が、普通電動役物開閉切替回数(1回の開閉制御中における第1可変始動口120Bの可動片120bの開閉回数)の上限値であるかを判定する。その結果、カウンタ値が上限値であると判定した場合には当該普通電動役物入賞口開閉切替処理を終了し、カウンタ値は上限値ではないと判定した場合にはステップS841-3に処理を移す。
(ステップS841-3)
メインCPU300aは、開閉制御パターンテーブルのデータを参照し、普通電動役物開閉切替回数カウンタのカウンタ値に基づいて、普通電動役物ソレノイド120cを通電制御するためのソレノイド制御データ(通電制御データまたは通電停止制御データ)、および、普通電動役物ソレノイド120cの通電時間(ソレノイド通電時間)もしくは通電停止時間(普電閉鎖有効時間=休止時間)であるタイムデータを抽出する。
(ステップS841-5)
メインCPU300aは、上記ステップS841-3で抽出したソレノイド制御データに基づいて、普通電動役物ソレノイド120cの通電を開始するか、もしくは、普通電動役物ソレノイド120cの通電を停止するための普通電動役物ソレノイド通電制御処理を実行する。この普通電動役物ソレノイド通電制御処理の実行により、上記ステップS400-33およびステップS400-35において、普通電動役物ソレノイド120cの通電開始もしくは通電停止の制御がなされることとなる。
(ステップS841-7)
メインCPU300aは、上記ステップS841-3で抽出したタイムデータに基づくタイマ値を、普通遊技タイマにセーブする。なお、ここで普通遊技タイマにセーブされるタイマ値は、第1可変始動口120Bの1回の最大開放時間となる。
(ステップS841-9)
メインCPU300aは、普通電動役物ソレノイド120cの通電開始状態か、すなわち、上記ステップS841-5において、普通電動役物ソレノイド120cの通電を開始する制御処理がなされたかを判定する。その結果、通電開始状態であると判定した場合にはステップS841-11に処理を移し、通電開始状態ではないと判定した場合には当該普通電動役物入賞口開閉切替処理を終了する。
(ステップS841-11)
メインCPU300aは、普通電動役物開閉切替回数カウンタのカウンタ値を、現在のカウンタ値に「1」加算した値に更新する。
図57は、同時回し参考例に係る主制御基板300における普通電動役物入賞口開放制御処理を説明するフローチャートである。この普通電動役物入賞口開放制御処理は、普通遊技管理フェーズが「04H」であった場合に実行される。
(ステップS850-1)
メインCPU300aは、上記ステップS841-7でセーブした普通遊技タイマのタイマ値が「0」でないかを判定する。その結果、普通遊技タイマのタイマ値が「0」ではないと判定した場合にはステップS850-5に処理を移し、普通遊技タイマのタイマ値が「0」であると判定した場合にはステップS850-3に処理を移す。
(ステップS850-3)
メインCPU300aは、普通電動役物開閉切替回数カウンタのカウンタ値が、普通電動役物開閉切替回数の上限値であるかを判定する。その結果、カウンタ値が上限値であると判定した場合にはステップS850-7に処理を移し、カウンタ値は上限値ではないと判定した場合にはステップS841に処理を移す。
(ステップS841)
上記ステップS850-3において、普通電動役物開閉切替回数カウンタのカウンタ値が、普通電動役物開閉切替回数の上限値ではないと判定した場合には、メインCPU300aは、上記ステップS841の処理を実行する。
(ステップS850-5)
メインCPU300aは、上記ステップS530-9で更新された普通電動役物入賞球数カウンタのカウンタ値が規定数に到達していないか、すなわち、第1可変始動口120Bに、1回の開閉制御中の最大入賞可能数と同数の遊技球が入球していないかを判定する。その結果、規定数に到達していないと判定した場合には当該普通電動役物入賞口開放制御処理を終了し、規定数に到達したと判定した場合にはステップS850-7に処理を移す。
(ステップS850-7)
メインCPU300aは、普通電動役物ソレノイド120cの通電を停止して第1可変始動口120Bを閉鎖するために必要な普通電動役物閉鎖処理を実行する。これにより、第1可変始動口120Bが閉鎖状態となる。
(ステップS850-9)
メインCPU300aは、普電有効状態時間を普通遊技タイマにセーブする。
(ステップS850-11)
メインCPU300aは、普通遊技管理フェーズを「05H」に更新し、当該普通電動役物入賞口開放制御処理を終了する。
図58は、同時回し参考例に係る主制御基板300における普通電動役物入賞口閉鎖有効処理を説明するフローチャートである。この普通電動役物入賞口閉鎖有効処理は、普通遊技管理フェーズが「05H」であった場合に実行される。
(ステップS860-1)
メインCPU300aは、上記ステップS850-9でセーブした普通遊技タイマのタイマ値が「0」でないかを判定する。その結果、普通遊技タイマのタイマ値が「0」ではないと判定した場合には当該普通電動役物入賞口閉鎖有効処理を終了し、普通遊技タイマのタイマ値が「0」であると判定した場合にはステップS860-3に処理を移す。
(ステップS860-3)
メインCPU300aは、普電終了ウェイト時間を普通遊技タイマにセーブする。
(ステップS860-5)
メインCPU300aは、普通遊技管理フェーズを「06H」に更新し、当該普通電動役物入賞口閉鎖有効処理を終了する。
図59は、同時回し参考例に係る主制御基板300における普通電動役物入賞口終了ウェイト処理を説明するフローチャートである。この普通電動役物入賞口終了ウェイト処理は、普通遊技管理フェーズが「06H」であった場合に実行される。
(ステップS870-1)
メインCPU300aは、上記ステップS860-3でセーブした普通遊技タイマのタイマ値が「0」でないかを判定する。その結果、普通遊技タイマのタイマ値が「0」ではないと判定した場合には当該普通電動役物入賞口終了ウェイト処理を終了し、普通遊技タイマのタイマ値が「0」であると判定した場合にはステップS870-3に処理を移す。
(ステップS870-3)
メインCPU300aは、普通遊技管理フェーズを「00H」に更新し、当該普通電動役物入賞口終了ウェイト処理を終了する。これにより、普図保留が記憶されている場合には、普通図柄の変動表示が再開されることとなる。次に、演出参考例として、上記した一種遊技機、一種二種遊技機、および、同時回し機において実行可能な具体的な演出や当該演出に係る具体的な処理を説明する。
<演出参考例>
図60は、演出参考例に係るリーチなし変動パターンの変動演出の一例を説明する図である。上記のように、主制御基板300において大役抽選が行われると、特別図柄の変動表示中、すなわち、特別図柄の変動時間に亘って、大役抽選の結果を報知する変動演出が実行される。この変動演出においては、メイン演出表示部200aにおいて種々の背景画像が表示されるとともに、この背景画像に重畳して、演出図柄210a、210b、210cが表示される。なお、変動演出中は、メイン演出表示部200aに表示される画像に伴って、音声出力装置206から音声が出力されるとともに、演出照明装置204が点灯制御され、また、演出役物装置202が可動制御されるが、ここでは詳細な説明は省略する。
演出参考例に係る変動演出は、リーチなし変動パターン、リーチ変動パターンに大別される。リーチなし変動パターンの変動演出では、メイン演出表示部200aに背景画像(図示を省略)が表示されるとともに、この背景画像に演出図柄210a、210b、210cが重畳して変動表示される。例えば、図60(a)に示すように、大役抽選結果がハズレであったことを示す組み合わせで演出図柄210a、210b、210cが停止表示されているとする。この状態で、新たに特別図柄の変動表示が行われると、当該特別図柄の変動表示の開始に伴って、図60(b)に示すように、3つの演出図柄210a、210b、210cが変動表示(スクロール表示)を開始する。なお、図中下向きの白抜き矢印は、演出図柄210a、210b、210cが高さ方向にスクロール表示されていることを示している。
そして、図60(c)に示すように、まず、演出図柄210aが停止表示され、その後、図60(d)に示すように、演出図柄210aと異なる演出図柄210cが停止表示される。そして、特別図柄の変動表示が終了して、第1特別図柄表示器160または第2特別図柄表示器162に特別図柄が停止表示するのとほぼ同じタイミングで、図60(e)に示すように、演出図柄210bが停止表示され、このときの3つの演出図柄210a、210b、210cの最終的な停止表示態様によって、大役抽選結果が遊技者に報知される。
図61は、演出参考例に係るノーマルリーチ変動パターンの変動演出の一例を説明する図である。演出参考例では、リーチ変動パターンが、ノーマルリーチ変動パターン、発展リーチ変動パターン、擬似連続リーチ変動パターンに大別される。ノーマルリーチ変動パターンの変動演出は、リーチなし変動パターンの変動演出と同様に、特別図柄の変動表示の開始に伴って、演出図柄210a、210b、210cの変動表示が開始され、図61(a)に示すように、演出図柄210aがまず停止表示される。その後、図61(b)に示すように、演出図柄210aと同一の演出図柄210cが停止表示される。
このように、メイン演出表示部200aにおいて、同一の演出図柄210a、210cが停止表示されるリーチ態様で表示されると、図61(c)に示すように、メイン演出表示部200aにおいて、演出図柄210a、210cに重畳して「リーチ」と表示される。なお、リーチ態様は複数種類設けられており、「1」~「9」のいずれかの数字が記された同一の演出図柄210a、210cが停止表示される。その後、図61(d)に示すように、演出図柄210a、210cの形状を、リーチ態様になる前と異にして変動表示が継続される。そして、図61(e)に示すように、最終的に、演出図柄210a、210cと異なる演出図柄210bが停止表示され、大役抽選の結果がハズレであったことが遊技者に報知される。
図62は、演出参考例に係るハズレ時の発展リーチ変動パターンの変動演出の一例を説明する図であり、図63は、演出参考例に係る大当たり時の発展リーチ変動パターンの変動演出の一例を説明する図である。発展リーチ変動パターンの変動演出は、図62(a)~(d)および図63(a)~(d)に示すように、ノーマルリーチ変動パターンの変動演出と同様に、メイン演出表示部200aにおいて、演出図柄210a、210cがリーチ態様で表示され、その後、所定の発展画像(動画)が再生表示されるリーチ発展演出が実行される。このリーチ発展演出では、例えば、図62(e)および図63(e)に示すように、メイン演出表示部200aにミッションが表示されるとともに、図62(f)、(g)および図63(f)、(g)に示すように、ミッションの達成に向けた画像が表示される。
ここで、リーチ発展演出用の発展画像は、ハズレパターンと大当たりパターンとに大別され、ハズレパターンの発展画像では、図62(h)に示すように、ミッションの失敗を示す画像が最終的に表示され、その後、図62(i)に示すように、演出図柄210a、210b、210cがハズレを報知する組み合わせで停止表示される。一方、大当たりパターンの発展画像では、図63(h)に示すように、ミッションの成功を示す画像が最終的に表示され、その後、図63(i)に示すように、演出図柄210a、210b、210cが大当たりを報知する組み合わせで停止表示される。
なお、リーチ発展演出は、例えば、上記のように、ミッションに挑む内容の発展画像が表示されるミッション演出と、味方キャラクタと敵キャラクタとが対戦する発展画像が表示されるバトル演出と、が設けられている。そして、ミッション演出は、ミッションの内容を異にする複数の実行パターンが設けられており、バトル演出は、登場キャラクタや対戦方法を異にする複数の実行パターンが設けられている。また、上記のように、ミッション演出の実行パターンは、ミッションを達成する大当たりパターンと、ミッションに失敗するハズレパターンとに大別されるが、バトル演出の実行パターンも同様に、味方キャラクタが敵キャラクタに勝利する大当たりパターンと、味方キャラクタが敵キャラクタに敗北するハズレパターンとに大別される。
大当たりパターンとハズレパターンとは、演出の終盤までは同一内容で構成されており、最終的に味方キャラクタが勝利するか敗北するか、あるいは、ミッションを達成するか否かといった点を異にしている。したがって、リーチ発展演出中は、変動演出の終盤まで、大役抽選の結果を遊技者が識別することができず、遊技者に大当たりの期待感が付与されることとなる。
なお、大当たりパターンは、大役抽選の結果が大当たりであった場合にのみ選択され、ハズレパターンは、大役抽選の結果がハズレであった場合にのみ選択される。ただし、1回の変動演出において、リーチ発展演出が2回実行されることもあり、この場合には、1回目のリーチ発展演出がハズレパターンで実行され、2回目のリーチ発展演出が、ハズレパターンまたは大当たりパターンで実行される。以下に、1回の変動演出において、リーチ発展演出が2回実行される場合の演出の流れについて説明する。
図64は、演出参考例に係るリーチ発展演出が2回実行される場合の変動演出の一例を説明する図である。例えば、演出図柄210a、210cがリーチ態様で表示された後、図64(a)、(b)に示すように、ミッション演出が実行されたとする。ここまでは、1回の変動演出においてリーチ発展演出が1回のみ実行される場合と相違はないが、ミッションを達成できなかったことが報知された直後に、図64(c)に示すように、メイン演出表示部200aに「REACH UP」と表示される。
その後、メイン演出表示部200aには、図64(d)に示すように、バトル演出用の発展画像が表示されており、2回目のリーチ発展演出が開始される。このバトル演出用の発展画像は、味方キャラクタと敵キャラクタとが対戦する内容となっており、大当たり当選時には、図64(e)に示すように、最終的に味方キャラクタが敵キャラクタに勝利するとともに、図64(f)に示すように、演出図柄210a、210b、210cが大当たりを報知する組み合わせで停止表示される。一方、ハズレ時には、図64(g)に示すように、最終的に味方キャラクタが敵キャラクタに敗北するとともに、図64(h)に示すように、演出図柄210a、210b、210cがハズレを報知する組み合わせで停止表示される。
図65は、演出参考例に係る擬似連続リーチ変動パターンの変動演出の一例を説明する図である。擬似連続リーチ変動パターンの変動演出は、図65(a)に示すように、演出図柄210a、210b、210cの変動表示が開始されると、図65(b)に示すように、演出図柄210a、210b、210cが、予め設けられた複数種類の擬似態様のうちのいずれかで仮停止表示される。この擬似態様は、例えば、同一の演出図柄210a、210bと、これら演出図柄210a、210bよりも、「2」大きな数字が記された演出図柄210cとが仮停止表示されるものである。
演出図柄210a、210b、210cが擬似態様で仮停止表示されると、図65(c)に示すように、演出図柄210a、210b、210cの変動表示が再開される。つまり、擬似態様は、演出図柄210a、210b、210cの再変動表示を示すものと言える。その後、図65(d)に示すように、演出図柄210a、210b、210cが、再び擬似態様で仮停止表示される。
そして、図65(e)に示すように、演出図柄210a、210b、210cの変動表示が再開されると、図65(f)に示すように、演出図柄210a、210cがリーチ態様で表示され、以後、図65(g)~(i)に示すように、発展リーチ変動パターンと同様にリーチ発展演出が実行され、大役抽選の結果が遊技者に報知される。
このように、擬似連続リーチ変動パターンの変動演出は、演出図柄210a、210cがリーチ態様となるまでの内容が、発展リーチ変動パターンの変動演出と異なっており、リーチ態様となった後は、発展リーチ変動パターンと同様に変動演出が進行されることとなる。
なお、擬似連続リーチ変動パターンにおいて、リーチ態様となるまでの演出図柄210a、210b、210cの変動表示パターンは複数パターン設けられており、変動表示パターンごとに、演出図柄210a、210b、210cの仮停止表示の回数、換言すれば、演出図柄210a、210b、210cの変動表示回数が異なっている。この変動表示パターンは、変動モードコマンドによって決定され、演出図柄210a、210b、210cの仮停止表示(変動表示)の回数が多くなるほど、最終的に大当たりの当選が報知される可能性(以下「信頼度」という)が高くなるように、大当たり当選時およびハズレ時における変動モードコマンドの選択比率が設定されている。
具体的には、大役抽選の結果が大当たりであった場合には、変動表示回数の多い変動モードコマンドの選択比率が、変動表示回数の少ない変動モードコマンドの選択比率よりも高く設定されており、大役抽選の結果がハズレであった場合には、変動表示回数の少ない変動モードコマンドの選択比率が、変動表示回数の多い変動モードコマンドの選択比率よりも高く設定されている。
また、主制御基板300においては、擬似連続リーチ変動パターンの信頼度が、発展リーチ変動パターンの信頼度よりも高くなるように設定されている。したがって、演出図柄210a、210b、210cの仮停止表示(変動表示)の回数によって信頼度が示唆されることとなり、遊技者は、演出図柄210a、210b、210cがより多く仮停止表示(変動表示)されることを期待しながら、演出の行方を見守ることとなる。
上記した変動演出の実行パターンは、主制御基板300で決定された変動コマンドに基づいて、副制御基板330において決定、実行制御される。つまり、変動演出の実行パターンは、主制御基板300と副制御基板330とで協働して決定されると言える。
図66は、演出参考例に係る変動演出決定テーブルを説明する図であり、図66(a)には前半変動演出決定テーブルを示し、図66(b)には後半変動演出決定テーブルを示す。上記したように、主制御基板300において大役抽選が行われると、大役抽選の結果に基づいて、変動コマンドが決定され、決定された各コマンドが副制御基板330に送信される。副制御基板330においては、変動モードコマンドを受信すると、0~249の範囲から1の演出乱数を取得するとともに、前半変動演出決定テーブルを参照して、取得した演出乱数と、受信した変動モードコマンドとに基づいて、前半の変動演出の実行パターンを決定する。また、変動パターンコマンドを受信すると、0~249の範囲から1の演出乱数を取得するとともに、後半変動演出決定テーブルを参照して、取得した演出乱数と、受信した変動パターンコマンドとに基づいて、後半の変動演出の実行パターンを決定する。なお、図66においては、前半変動演出決定テーブルおよび後半変動演出決定テーブルの一部のみを抽出して示している。
図66に示すように、前半変動演出決定テーブルによれば、変動モード番号(変動モードコマンド)ごとに、前半の変動演出の実行パターンについての選択比率がそれぞれ設定され、後半変動演出決定テーブルによれば、変動パターン番号(変動パターンコマンド)ごとに、後半の変動演出の実行パターンについての選択比率がそれぞれ設定されている。そして、決定された前半および後半の変動演出の実行パターンを組み合わせて実行することで、1回の変動演出が実行されることとなる。
リーチなし変動パターンの変動演出は、前半の実行パターンとして、前半の変動演出を実行しないことを示す「なし」が決定され、後半の実行パターンとして、リーチなし変動パターンに対応する「ノーマルハズレ1」、「ノーマルハズレ2」、「特殊ハズレ1」、「特殊ハズレ2」が決定された場合に実行される。例えば、前半の変動演出が実行されないことを示す「01H」の変動モード番号に対応する変動モードコマンドを受信すると、副制御基板330では、必ず、前半の実行パターンとして「なし」が決定される。また、このとき、同時に受信し得る変動パターンコマンドには、「ノーマルハズレ1」、「ノーマルハズレ2」、「特殊ハズレ1」、「特殊ハズレ2」のいずれかのみが決定されるように、後半変動演出決定テーブルにおいて選択比率の設定がなされている。したがって、前半の実行パターンとして「なし」が決定され、後半の実行パターンとして「ノーマルハズレ1」、「ノーマルハズレ2」、「特殊ハズレ1」、「特殊ハズレ2」が決定されることで、変動演出の実行パターンは、上記のリーチなし変動パターンに決定されることとなる。
一方、リーチ変動パターンの変動演出は、前半の実行パターンとして「なし」以外が決定され、後半の実行パターンとして、いずれかのリーチ発展演出(図中、発展1~5で示す)が決定された場合に実行される。換言すれば、メイン演出表示部200aにおいて、リーチ変動パターンの変動演出が実行される場合には、必ず、変動モード番号=01H以外の変動モード番号に対応する変動モードコマンドを受信しており、発展1~5のいずれかが決定される変動パターン番号に対応する変動パターンコマンドを受信していることとなる。
ここで、図66(a)において、前半の実行パターンにおける「ノーマルリーチ1」や「ノーマルリーチ2」等は、それぞれ、ノーマルリーチ変動パターンの変動演出のうち、演出図柄210a、210b、210cがリーチ態様になるまで、より詳細には、リーチ発展演出が開始されるまでの、メイン演出表示部200aに表示される背景画像や演出図柄210a、210b、210cの変動表示パターンを示している。これらの画像パターンは、変動モード番号に対応付けられた特別図柄の変動表示の時間と一致するように予め設計されており、例えば、「ノーマルリーチ1」が決定されると、図61(a)~(d)に示す画像がメイン演出表示部200aに表示されることとなる。
また、図66(a)において、前半の実行パターンにおける「擬似2a」等は、擬似連続リーチ変動パターンの変動演出のうち、リーチ発展演出が開始されるまでの、メイン演出表示部200aに表示される主変動演出画像の表示パターン、すなわち、演出図柄210a、210b、210cが変動表示される図柄表示演出の実行パターンを示している。例えば、「擬似2a」は、演出図柄210a、210b、210cの変動表示回数が2回である「擬似2」の擬似連続リーチ変動パターンであって、主変動演出画像が表示パターンaであることを示している。また、「擬似3b」は、演出図柄210a、210b、210cの変動表示回数が3回である「擬似3」の擬似連続リーチ変動パターンであって、主変動演出画像が表示パターンbであることを示している。
なお、図66に示す前半変動演出決定テーブルおよび後半変動演出決定テーブルにおいては、リーチなし変動パターンおよびノーマルリーチ変動パターンの変動演出は、大役抽選の結果がハズレであった場合にのみ実行されるように、選択比率の設定がなされている。また、発展リーチ変動パターンおよび擬似連続リーチ変動パターンは、ハズレ時および大当たり時の双方で決定されるが、発展リーチ変動パターンは、擬似連続リーチ変動パターンよりも、ハズレ時の選択比率が高く、大当たり時の選択比率が低く設定されている。このように、ハズレ時と大当たり時とで選択比率を設定することにより、擬似連続リーチ変動パターンは、発展リーチ変動パターンよりも、信頼度が高く設定されることとなる。
さらに、擬似連続リーチ変動パターンの中でも、擬似回数が多くなるほど、大当たり時の選択比率が高く、ハズレ時の選択比率が低く設定されており、擬似回数が多くなるほど、信頼度が高くなるように設定がなされている。
以上のように、変動演出決定テーブルにより、変動演出の大まかな流れが決定されるが、変動演出の開始時には、変動モードコマンドまたは変動パターンコマンドに基づいて、変動演出を構成するさまざまな要素演出の実行可否および実行パターンがさらに決定される。ここで、要素演出というのは、例えば、上記のように、メイン演出表示部200aにおける演出図柄210a、210b、210cの変動表示や、リーチ発展演出でメイン演出表示部200aに表示される発展画像、さらには、演出役物装置202を可動させる演出等、変動演出を構成する全ての演出をいう。実施例では、変動演出を構成する要素演出として、変動演出中のさまざまなタイミングで予告演出(示唆演出)が実行される。
この予告演出というのは、変動演出の開始時や、擬似連続リーチ変動パターンの変動演出における演出図柄210a、210b、210cの再変動表示時、さらには、リーチ発展演出中等に、メイン演出表示部200aに所定の画像を表示したり、所定のタイミングで演出役物装置202を可動したりする演出であり、予告演出ごとに、その実行可否や実行パターンが決定される。各予告演出には、それぞれ実行パターンが複数種類設けられ、複数種類の実行パターンそれぞれについて、変動パターンコマンドや変動モードコマンドごとに、換言すれば、大当たりの当選可否ごとに選択比率が設定され、この選択比率によって、実行パターンごとに期待値が設定されている。
以上説明したように、副制御基板330においては、変動コマンドを受信すると、変動演出の実行パターンや各要素演出の実行可否、実行パターンが決定され、特別図柄の変動表示中に変動演出が実行されることとなる。このように、変動演出は、1回の特別図柄の変動表示に対して1回行われるが、実施例では、複数回の特別図柄の変動表示に跨る演出も実行される。
図67は、演出参考例に係る保留表示演出の一例を説明する図である。メイン演出表示部200aの下部には保留表示領域211が設けられる。図60~図65では図示を省略したが、保留表示領域211は、変動演出中や遊技の待機中もメイン演出表示部200aに常時表示されている。そして、変動演出中は、この保留表示領域211において保留表示演出が行われる。保留表示演出では、大役抽選の際に処理領域(第0記憶部)に読み出された保留を示す当該保留表示212a、第1特図保留記憶領域の第1記憶部~第4記憶部に記憶されている保留をそれぞれ示す、第1保留表示212b、第2保留表示212c、第3保留表示212d、第4保留表示212eが保留表示領域211に表示される。なお、以下では、当該保留表示212aおよび第1保留表示212b~第4保留表示212eを総称して、保留表示212と呼ぶ。
例えば、特別図柄の変動表示中であって、しかも、メインRAM300cに4つの特1保留が記憶されている場合には、図67(a)に示すように、当該保留表示212a、第1保留表示212b~第4保留表示212eの合計5つの保留表示212が保留表示領域211に表示される。そして、この状態から、特別図柄の変動表示が終了し、第1記憶部に記憶されている特1保留が処理領域(第0記憶部)に読み出されて大役抽選が行われるとともに、メインRAM300cの保留シフト処理が実行されると、図67(b)に示すように、当該保留表示212aが消去されるとともに、第1保留表示212b~第4保留表示212eが1つ左に移動表示される。また、さらにこの状態から次なる特1保留が読み出されると、図67(c)に示すように、さらに各保留表示212が移動表示される。このように、保留表示演出は、メインRAM300cに記憶されている特1保留数を遊技者に報知する演出となっている。
また、保留表示212の表示パターンは複数設けられており、表示パターンごとに表示色を異ならせている。主制御基板300においては、保留が記憶されたときに取得時演出判定処理(ステップS536)が実行され、新たに記憶された保留が第0記憶部に読み出された際に決定される変動情報を示す先読み指定コマンドを副制御基板330に送信する。副制御基板330においては、先読み指定コマンドを受信すると、当該受信コマンドに基づいて、新たに記憶された保留に対応する保留表示212の表示パターンを決定する。このとき、先読み指定コマンドごとに、つまり、新たに記憶された保留が大役抽選で読み出された際に決定される変動情報ごとに、各表示パターンの選択比率が設定されている。つまり、大当たりの当選可否や、変動演出の実行パターンに応じて各表示パターンの選択比率が設定されていることから、保留表示212の表示パターンによって、大当たりの信頼度(期待値)が示唆されることとなる。
図68(a)は最終保留表示パターン決定テーブルを説明する図であり、図68(b)は1つ前保留表示パターン決定テーブルを説明する図である。上記したように、主制御基板300における取得時演出判定処理では、新たに記憶された保留が読み出された際に決定される変動モード番号および変動パターン番号を示す先読み指定コマンドを副制御基板330に送信する。つまり、先読み指定コマンドは、保留が読み出されたときに決定される変動モード番号および変動パターン番号を副制御基板330に伝達するコマンドである。最終保留表示パターン決定テーブルによれば、先読み指定コマンド(変動パターン番号)ごとに、保留表示212の表示パターンの選択比率がそれぞれ設定されており、先読み指定コマンドを受信すると、保留表示212の最終の表示パターン、すなわち、当該保留表示212aの最終的な表示パターンが決定される。
図68(a)に示す最終保留表示パターン決定テーブルによれば、「デフォルト(白)」、「点滅」、「青」、「黄」、「緑」、「黒」「赤」、「プレミア(虹)」の8種類の表示パターンのいずれかが決定される。そして、当該保留表示212aの最終的な表示パターンが決定されると、それ以前に表示される保留表示212の表示パターンが、図68(b)に示す1つ前保留表示パターン決定テーブルを参照して決定される。この1つ前保留表示パターン決定テーブルによれば、保留表示212の表示パターンごとに、移動表示前に表示する保留表示212の表示パターンの選択比率が設定されている。
例えば、主制御基板300において、第1特図保留記憶領域の第2記憶部に保留が記憶された場合に、最終保留表示パターン決定テーブルを参照して、当該保留表示212aの最終的な表示パターンが決定されたとする。この場合には、次に、第1保留表示212bの表示パターンを、1つ前保留表示パターン決定テーブルを参照して決定する。このとき、第1保留表示212bの表示パターンは、先に決定された当該保留表示212aの最終的な表示パターンに基づいて決定される。例えば、当該保留表示212aの最終的な表示パターンが「青」であった場合、1つ前保留表示パターン決定テーブルによれば、第1保留表示212bの表示パターンとして、「点滅」が200/250の確率で決定され、「青」が50/250の確率で決定され。
このようにして、第1保留表示212bの表示パターンが決定されると、次に、先に決定された第1保留表示212bの表示パターンに基づいて、再び、1つ前保留表示パターン決定テーブルを参照して、第2保留表示212cの表示パターンが決定される。
以上のように、保留が記憶されると、まず、当該保留表示212aの最終的な表示パターンが決定され、その後、決定された当該保留表示212aの最終的な表示パターンに基づいて、第1保留表示212bの表示パターンが決定される等、表示順序を逆方向に遡るように、表示パターンが順次決定されることとなる。なお、1つ前保留表示パターン決定テーブルによれば、先に決定されている保留表示212の表示パターンと同じか、もしくは、信頼度の低い表示パターンのみが決定されるように、選択比率が設定されている。
上記のように、保留表示演出では、保留表示212について、所定の遊技利益の付与に対する期待値が異なる複数の表示パターンが設けられている。そして、保留表示212は、メイン演出表示部200aに最初に表示されてから最終的に消去されるまでの間、1の表示パターンで表示される場合もあれば、表示期間中に表示パターンが変化する場合もある。
演出参考例において、保留表示212の表示パターンの変化が生じるタイミングは、新たに記憶された特1保留(以下、対象保留ともいう)が、第1保留表示212b~第3保留表示212dに移動表示されたタイミングと、対象保留に係る対象変動演出中とに大別される。
次に、上記の変動演出を実行するための副制御基板330における処理について説明する。なお、以下では、副制御基板330における処理のうち、変動演出と関係のない処理については説明を省略する。
(副制御基板330のサブCPU初期化処理)
図69は、演出参考例に係る副制御基板330のサブCPU初期化処理(S1000)を説明するフローチャートである。
(ステップS1000-1)
サブCPU330aは、電源投入に応じて、サブROM330bからCPU初期化処理プログラムを読み込むとともに、サブRAM330cに記憶されるフラグ等の初期化、設定処理を行う。
(ステップS1000-3)
次に、サブCPU330aは、各演出乱数を更新する処理を行うとともに、以後は、割込み処理が行われるまで当該ステップS1000-3の処理を繰り返し行う。なお、演出乱数は複数種類設けられており、ここでは、それぞれの演出乱数が非同期的に更新されている。
(副制御基板330のサブタイマ割込み処理)
図70は、演出参考例に係る副制御基板330のサブタイマ割込み処理(S1100)を説明するフローチャートである。副制御基板330には、所定の周期(1秒間に30回)でクロックパルスを発生するリセット用クロックパルス発生回路(不図示)が設けられている。そして、このリセット用クロックパルス発生回路によるクロックパルスの発生により、サブCPU330aはタイマ割込み処理プログラムを読み込んで当該サブタイマ割込み処理を開始する。
(ステップS1100-1)
サブCPU330aは、レジスタを退避する。
(ステップS1100-3)
サブCPU330aは、割込みを許可するための処理を行う。
(ステップS1100-5)
サブCPU330aは、副制御基板330で用いられる各種タイマカウンタの更新処理を行う。ここで、各種タイマカウンタは、特に断る場合を除き、当該副制御基板330のサブタイマ割込み処理の度に1ずつ減算され、0になると減算を停止する。
(ステップS1200)
サブCPU330aは、サブRAM330cの受信バッファに格納されているコマンドを解析するとともに、受信したコマンドに応じた種々の処理を行う。副制御基板330においては、主制御基板300からコマンドが送信されると、コマンド受信割込み処理が行われ、主制御基板300から送信されたコマンドが受信バッファに格納される。ここでは、コマンド受信割込み処理によって受信バッファに格納されたコマンドを解析することとなる。
(ステップS1100-7)
サブCPU330aは、タイムテーブルを参照して、当該タイムテーブルに記憶された該当時間に対応する処理を実行するタイムスケジュール管理処理を行う。ここでは、タイムテーブルにセットされたタイムデータに基づいて、各種のフラグをオン、オフしたり、あるいは、各演出デバイスにコマンドを送信したりすることで、変動演出や大役演出をはじめとする各演出の実行を制御することとなる。
(ステップS1100-9)
サブCPU330aは、レジスタを復帰して当該サブタイマ割込み処理を終了する。
図71は、上記コマンド解析処理のうち、先読み指定コマンドを受信した際に実行される演出参考例に係る先読み指定コマンド受信処理を説明するフローチャートである。上記したとおり、先読み指定コマンド(先読み指定変動パターンコマンド)は、主制御基板300において、取得時演出判定処理(図33のステップS536-21、ステップS536-25、ステップS536-27)でセットされた後、サブコマンド送信処理(図23のステップS100-65)によって副制御基板330に送信される。
(ステップS1210-1)
サブCPU330aは、まず、受信した先読み指定コマンドを解析する。
(ステップS1210-3)
サブCPU330aは、上記ステップS1210-1の解析結果に基づいて、事前判定情報を記憶する。なお、副制御基板330のサブRAM330cには、主制御基板300の第1特図保留記憶領域に対応する第1事前判定情報記憶部と、第2特図保留記憶領域に対応する第2事前判定情報記憶部とが設けられている。第1事前判定情報記憶部は第1記憶部~第4記憶部の4つの記憶部を備えている。これら第1事前判定情報記憶部の第1記憶部~第4記憶部は、第1特図保留記憶領域の第1記憶部~第4記憶部にそれぞれ対応している。同様に、第2事前判定情報記憶部は第1記憶部~第4記憶部の4つの記憶部を備えており、これら第2事前判定情報記憶部の第1記憶部~第4記憶部は、第2特図保留記憶領域の第1記憶部~第4記憶部にそれぞれ対応している。ここでは、主制御基板300の第1特図保留記憶領域または第2特図保留記憶領域の第1記憶部~第4記憶部のうち、新たに保留が記憶された記憶部に対応する記憶部に事前判定情報が記憶される。
(ステップS1210-5)
サブCPU330aは、保留表示212の最終の表示パターンを決定する最終保留表示パターン決定処理を行う。ここでは、受信した先読み指定コマンドに基づき、最終保留表示パターン決定テーブル(図68(a))を参照し、当該保留表示212aの最終の表示パターンを決定して記憶する。
(ステップS1210-7)
サブCPU330aは、保留が記憶された記憶部に基づいて、保留表示212の表示パターンを決定する回数、すなわち保留表示212の変化タイミングを導出し、導出した回数だけ、1つ前保留表示パターン決定テーブル(図68(b))を参照して、保留表示212の表示パターンを決定する。そして、決定した保留表示212の表示パターン情報を所定の記憶部に記憶し、ステップS1210-9に処理を移す。
(ステップS1210-9)
サブCPU330aは、上記ステップS1210-5およびステップS1210-7の決定に基づいて、保留表示212の表示を開始させる保留表示開始処理を行い、当該先読み指定コマンド受信処理を終了する。これにより、保留が記憶されたときに、対応する保留表示212の表示が開始されることとなる。
図72は、演出参考例に係る上記コマンド解析処理のうち、変動コマンドを受信した際に実行される変動コマンド受信処理を説明するフローチャートである。上記したとおり、変動コマンドは、主制御基板300において、特別図柄変動番号決定処理(図39のステップS612-13、S612-17)でセットされた後、サブコマンド送信処理(図23のステップS100-65)によって副制御基板330に送信される。
(ステップS1220-1)
変動コマンドを受信すると、サブCPU330aは、まず、受信した変動パターンコマンドを解析して、記憶する。
(ステップS1220-3)
サブCPU330aは、上記ステップS1000-3で更新された演出乱数(0~249)を取得し、当該取得した演出乱数および上記ステップS1220-1における解析結果に基づいて、後半の変動演出の実行パターンを決定、記憶する。
(ステップS1220-5)
サブCPU330aは、受信した変動モードコマンドを解析して、記憶する。
(ステップS1220-7)
サブCPU330aは、上記ステップS1000-3で更新された演出乱数(0~249)を取得し、当該取得した演出乱数および上記ステップS1220-5における解析結果に基づいて、前半の変動演出の実行パターンを決定、記憶する。
(ステップS1220-9)
サブCPU330aは、上記ステップS1000-3で更新された演出乱数(0~249)を予告演出ごとに取得し、当該取得した演出乱数および上記ステップS1220-1、ステップS1220-5における解析結果に基づいて、各予告演出決定テーブルを参照して、各予告演出の実行有無ならびに実行パターンを決定、記憶する。
(ステップS1220-11)
サブCPU330aは、事前判定情報記憶部に記憶されている事前判定情報をシフトするシフト処理を実行する。ここでは、特1保留に基づく変動演出を開始する場合には、第1事前判定情報記憶部の第4記憶部~第2記憶部に記憶されている事前判定情報を、それぞれ第1事前判定情報記憶部の第3記憶部~第1記憶部にシフトし、特2保留に基づく変動演出を開始する場合には、第2事前判定情報記憶部の第4記憶部~第2記憶部に記憶されている事前判定情報を、それぞれ第2事前判定情報記憶部の第3記憶部~第1記憶部にシフトする。
(ステップS1220-13)
サブCPU330aは、保留表示212を移動表示させる保留表示シフト処理を行う。また、ここでは、保留表示212の表示パターンが変化する場合には、所定のタイミングで表示パターンを変化させるための実行データをセットする。
(ステップS1220-15)
サブCPU330aは、上記各ステップの決定に基づいてタイムテーブルのタイムデータをセットして、当該変動コマンド受信処理を終了する。なお、ここでセットされたタイムテーブルに基づき、上記ステップS1100-7において、変動演出用の画像をメイン演出表示部200aに表示する処理や、音声出力処理、演出照明装置204の点灯制御処理等の演出実行制御がなされることとなる。
<スロットマシン400>
図73および図74の外観図に示すように、遊技機としてのスロットマシン400は、前面が開口した筐体402と、筐体402の前面一端に回動可能に上下に並んで配置される前面上扉404および前面下扉406とが設けられている。前面上扉404の下部略中央には、ガラス板や透明樹脂板等で構成された無色透明の図柄表示窓408が設けられており、筐体402内の図柄表示窓408に対応する位置には、3つのリール410(左リール410a、中リール410b、右リール410c)が、それぞれ独立して回動可能に設けられている。左リール410a、中リール410b、右リール410cの外周面には、図75(a)の図柄配列に示すように、20に等分された各領域に複数種類の図柄がそれぞれ配列されており、遊技者は、図柄表示窓408を通じて、上段、中段、下段に位置する、左リール410a、中リール410b、右リール410cそれぞれの3つの連続する合計9個の図柄を視認することができる。
前面下扉406の上部には操作部設置台412が形成され、操作部設置台412には、メダル投入部414、ベットスイッチ416、スタートスイッチ418、ストップスイッチ420、演出スイッチ422等が設けられている。メダル投入部414は、メダル投入口414aを通じて遊技価値としてのメダルの投入を受け付ける。ベットスイッチ416は、スロットマシン400の内部に電気的に貯留(以下、単にクレジットという)されているメダルのうち、1遊技で必要とされる規定数のメダルを投入(ベット)する。
スタートスイッチ418は、例えば傾倒操作を検出可能なレバーで構成され、遊技者による遊技の開始操作を検出する。ストップスイッチ420(ストップスイッチ420a、ストップスイッチ420b、ストップスイッチ420c)は、左リール410a、中リール410b、右リール410cそれぞれに対応して設けられており、遊技者の停止操作を検出する。なお、ストップスイッチ420の停止操作が可能な状態で、遊技者が、ストップスイッチ420a、ストップスイッチ420b、ストップスイッチ420cのいずれかを最初に停止操作することを第1停止といい、第1停止の後、停止操作されていない2つのストップスイッチ420のいずれかを停止操作することを第2停止といい、第2停止の後、最後に残ったストップスイッチ420を停止操作することを第3停止という。演出スイッチ422は、例えば、押圧スイッチと、その周囲に回転自在に配されたジョグダイヤルスイッチとから構成され、遊技者の押圧操作や回転操作を検出する。
前面上扉404の上部略中央には、演出に伴う様々な画像を表示する液晶表示部424が設けられている。また、前面上扉404の上部や左右には、例えば高輝度の発光ダイオード(LED)によって構成される演出用ランプ426が設けられる。また、前面上扉404の裏面における液晶表示部424の左右位置や前面下扉406の裏面における左右位置には、効果音や楽音等による聴覚的な演出を行うスピーカ428が設けられている。
操作部設置台412には、メインクレジット表示部430およびメイン払出表示部432が設けられている。また、図柄表示窓408と操作部設置台412との間には、サブクレジット表示部434およびサブ払出表示部436が設けられている。これらメインクレジット表示部430およびサブクレジット表示部434にはクレジットされているメダルの枚数(クレジット枚数)が表示され、メイン払出表示部432およびサブ払出表示部436にはメダルの払出枚数が表示される。
筐体402内におけるリール410の下方には、メダル排出口440aからメダルを払い出すためのメダル払出装置(メダルホッパー)442が設けられている。また、前面下扉406の前面下部には、メダル排出口440aから払い出されたメダルを貯留するための受け皿部440が設けられている。また、筐体402内には、電源スイッチ444が設けられている。電源スイッチ444は、スロットマシン400を管理する管理者が操作し、電源の切断状態と電源の投入状態の2つの状態を切り換えるために用いられる。
また、筐体402内には、後述する主制御基板500に、図示しない設定ドアキーおよび設定変更スイッチ(これらを合わせて設定値設定手段という)が設けられている。スロットマシン400では、設定ドアキーに所定の鍵(操作キー)が挿入されてOFFの位置からONの位置へ回転された状態で電源スイッチ444を介して電源が投入されると設定変更モードに移行し、設定値の変更(単に設定変更ともいう)が可能な状態となる。設定値は、遊技者の有利度合(機械割)を段階的に示したものであり、例えば、1~6の6段階で表され、一般に、設定値の数値が大きいほど遊技全体として有利度合が高い(期待獲得枚数が高い)ように設定されている。そして、設定変更が可能な状態において設定変更スイッチが押下される度に設定値が1ずつ加算され、例えば、6段階の設定値のうちのいずれかの設定値に変更され、スタートスイッチ418が操作されると、設定値が確定し、設定ドアキーを元の位置(OFFの位置)に戻すことで設定変更モードが終了して遊技が可能となる。なお、設定変更は、電源スイッチ444が操作されて電源の投入状態となってから一定期間のみ可能となっている。
スロットマシン400では、遊技が開始可能となり、規定数のメダルがベットされると、有効ラインAが有効化するとともに、スタートスイッチ418に対する操作が有効となる。ここで、ベットは、ベットスイッチ416の操作を通じてクレジットされているメダルを投入する場合と、メダル投入部414を通じてメダルを投入する場合と、詳しくは後述するリプレイ役が有効ラインA上に表示されたことに基づいてメダルを自動投入する場合のいずれも含む。また、有効ラインAは、当選役の入賞を判定するためのラインであり、本実施形態では1本である。有効ラインAは、図75(b)に示すように、図柄表示窓408に臨む9つの図柄(3リール×上中下の3段)のうち、左リール410aの中段、中リール410bの中段、右リール410cの上段に停止する図柄に対応する位置を結んだラインに設定されている。無効ラインは、有効ラインA上に表示された図柄組み合わせのみでは当選役を把握しにくい場合に、当選役の把握を容易にする他の図柄組み合わせを表示する、当選役の入賞判定には用いられない有効ラインA以外のラインであり、本実施形態では、図75(b)に示す5つの無効ラインB1、B2、B3、C1、C2を想定している。
そして、遊技者によりスタートスイッチ418が操作されると、遊技が開始され、左リール410a、中リール410b、右リール410cが回転されるとともに、当選種別抽選等が実行される。その後、ストップスイッチ420a、420b、420cの操作に応じて、対応する左リール410a、中リール410b、右リール410cをそれぞれ停止させる。そして、当選種別抽選の抽選結果および有効ラインAに表示された図柄の組み合わせによって、メダルの払い出しを受け得る当選役が入賞した場合にはメダルの払い出しが実行され、メダルの払い出しを受け得る当選種別に不当選であった場合または当選したが入賞しなかった場合には左リール410a、中リール410b、右リール410cが全て停止したことをもって、遊技が終了する。
なお、本実施形態において、上記1遊技は、メダル投入部414を通じたメダルの投入、ベットスイッチ416の操作を通じたクレジットされているメダルの投入、または、リプレイ役が有効ラインA上に表示されたことに基づくメダルの自動投入のいずれかが行われてから、遊技者によるスタートスイッチ418の操作に応じて、左リール410a、中リール410b、右リール410cが回転制御されるとともに当選種別抽選が実行され、当選種別抽選の抽選結果および遊技者による複数のストップスイッチ420a、420b、420cの操作に応じて、操作されたストップスイッチ420a、420b、420cに対応する左リール410a、中リール410b、右リール410cがそれぞれ停止制御され、メダルの払い出しを受け得る当選役が入賞した場合、そのメダルの払い出しが実行されるまでの遊技をいう。また、メダルの払い出しを受け得る当選種別に不当選であった場合または当選したが入賞しなかった場合、左リール410a、中リール410b、右リール410cが全て停止したことをもって1遊技が終了する。ただし、1遊技の開始を、上記のメダルの投入、または、リプレイ役の当選の代わりに、遊技者によるスタートスイッチ418の操作と読み替えてもよい。また、かかる1遊技が繰り返される数を遊技数とする。
図76は、スロットマシン400の概略的な電気的構成を示したブロック図である。図76に示すように、スロットマシン400は、遊技の進行を制御する主制御基板500(主制御部)と、遊技の進行に応じた演出を制御する副制御基板502(副制御部)とを含む制御基板が設けられている。また、主制御基板500と副制御基板502との間の電気的な信号の伝達は、不正防止等の観点から、主制御基板500から副制御基板502への一方向のみに制限される。
(主制御基板500)
主制御基板500は、中央処理装置であるメインCPU500a、プログラム等が格納されたメインROM500b、ワークエリアとして機能するメインRAM500c等を含む半導体集積回路を有し、スロットマシン400全体を統括的に制御する。なお、メインRAM500cは、電源が切断された場合においても、設定変更が行われてRAMクリアが実行されない限り、データが消去されることなく保持される。
また、主制御基板500は、メインCPU500aが、メインROM500bに格納されたプログラムに基づきメインRAM500cと協働することで機能する、初期化手段600、ベット手段602、当選種別抽選手段604、リール制御手段606、判定手段608、払出制御手段610、遊技状態制御手段612、演出状態制御手段614、コマンド送信手段616等の機能部を有する。
主制御基板500では、メダル投入口414aへのメダルの投入を検出する投入メダル検出部414b、ベットスイッチ416、スタートスイッチ418およびストップスイッチ420a、420b、420cから各種の検出信号を受信しており、受信した検出信号に基づいて、メインCPU500aが種々の処理を実行する。
初期化手段600は、主制御基板500における初期化処理を実行する。ベット手段602は、遊技に使用するためのメダルをベットする。当選種別抽選手段604は、スタートスイッチ418の操作に基づき、詳しくは後述するように、当選役の当否、より詳しくは、当選役が含まれる当選種別の当否を決定する当選種別抽選を行う。
リール制御手段606は、スタートスイッチ418の操作に応じて、左リール410a、中リール410b、右リール410cを回転制御し、回転している左リール410a、中リール410b、右リール410cにそれぞれ対応したストップスイッチ420a、420b、420cの操作に応じて、対応する左リール410a、中リール410b、右リール410cを停止制御する。また、リール制御手段606は、スタートスイッチ418の操作に応じて、前回の遊技においてストップスイッチ420a、420b、420cの操作を有効化してから、当選種別抽選の抽選結果を表示するために遊技者によるストップスイッチ420a、420b、420cの操作を有効化するまで(前回の遊技におけるストップスイッチ420a、420b、420cの操作完了により無効化されている)の時間を規定の時間より延長し、その間、リール410a、410b、410cを多彩な態様で回転させるリール演出(フリーズ演出)を行う場合がある。リール演出は、本来有効となるべき任意のスイッチを所定時間有効にしなかったり、本来実行されるべき処理を所定時間保留したり、本来送受信されるべき任意のスイッチの信号を所定時間送信または受信させなかったりすることで実現できる。
また、主制御基板500には、リール駆動制御部450が接続されている。このリール駆動制御部450は、スタートスイッチ418の操作信号に応じ、リール制御手段606から送信される、左リール410a、中リール410b、右リール410cの回転開始信号に基づいて、ステッピングモータ452を駆動する。また、リール駆動制御部450は、ストップスイッチ420の操作信号に応じ、リール制御手段606から送信される、左リール410a、中リール410b、右リール410cそれぞれの停止信号および回転位置検出回路454の検出信号に基づいて、ステッピングモータ452の駆動を停止する。
判定手段608は、当選役に対応する図柄組み合わせが有効ラインA上に表示されたか否か判定する。ここで、当選役に対応する図柄組み合わせが有効ラインA上に表示されることを単に入賞という場合がある。払出制御手段610は、当選役に対応する図柄組み合わせが有効ラインA上に表示されたこと(入賞したこと)に基づいて、当該当選役に対応する数(価値量)だけメダルを払い出す。また、主制御基板500には、メダル払出装置442が接続されており、払出制御手段610は、メダルの払出枚数を計数しながらメダルを排出する。
遊技状態制御手段612は、当選種別抽選の結果や判定手段608の判定結果を参照し、複数種類の遊技状態のいずれかに遊技状態を移行させる。また、演出状態制御手段614は、当選種別抽選の結果、判定手段608の判定結果、遊技状態の遷移情報を参照し、複数種類の演出状態のいずれかに演出状態を移行させる。
コマンド送信手段616は、ベット手段602、当選種別抽選手段604、リール制御手段606、判定手段608、払出制御手段610、遊技状態制御手段612、演出状態制御手段614等の動作に伴う、遊技に関するコマンドを順次決定し、決定したコマンドを副制御基板502に順次送信する。
また、主制御基板500には、乱数発生器(乱数生成手段)500dが設けられる。乱数発生器500dは、計数値を順次インクリメントし、所定の数値範囲内でループさせ、所定の時点における計数値を抽出することで乱数を得る。主制御基板500の乱数発生器500dによって生成される乱数(以下、当選種別抽選乱数という)は、遊技者に付与する遊技利益、例えば、当選種別抽選手段604が当選種別を決定するために用いられる。
(副制御基板502)
また、副制御基板502は、主制御基板500と同様に、中央処理装置であるサブCPU502a、プログラム等が格納されたサブROM502b、ワークエリアとして機能するサブRAM502c等を含む各種半導体集積回路を有し、主制御基板500からのコマンドに基づき、特に演出を制御する。また、サブRAM502cにもメインRAM500c同様、不図示のバックアップ電源が接続されており、電源が切断された場合においても、データが消去されることなく保持される。なお、副制御基板502にも、主制御基板500同様、乱数発生器(乱数生成手段)502dが設けられており、乱数発生器502dによって生成される乱数(以下、演出抽選乱数という)は、主に演出の態様を決定するために用いられる。
また、副制御基板502では、サブCPU502aが、サブROM502bに格納されたプログラムに基づき、サブRAM502cと協働することで機能する、初期化決定手段630、コマンド受信手段632、演出制御手段634等の機能部を有する。
初期化決定手段630は、副制御基板502における初期化処理を実行する。コマンド受信手段632は、主制御基板500等、他の制御基板からのコマンドを受信し、コマンドに対する処理を行う。演出制御手段634は、演出スイッチ422から検出信号を受信するとともに、受信されたコマンドに基づいて液晶表示部424、スピーカ428、演出用ランプ426の各デバイスで行われる遊技の演出を決定する。具体的に、演出制御手段634は、液晶表示部424に表示される画像データや、演出用ランプ426、サブクレジット表示部434、サブ払出表示部436等の電飾機器を通じた演出のための電飾データを決定するとともに、スピーカ428から出力すべき音声を構成する音声データを決定する。そして、演出制御手段634は、決定した遊技の演出を実行する。なお、演出には、補助演出も含まれる。補助演出は、当選種別抽選において、正解役(特定の役)と不正解役とが重複した選択当選種別に当選したときに、その正解役の入賞条件となるストップスイッチ420a、420b、420cの正解操作態様を報知する演出である。かかる補助演出により、遊技者は、正解役に対応する図柄組み合わせを、遊技者が有効ラインA上に容易に表示させることができる。かかる補助演出を実行する演出状態をAT(アシストタイム)演出状態という。また、AT演出状態とリプレイ役の当選確率が高いRT(リプレイタイム)遊技状態が並行して進行される所謂ART遊技状態を用いることもある。
なお、以下では、液晶表示部424、演出用ランプ426、スピーカ428、サブクレジット表示部434、サブ払出表示部436といった、副制御基板502を含む、主制御基板500以外の基板で管理される報知手段を他報知手段という場合がある。これに対し、メインクレジット表示部430、メイン払出表示部432といった、主制御基板500で管理される報知手段を主報知手段(指示モニタ)という場合がある。また、補助演出を実行可能な主報知手段および他報知手段を合わせて補助演出実行手段という場合もある。演出状態制御手段614は、AT演出状態において、補助演出を補助演出実行手段に実行させる。
(主制御基板500で用いられるテーブル)
図77は、当選役を説明するための説明図であり、図78および図79は、当選種別抽選テーブルを説明するための説明図である。
スロットマシン400においては、詳しくは後述するように、複数種類の遊技状態および演出状態が設けられており、遊技の進行に応じて遊技状態および演出状態が移行される。そして、主制御基板500では、遊技状態制御手段612により管理、制御される遊技状態に対応する複数の当選種別抽選テーブル等がメインROM500bに格納されている。当選種別抽選手段604は、メインRAM500cに記憶された現在の設定値(遊技利益を得る容易性を段階的に示したもの)と現在の遊技状態に応じて、対応する当選種別抽選テーブルをメインROM500bから抽出し、抽出した当選種別抽選テーブルに基づき、スタートスイッチ418の操作信号に応じて取得された当選種別抽選乱数が当選種別抽選テーブル内のいずれの当選種別に対応するか判定する。
ここで、当選種別抽選テーブルで抽出される当選種別を構成する当選役には、リプレイ役、小役、ボーナス役が含まれる。リプレイ役は、リプレイ役に対応する図柄組み合わせが有効ラインA上に表示されると、遊技者によるメダルの新たなるベットを行わずして再度遊技を実行できる役である。小役は、その小役に対応する図柄組み合わせが有効ラインA上に表示されることにより、図柄組み合わせに応じて所定枚数のメダルの払い出しを受けることができる役である。また、ボーナス役は、そのボーナス役に対応する図柄組み合わせが有効ラインA上に表示されることにより、遊技状態制御手段612により管理される遊技状態をボーナス遊技状態(後述するRBB作動中遊技状態)に移行させることができる役である。
本実施形態における当選役は、図77に示すように、リプレイ役として、当選役「リプレイ1」~「リプレイ7」が設けられている。また、小役として、当選役「小役1」~「小役39」が設けられている。また、ボーナス役として、当選役「RBB」が設けられている。図77では、左リール410a、中リール410b、右リール410cそれぞれに、各当選役を構成する1または複数の図柄が対応付けられている。
ここで、本実施形態においては、遊技者によってストップスイッチ420が操作されたときに、入賞可能な当選役に対応する図柄組み合わせを構成する図柄が有効ラインA上にある場合には、リール制御手段606によって、当該図柄が有効ラインA上に停止するように停止制御がなされる。また、ストップスイッチ420が操作されたときに、入賞可能な当選役に対応する図柄組み合わせを構成する図柄が、有効ラインA上にはないが、リール410の回転方向と反対の方向の図柄4コマ分に相当する範囲(引込範囲)内に存在している場合には、リール制御手段606によって、離れている図柄数が滑りコマ数となり、当該当選役に対応する図柄組み合わせを構成する図柄を有効ラインA上に引き込むように滑りコマ数分回転を維持した後に停止するように停止制御がなされる。また、入賞可能な当選役に対応する図柄がリール410中に複数あり、いずれもリール410の引込範囲内に存在している場合には、予め定められた優先順位に従っていずれの図柄を有効ラインA上に引き込むか決定され、当該優先された図柄を有効ラインA上に引き込むように滑りコマ数分回転を維持した後に停止するように停止制御がなされる。なお、ストップスイッチ420が押圧操作されたときに、入賞可能な当選役以外の当選役に対応する図柄組み合わせを構成する図柄が有効ラインA上にある場合には、リール制御手段606によって、その図柄を有効ラインA上に停止させないようにする、所謂蹴飛ばし処理も並行して実行される。また、後述するように、当選種別に含まれる当選役に操作態様(操作順や操作タイミング)が入賞条件として設定されている場合、リール制御手段606は、遊技者の操作態様に応じて当選役に対応する図柄組み合わせを有効ラインA上に表示可能に停止制御する。
そして、例えば、当選役「リプレイ1」~「リプレイ4」、当選役「小役1」~「小役6」、「小役35」~「小役39」に対応する図柄組み合わせを構成する図柄は、各リール410において、上記の停止制御によって、必ず有効ラインA上に表示可能なように配列されている。このような当選役をPB=1と表す場合がある。一方、例えば、当選役「リプレイ5」~「リプレイ7」、当選役「小役7」~「小役34」、当選役「RBB」に対応する図柄組み合わせを構成する図柄は、各リール410において、上記の停止制御によって、必ずしも有効ラインA上に表示可能なように配列されていないので、所謂とりこぼしが発生する場合がある。このような当選役をPB≠1と表す場合がある。
図78および図79に示すように、当選種別抽選テーブルでは、複数の当選領域が区画されており、各遊技状態によって抽選の対象となる当選種別が異なったり、不当選(ハズレ)の有無が異なったりする。図78および図79では、各遊技状態(非内部遊技状態(非内部)、RBB内部中遊技状態(RBB内部中)、RBB作動中遊技状態(RBB作動中))毎に割り当てられた当選領域(当選種別)を「◎」や「○」で表しているが、実際には、複数の遊技状態それぞれに対応する当選種別抽選テーブルがメインROM500bに記憶されている。なお、「◎」は有利区間に移行させる抽選を行うことが可能な有利区間抽選可当選種別であることを示し、「○」は有利区間に移行させる抽選を行うことが不可な有利区間抽選不可当選種別であることを示している。
当選種別抽選テーブルでは、区画化された各当選領域にはそれぞれ当選範囲を示す数値である所定の置数(当選範囲値)と当選種別が対応付けられており、遊技状態毎に割り当てられた全ての当選領域の置数を合計すると当選種別抽選乱数の総数(65536)となる。したがって、当選種別それぞれが決定される確率は、当選領域に対応付けられた置数を当選種別抽選乱数の総数で除算した値となる。当選種別抽選手段604は、その時点の遊技状態に基づいて、当該当選種別抽選テーブルにおける複数の当選領域のうち番号の高い方から、順次、置数を取得し、その置数を当選種別抽選乱数から減算して、減算後の値が0未満となると、その時点の当選領域に対応付けられた当選種別を当選種別抽選の抽選結果としている。また、当選領域1以上の全ての当選領域の置数を当選種別抽選乱数から減算して、減算後の値が0以上となっていれば、当選領域0の当選種別「ハズレ」が当選種別抽選の抽選結果となる。
ここで、当選種別「RBB」を構成する当選役「RBB」について補足する。所定の第1種特別役物RBは、規定数ごとの入賞に係る図柄の組み合わせの数を増加させ、または規定数ごとの入賞に係る条件装置が作動する確率を上昇させる役物で、あらかじめ定められた場合に作動し、12回を超えない回数の遊技の結果が得られるまで作動を継続することができるものをいう。ここで、条件装置は、その作動が入賞、再遊技、役物または役物連続作動装置の作動に係る図柄の組み合わせが表示されるために必要な条件とされている装置で、当選種別抽選(遊技機内で行われる電子計算機によるくじ)に当選した場合に作動するもの、すなわち、当選フラグを意味する。そして、当選種別「RBB」を構成する第1種特別役物に係る役物連続作動装置(当選役「RBB」)は、第1種特別役物RBを連続して作動させることができる装置であり、特定の図柄の組み合わせが表示された場合に作動し、あらかじめ定められた場合に作動を終了するものをいう。
図78の当選種別抽選テーブルによれば、例えば当選領域0には、当選種別「ハズレ」が対応付けられており、かかる当選種別に当選すると、図77に示したいずれの当選役に対応する図柄組み合わせも有効ラインA上に表示されることはなく、メダルの払い出し等が行われることはない。ただし、後述するように、RBB内部当選フラグが次遊技に持ち越されている場合、当選種別「ハズレ」の当選により、当選役「RBB」に対応する図柄組み合わせを有効ラインA上に表示させることが可能となる。
また、当選領域1には、当選役「小役1」~「小役39」が重複して含まれる当選種別「小役ALL」が対応付けられており、当選領域2には、当選役「小役11」~「小役39」が重複して含まれる当選種別「1枚ALLA」が対応付けられており、当選領域3には、当選役「小役12」~「小役27」が重複して含まれる当選種別「1枚ALLB」が対応付けられている。また、当選領域4には、当選役「小役12」、「小役20」が重複して含まれる当選種別「択1枚1」が対応付けられ、当選領域5には、当選役「小役13」、「小役21」が重複して含まれる当選種別「択1枚2」が対応付けられ、当選領域6には、当選役「小役14」、「小役22」が重複して含まれる当選種別「択1枚3」が対応付けられ、当選領域7には、当選役「小役15」、「小役23」が重複して含まれる当選種別「択1枚4」が対応付けられている。また、当選領域8には、当選役「小役35」、「小役36」が重複して含まれる当選種別「弱チェリー」が対応付けられ、当選領域9には、当選役「小役37」~「小役39」が重複して含まれる当選種別「強チェリー」が対応付けられ、当選領域10には、当選役「小役7」、「小役8」、「小役11」が重複して含まれる当選種別「スイカA」が対応付けられ、当選領域11には、当選役「小役7」~「小役10」が重複して含まれる当選種別「スイカB」が対応付けられ、当選領域12には、当選役「小役1」、「小役3」、「小役5」が重複して含まれる当選種別「強ベル」が対応付けられている。また、当選領域13には、当選役「小役1」~「小役6」が重複して含まれる当選種別「共通ベルA」が対応付けられ、当選領域14には、当選役「小役1」~「小役6」、「小役11」が重複して含まれる当選種別「共通ベルB」が対応付けられている。
また、当選領域15~26には、払出枚数が11枚となる正解役(当選役「小役1」~「小役6」)と、払出枚数が1枚の不正解役(当選役「小役12」~「小役34」)が重複して含まれる選択当選種別(当選種別「打順ベル1A」~「打順ベル6A」、「打順ベル1B」~「打順ベル6B」)がそれぞれ対応付けられている。
また、図79の当選種別抽選テーブルによれば、当選領域27~39には、当選役「リプレイ1」~「リプレイ7」が重複して含まれる当選種別「シンボルリプレイA1」~「シンボルリプレイA7」、「シンボルリプレイB1」~「シンボルリプレイB6」が対応付けられている。また、当選領域40には、当選役「リプレイ1」、「リプレイ2」が重複して含まれる当選種別「通常リプレイ」が対応付けられている。
また、当選領域41~46には、当選役「RBB」が単独、または、他の小役と重複して含まれる当選種別「RBB1」~「RBB6」が対応付けられている。
そして、複数の当選役が重複して含まれる当選種別に当選した場合には、いずれの当選役に対応する図柄組み合わせを有効ラインA上に優先的に表示させるかについての入賞条件、例えば、ストップスイッチ420a、420b、420cが操作される順番が設定されている。
以下の説明において、左リール410a、中リール410b、右リール410cの順にリールを停止させるストップスイッチ420a、420b、420cの操作を「打順1」とし、左リール410a、右リール410c、中リール410bの順にリールを停止させるストップスイッチ420a、420b、420cの操作を「打順2」とし、中リール410b、左リール410a、右リール410cの順にリールを停止させるストップスイッチ420a、420b、420cの操作を「打順3」とし、中リール410b、右リール410c、左リール410aの順にリールを停止させるストップスイッチ420a、420b、420cの操作を「打順4」とし、右リール410c、左リール410a、中リール410bの順にリールを停止させるストップスイッチ420a、420b、420cの操作を「打順5」とし、右リール410c、中リール410b、左リール410aの順にリールを停止させるストップスイッチ420a、420b、420cの操作を「打順6」とする。
例えば、非内部遊技状態において、当選領域15の当選種別「打順ベル1A」に当選し、正解操作態様(打順1)による操作が行われた場合、払出枚数が11枚の正解役である当選役「小役1」に対応する図柄組み合わせが有効ラインA上に優先的に表示されるように停止制御がなされる。また、打順2による操作が行われた場合、払出枚数1枚の不正解役である当選役「小役28」に対応する図柄組み合わせが有効ラインA上に優先的に表示されるように停止制御がなされ、打順3、4による操作が行われた場合、払出枚数1枚の不正解役である当選役「小役12」に対応する図柄組み合わせが有効ラインA上に優先的に1/4の確率で表示されるように停止制御がなされ、打順5、6による操作が行われた場合、払出枚数1枚の不正解役である当選役「小役16」に対応する図柄組み合わせが有効ラインA上に優先的に1/4の確率で表示されるように停止制御がなされる。
なお、当選領域15~26の各当選種別の当選確率(置数)は等しくなるように設定されている。遊技者は、通常、いずれの当選種別に当選しているのかを知ることができないため、上記のような当選領域15~26を設けることにより、正解役を入賞させにくくしている。また、上記のように、不正解役が優先的に表示される打順でストップスイッチ420a、420b、420cが操作されても、必ずしも不正解役に対応する図柄組み合わせを有効ラインA上に表示させられるとは限らないので、その操作態様によっては、とりこぼしが発生することがある(PB≠1)。
なお、上述したいずれかの当選種別に当選すると、それぞれの当選種別に対応する内部当選フラグが成立(ON)するとともに、この内部当選フラグの成立状況に応じて、各リール410の停止制御がなされることとなる。このとき、小役が含まれる当選種別に当選したものの、これら当選役に対応する図柄組み合わせを、その遊技内で有効ラインA上に表示させることができなかった場合には、当該遊技の終了後に内部当選フラグがOFFされる。つまり、小役の当選の権利は小役が含まれる当選種別に当選した遊技内のみに限られ、当該権利を次遊技に持ち越すことはできない。これに対して、当選役「RBB」が含まれる当選種別に当選した場合には、RBB内部当選フラグが成立(ON)するとともに、当選役「RBB」に対応する図柄組み合わせが有効ラインA上に表示されるまで、RBB内部当選フラグが遊技を跨いで持ち越される。なお、リプレイ役が含まれる当選種別に対応する内部当選フラグが成立した場合には、その当選種別に含まれるリプレイ役のうちのいずれかのリプレイ役に対応する図柄組み合わせが必ず有効ラインA上に表示され、メダルを要することなく次遊技を行うために必要となる処理が行われた後に、当該内部当選フラグがOFFされる。
(遊技状態の遷移)
ここで、図80を用い、遊技状態の遷移について説明する。ここでは、非内部遊技状態、RBB内部中遊技状態、RBB作動中遊技状態といった複数の遊技状態が準備されている。各遊技状態は、後述するように、ボーナス役の当選、入賞(作動)、終了に応じて遷移させる。
非内部遊技状態は、複数の遊技状態における初期状態に相当する遊技状態である。かかる非内部遊技状態では、リプレイ役の当選確率が約1/7.3に設定されている。また、非内部遊技状態では、当選役「RBB」が所定の確率(例えば約1/30)で決定されている。
遊技状態制御手段612は、当選役「RBB」の当選に応じて遊技状態を遷移させる。例えば、当選役「RBB」が当選した遊技において、当選役「RBB」に対応する図柄組み合わせが有効ラインA上に表示されると、遊技状態制御手段612は、遊技状態をRBB作動中遊技状態に移行させる(1)。
RBB作動中遊技状態では、リプレイ役の当選確率が0に設定されている。なお、かかるRBB作動中遊技状態では、当選可能な当選種別として、当選領域1に当選種別「小役ALL」が、当選領域2、3に当選種別「1枚ALLA」、「1枚ALLB」が設定されている。当選種別「小役ALL」に当選すると、当選役「小役1」~「小役39」のいずれかに対応する図柄組み合わせが有効ラインA上に表示され、当選種別「1枚ALL」に当選すると、当選役「小役11」~「小役39」のいずれかに対応する図柄組み合わせが有効ラインA上に表示されるように停止制御される。ここでは、かかる小役の構成によりRBB作動中遊技状態での単位遊技当たりの期待獲得枚数を低くしている。
RBB作動中遊技状態の終了条件を満たすと、すなわち、獲得枚数が所定枚数に到達すると、遊技状態制御手段612は、遊技状態を非内部遊技状態に移行させる(2)。
一方、当選役「RBB」が当選した遊技において、当選役「RBB」に対応する図柄組み合わせを有効ラインA上に表示することができなかった場合、遊技状態制御手段612は、遊技状態をRBB内部中遊技状態(特別遊技状態)に移行させる(3)。
RBB内部中遊技状態では、リプレイ役の当選確率が約1/5.9に設定されている。また、RBB内部中遊技状態では当選種別「ハズレ」に当選することはない。換言すれば、当選役「RBB」の当選遊技で当選役「RBB」に対応する図柄組み合わせを有効ラインA上に表示することができなかった場合、その後は、当選役「RBB」より小役やリプレイ役の方が優先して有効ラインA上に停止制御されるので、当選役「RBB」に対応する図柄組み合わせを有効ラインA上に表示することができない。したがって、一旦、遊技状態がRBB内部中遊技状態に移行すると、その後、遊技状態が遷移することなく、RBB内部中遊技状態が維持されることとなる。ここでは、かかるRBB内部中遊技状態を維持しつつ、そのRBB内部中遊技状態においてAT演出状態を実現する。
ここでは、RBB内部中遊技状態において、複数種類の正解役が互いに重複せずに当選するため、正解役を入賞させることができる機会を多くすることができ、その結果、例えば、RBB内部中遊技状態におけるAT演出状態において補助演出が行われることで、メダルを獲得しやすくできる。一方、RBB作動中遊技状態では、複数種類の正解役が重複して当選するため、正解役を入賞させることができる機会が少ないので、他の遊技状態におけるAT演出状態よりも正解役を入賞させることができる機会が減り、遊技者が所有するメダルを増やしにくくしている。したがって、RBB内部中遊技状態よりも入賞に係る当選役の当選確率が高いというRBB作動中遊技状態の機能を備えつつ、メダルの獲得性能の面ではRBB作動中遊技状態がRBB内部中遊技状態に劣るという仕様(アクセルRBB)を実現することができる。
(演出状態の遷移)
図81は、演出状態の遷移を説明するための説明図である。以下、主制御基板500において演出状態制御手段614により遷移される演出状態(非AT演出状態、AT演出状態)について詳述する。なお、以下では、遊技状態がRBB内部中遊技状態である場合について説明する。
ここで、メダルの獲得性能が高い遊技状態が偏っているか否かを統括的かつ画一的に判定すべく、指示機能に係る性能を有する遊技区間、すなわち、補助演出(指示機能)を実行する遊技区間等を含む、遊技者にとって有利な遊技区間を有利区間(特定区間)として定義する。なお、有利区間は、主制御基板500で補助演出の作動に係る抽選等を行った結果、補助演出が作動した場合には、主制御基板500において指示の内容が識別できるよう、例えば、主報知手段に表示したときに限り、指示情報を、副制御基板502等の周辺基板に送信してもよい遊技区間である。また、有利区間と異なる遊技区間を非有利区間とする。したがって、複数の演出状態(非AT演出状態、AT演出状態)は、遊技区間である有利区間および非有利区間のいずれかに属することとなる。本実施形態では、ほぼ全ての演出状態が有利区間に属し、非AT演出状態の一部の演出状態(ここでは非有利演出状態)で非有利区間を実現している。
なお、有利区間において、補助演出がないと正解役を取りこぼしてしまう当選態様のうち、正解役の配当が最大(ここでは、11枚)となる選択当選種別において、正解役の入賞を補助する補助演出(最大払出枚数を獲得できる補助演出)を行う場合、例えば、区間表示器460を点灯させることによって、その旨を報知しなければならない。
また、非有利区間においては、当選種別の当選確率を設定値毎に異ならせることは可能であるが、同一の当選種別において補助演出を伴う演出状態(AT演出状態)への移行を決定する確率は設定値毎に異ならせてはならない。一方、有利区間においては、当選種別の当選確率、および、同一の当選種別における補助演出を伴う演出状態(AT演出状態)への移行(または追加)を決定する確率のいずれも設定値毎に異ならせることは可能である。
したがって、演出状態制御手段614は、演出状態の移行の管理に加え、非有利区間と有利区間との移行も管理することとなる。また、有利区間は、このような管理に拘わらず、以下の終了条件を満たすことで強制的に終了する。例えば、有利区間において計数される値が所定値に達したこと(例えば、滞在遊技数(遊技実行回数)が1500遊技に達したり、獲得枚数(純増枚数)が2400枚を超えたこと)に基づいて強制的に終了する。いずれの場合においても、演出状態制御手段614は、有利区間から非有利区間に移行することで、有利区間で更新された情報(指示機能に係る性能に影響を及ぼす全ての変数)を全てリセットする。
(非AT演出状態、AT演出状態)
非AT演出状態においては、AT演出状態より、補助演出の実行頻度が極めて低く、補助演出がほぼ行われないので、獲得できるメダルの枚数が制限される。ここでは、非AT演出状態として通常演出状態、非有利演出状態、準備演出状態、第1インターバル演出状態、継続抽選演出状態、第2インターバル演出状態といった6つの演出状態が設けられている。
AT演出状態においては、選択当選種別全ての当選時において補助演出実行手段に補助演出を実行させることで、メダルの消費を抑えつつ、多くのメダルを獲得することが可能となる。したがって、遊技者は、AT演出状態に移行することで、非AT演出状態と比べ、遊技を有利に進行することができる。ここでは、AT演出状態として、擬似ボーナス演出状態が設けられている。以下、各演出状態(通常演出状態、擬似ボーナス演出状態、非有利演出状態、準備演出状態、第1インターバル演出状態、継続抽選演出状態、第2インターバル演出状態)について個々に説明する。
(各演出状態)
通常演出状態は、複数の演出状態のうち、初期状態に相当する演出状態である。演出状態制御手段614は、通常演出状態においてAT抽選を行う。AT抽選は、AT演出状態への移行を決定する抽選であり、演出状態制御手段614は、当選種別抽選により決定された当選種別ごとに異なる確率でAT抽選を行う。そして、AT抽選に当選した場合、演出状態制御手段614は、所定の前兆遊技数が経過した後に、演出状態をAT演出状態である擬似ボーナス演出状態に移行させる(1)。また、擬似ボーナス演出状態に移行することなく通常演出状態で所定の天井条件(例えば、通常演出状態を連続して所定遊技数消化)が満たされると(所謂、天井到達)、演出状態制御手段614は、演出状態を擬似ボーナス演出状態へ移行させる(1)。
擬似ボーナス演出状態では、所定の終了条件(例えば、消化した遊技数が所定遊技数に到達すること)を満たすまで、補助演出が実行され、遊技者は、擬似ボーナス演出状態において、例えば、期待獲得枚数3.5枚を得ることができる。なお、擬似ボーナス演出状態では、主として2つの終了条件が準備されている。例えば、終了条件が、消化した遊技数が所定遊技数に到達することであった場合、所定遊技数として、30と80の2段階設けられ、いずれかが抽選により決定される。擬似ボーナス演出状態では、当然、消化した遊技数が多いほど、遊技者は、多くの遊技利益を得ることになる。したがって、遊技者は、所定遊技数が30ではなく80であることを望むこととなる。ただし、所定遊技数として30が決定された場合であっても、その消化中に補助演出の所定遊技数を30から80に増加させる昇格抽選も行われる。なお、ここでは、擬似ボーナス演出状態の終了条件として、消化した遊技数が所定遊技数に到達したことを例示しているが、これに代えて、最大払出枚数を獲得できる補助演出の回数が所定数に到達することや、獲得枚数(純増枚数)が所定数に到達することを採用してもよい。
そして、擬似ボーナス演出状態において、所定の終了条件を満たすと、演出状態制御手段614は、演出状態を非有利演出状態に移行する場合がある(2)。このとき、演出状態制御手段614は、有利区間を、一旦、非有利区間に移行し、有利区間で更新された情報を全てリセットする。例えば、前段の擬似ボーナス演出状態が初回の擬似ボーナス演出状態であった場合、すなわち、通常演出状態から移行した直後の擬似ボーナス演出状態であれば、演出状態制御手段614は、演出状態を非有利演出状態に移行するとともに、有利区間を、一旦、非有利区間に移行する。また、前段の擬似ボーナス演出状態が、通常演出状態を経由しない3の倍数(3、6、…)回目の擬似ボーナス演出状態であった場合も、演出状態制御手段614は、有利区間を、一旦、非有利区間に移行するとともに、有利区間を、一旦、非有利区間に移行する。
そして、演出状態制御手段614は、有利区間への移行を高確率(例えば、1/2)で抽選し、数遊技を消化後、有利区間に戻すとともに、演出状態を準備演出状態に移行する(3)。これは、有利区間において計数される値が所定値に達することにより、擬似ボーナス演出状態が強制的に終了することを回避するためである。
一方、前段の擬似ボーナス演出状態が初回ではない、もしくは、通常演出状態を経由しない3の倍数回目の擬似ボーナス演出状態ではない場合、演出状態制御手段614は、演出状態を非有利演出状態に移行することなく、直接、準備演出状態に移行する(4)。これは、有利区間において計数される値が所定値に達することにより擬似ボーナス演出状態が強制的に終了することを回避しつつ、不要に有利区間を終了させないためである。
準備演出状態において、演出状態制御手段614は、第1インターバル演出状態への移行を高確率(例えば、1/2)で抽選し、第1インターバル演出状態への移行の決定に基づいて、演出状態を第1インターバル演出状態に移行する(5)。
第1インターバル演出状態は、所定の終了条件(例えば、40遊技の消化)を満たすまで継続し、その間、擬似ボーナス演出状態の継続抽選が実行される。かかる第1インターバル演出状態は、擬似ボーナス演出状態と異なり、単位遊技当たりの期待獲得枚数が少なく、負の値となる場合もある。なお、本実施形態では、非有利区間において有利区間に当選した場合、演出状態が必ず第1インターバル演出状態となるように設定されている。したがって、擬似ボーナス演出状態の終了後は、有利区間が継続した場合であっても、上記のように、一旦、非有利区間に移行した場合であっても、第1インターバル演出状態に移行することとなる。そして、第1インターバル演出状態における所定の終了条件を満たすと、演出状態制御手段614は、演出状態を継続抽選演出状態に移行する(6)。
継続抽選演出状態は、所定の終了条件(例えば、5遊技の消化)を満たすまで継続し、最終的に、第1インターバル演出状態における、擬似ボーナス演出状態の継続抽選の結果が報知される。かかる継続抽選演出状態も、擬似ボーナス演出状態と異なり、単位遊技当たりの期待獲得枚数が少なく、負の値となる場合もある。第1インターバル演出状態において、擬似ボーナス演出状態への移行(継続)が決定されていれば、演出状態制御手段614は、演出状態を擬似ボーナス演出状態への移行し(7)、擬似ボーナス演出状態への移行が決定されていなければ、演出状態制御手段614は、演出状態を通常演出状態へ戻す(8)。
このように、本実施形態では、一旦、擬似ボーナス演出状態に移行すると、継続抽選演出状態の継続抽選に漏れない限り、擬似ボーナス演出状態→準備演出状態→第1インターバル演出状態→継続抽選演出状態の移行を繰り返すことで、遊技者は、メダルを蓄積できる。
なお、準備演出状態において、演出状態制御手段614は、第1インターバル演出状態への移行抽選に加え、第2インターバル演出状態への移行抽選も行っている。ただし、第1インターバル演出状態への移行確率(例えば、1/2)より、第2インターバル演出状態への移行確率(例えば、1/20)の方が小さく設定されている。準備演出状態において、第1インターバル演出状態への移行が決定する前に、第2インターバル演出状態への移行が決定されると、演出状態制御手段614は、第2インターバル演出状態への移行の決定に基づいて、演出状態を第2インターバル演出状態に移行する(9)。なお、ここでは、準備演出状態において第2インターバル演出状態への移行抽選を行う例を挙げているが、同様に、非有利演出状態において第2インターバル演出状態への移行抽選を行ってもよい。
第2インターバル演出状態は、第1インターバル演出状態同様、所定の終了条件(例えば、40遊技の消化)を満たすまで継続し、その間、擬似ボーナス演出状態の継続抽選が実行される。かかる第2インターバル演出状態は、第1インターバル演出状態同様、擬似ボーナス演出状態と異なり、単位遊技当たりの期待獲得枚数が少なく、負の値となる場合もある。
ただし、第2インターバル演出状態は、第1インターバル演出状態より高確率で擬似ボーナス演出状態が決定される。例えば、第1インターバル演出状態においては、40遊技間、擬似ボーナス演出状態を毎遊技1/58で決定し(当選確率50%)、第2インターバル演出状態においては、40遊技間、擬似ボーナス演出状態を毎遊技1/25で決定する(当選確率80%)。そして、所定の終了条件を満たすと、演出状態制御手段614は、演出状態を継続抽選演出状態に移行する(10)。なお、一旦、第2インターバル演出状態への移行が決定されると、その後は、継続抽選演出状態に漏れるまで、非有利演出状態、準備演出状態、第1インターバル演出状態に移行することはなく、擬似ボーナス演出状態からは第2インターバル演出状態にしか移行しない(11)。したがって、遊技者は、常に、高確率で継続抽選を受けることができる。また、一旦、第2インターバル演出状態への移行が決定されると、継続抽選演出状態において擬似ボーナス演出状態への移行が決定されなかった場合でも、演出状態制御手段614は、直ちに、演出状態を通常演出状態に戻すことなく、非有利演出状態に移行させる(12)。したがって、継続抽選演出状態において擬似ボーナス演出状態への移行が決定されなかった場合、再度、継続抽選演出状態の継続抽選に漏れるまで、擬似ボーナス演出状態→準備演出状態→第1インターバル演出状態→継続抽選演出状態の移行を繰り返すことができる。このように、一旦、第2インターバル演出状態に移行すると、高確率で、擬似ボーナス演出状態→第2インターバル演出状態→継続抽選演出状態の移行を繰り返すことができ、さらに、継続抽選演出状態において擬似ボーナス演出状態への移行が決定されなくとも、少なくとも、再度、擬似ボーナス演出状態→準備演出状態→第1インターバル演出状態→継続抽選演出状態の移行を繰り返すことができるので、遊技者は、より多くのメダルを蓄積することが可能となる。つまり、第2インターバル演出状態は、第1インターバル演出状態よりも有利な状態といえる。
また、上記のように、演出状態制御手段614は、擬似ボーナス演出状態から第2インターバル演出状態に移行する際には、第1インターバル演出状態への移行と異なり、非有利区間に移行させることがない。本実施形態においては、擬似ボーナス演出状態が初回の擬似ボーナス演出状態であった場合、演出状態制御手段614は、第2インターバル演出状態に移行させることはなく、有利区間を、一旦、非有利区間に移行して、必ず、第1インターバル演出状態へ移行させる。そうすると、有利区間が一旦リセットされていることになる。したがって、第2インターバル演出状態へ移行する際に有利区間をリセットしなくても、第2インターバル演出状態を経由する擬似ボーナス演出状態が有利区間の制限により短期に終了することはなく、遊技者は、擬似ボーナス演出状態→第2インターバル演出状態→継続抽選演出状態のループにより、多くのメダルを得ることができる。
以下、主制御基板500、副制御基板502における具体的処理をフローチャートに基づいて説明する。
(主制御基板500のCPU初期化処理)
図82は、主制御基板500におけるCPU初期化処理を説明するフローチャートである。電源基板より電源が供給されると、メインCPU500aにシステムリセットが発生し、メインCPU500aは、以下のCPU初期化処理(S2000)を行う。
(ステップS2000-1)
メインCPU500aは、電源投入に応じて、初期設定処理として、メインROM500bから起動プログラムを読み込むとともに、各種処理を実行するために必要な設定処理を行う。
(ステップS2000-3)
メインCPU500aは、タイマカウンタにウェイト処理時間を設定する。
(ステップS2000-5)
メインCPU500aは、電源断予告信号を検出しているかを判定する。なお、主制御基板500には、電源断検知回路が設けられており、電源電圧が所定値以下になると、電源断検知回路から電源断予告信号が出力される。電源断予告信号を検出している場合には、上記ステップS2000-3に処理を移し、電源断予告信号を検出していない場合には、ステップS2000-7に処理を移す。
(ステップS2000-7)
メインCPU500aは、上記ステップS2000-3で設定したウェイト処理時間が経過したか否かを判定する。その結果、ウェイト処理時間が経過したと判定した場合にはステップS2000-9に処理を移し、ウェイト時間は経過していないと判定した場合には上記ステップS2000-5に処理を移す。
(ステップS2000-9)
メインCPU500aは、メインRAM500cへのアクセスを許可するために必要な処理を実行する。
(ステップS2000-11)
メインCPU500aは、チェックサム確認処理を実行する。ここでは、メインCPU500aは、チェックサムを算出し、算出したチェックサムが、電源断時に保存されたチェックサムと一致しない(異常である)か、ならびに、バックアップが異常であるかを判定する。そして、メインCPU500aは、バックアップおよびチェックサムのいずれか一方または双方が異常であると判定した場合、バックアップ異常フラグをオンにし、バックアップおよびチェックサムの双方が異常でないと判定した場合、バックアップ異常フラグをオフにする。
(ステップS2000-13)
メインCPU500aは、バックアップ異常フラグがオンであるかを判定する。その結果、バックアップ異常フラグがオンであると判定した場合にはステップS2010に処理を移し、バックアップ異常フラグがオンでないと判定した場合にはステップS2020に処理を移す。
(ステップS2010)
メインCPU500aは、コールドスタート処理を実行する。なお、このコールドスタート処理については後述する。
(ステップS2020)
メインCPU500aは、設定値を切り替える設定値切り替え処理を実行する。なお、この設定値切り替え処理については後述する。
(ステップS2030)
メインCPU500aは、電源断直前の状態に戻す状態復帰処理を実行する。なお、この状態復帰処理については後述する。
図83は、主制御基板500におけるコールドスタート処理(S2010)を説明するフローチャートである。
(ステップS2010-1)
メインCPU500aは、メインRAM500cにおける使用領域をクリアするとともに、使用領域の異常を検出する使用領域RAMチェック処理を実行する。
(ステップS2010-3)
メインCPU500aは、メインRAM500cにおける別領域(使用外領域)をクリアするとともに、別領域の異常を検出する別領域RAMチェック処理を実行する。なお、別領域RAMチェック処理において別領域に異常が検出された場合、メインCPU500aは、RAMリードライトエラーフラグをオンにする。
(ステップS2010-5)
メインCPU500aは、メインRAM500cの異常を示すエラーコード「EA」をセットする。
(ステップS2010-7)
メインCPU500aは、上記ステップS2010-1において異常が検出されたかを判定する。その結果、上記ステップS2010-1において異常が検出されたと判定した場合にはステップS2011に処理を移し、上記ステップS2010-1において異常が検出されていないと判定された場合にはステップS2010-9に処理を移す。
(ステップS2010-9)
メインCPU500aは、上記ステップS2010-3において異常が検出されたときにオンになるRAMリードライトエラーフラグを取得する。
(ステップS2010-11)
メインCPU500aは、RAMリードライトエラーフラグがオンであるかを判定する。その結果、RAMリードライトエラーフラグがオンであると判定した場合にはステップS2011に処理を移し、RAMリードライトエラーフラグがオンでないと判定された場合にはステップS2020に処理を移す。
(ステップS2020)
メインCPU500aは、設定値を切り替える設定値切り替え処理を実行する。なお、この設定値切り替え処理については後述する。
(ステップS2010-13)
メインCPU500aは、バックアップエラーであることを示すエラーコード「E7」をセットする。
(ステップS2011)
メインCPU500aは、エラーにより遊技の進行を停止させるためのエラー停止処理を実行する。なお、このエラー停止処理については後述する。
図84は、主制御基板500におけるエラー停止処理(S2011)を説明するフローチャートである。
(ステップS2011-1)
メインCPU500aは、スタックポインタのアドレスとして、初期スタックポインタ値をセットする。
(ステップS2011-3)
メインCPU500aは、エラー表示および警告音設定を行うエラー設定処理を実行する。
(ステップS2011-5)
メインCPU500aは、外部信号1~3に対応するビットの出力イメージをオフにする外部信号1~3出力ビットオフをセットする。
(ステップS2011-7)
メインCPU500aは、上記ステップS2011-5でセットしたビットについて、出力イメージを更新する出力ポートイメージセット処理を実行する。
(ステップS2011-9)
メインCPU500aは、永久ループに移行する。これにより、遊技の進行が停止することになる。
図85は、主制御基板500における設定値切り替え処理(S2020)を説明するフローチャートである。
(ステップS2020-1)
メインCPU500aは、入力ポート1の信号を取得し、取得した入力ポート1の信号に基づいて、設定値切り替え条件が成立していないかを判定する。その結果、設定値切り替え条件が成立していないと判定した場合には当該設定値切り替え処理を終了し、設定値切り替え条件が成立していると判定した場合にはステップS2020-3に処理を移す。ここで、入力ポート1の信号には、前面上扉404および前面下扉406が開放されているか否かを示す信号、および、設定ドアキーがオンにされているか否かを示す信号が含まれる。そして、ここでは、前面上扉404および前面下扉406が開放されていることを示す信号、ならびに、設定ドアキーがオンにされていることを示す信号を取得した場合に、設定値切り替え条件が成立していると判定している。
(ステップS2020-3)
メインCPU500aは、メインRAM500cにおいて設定変更時にクリアすべき使用領域をクリアするRAMクリア処理を実行する。
(ステップS2020-5)
メインCPU500aは、設定値切り替え時データテーブルのテーブルデータをメインRAM500cに転送するテーブル内容セット処理を実行する。
(ステップS2020-7)
メインCPU500aは、設定値の変更を開始することを示す設定変更開始コマンドを送信バッファにセットする。
(ステップS2020-9)
メインCPU500aは、入力ポートの信号の立ち上がりエッジ(オンエッジ)、および、立ち下がりエッジ(オフエッジ)を検出するエッジチェック処理を実行する。
(ステップS2020-11)
メインCPU500aは、現在の設定値を示す設定値データを取得する。
(ステップS2020-13)
メインCPU500aは、上記ステップS2020-9において設定変更スイッチのオンエッジを検出していないかを判定する。その結果、設定変更スイッチのオンエッジを検出していないと判定した場合にはステップS2020-17に処理を移し、設定変更スイッチのオンエッジを検出したと判定した場合にはステップS2020-15に処理を移す。
(ステップS2020-15)
メインCPU500aは、設定値データを1インクリメントする。
(ステップS2020-17)
メインCPU500aは、設定値データが、設定値として設定可能な範囲(1~6)内であるかを判定する。その結果、設定値データが範囲内であると判定した場合にはステップS2020-21に処理を移し、設定値データが範囲内でないと判定した場合にはステップS2020-19に処理を移す。
(ステップS2020-19)
メインCPU500aは、設定値データを0にセットする。
(ステップS2020-21)
メインCPU500aは、上記ステップS2020-15または上記ステップS2020-19でインクリメントまたはセットされた値に設定値データを更新する。
(ステップS2020-23)
メインCPU500aは、設定値をメインクレジット表示部430に表示する表示データ変換処理を実行する。
(ステップS2020-25)
メインCPU500aは、設定変更スイッチのオンエッジを検出していないかを判定する。その結果、設定変更スイッチのオンエッジを検出していないと判定した場合にはステップS2020-31に処理を移し、設定変更スイッチのオンエッジを検出していると判定した場合にはステップS2020-27に処理を移す。
(ステップS2020-27)
メインCPU500aは、設定変更スイッチがオンであるかを判定する。その結果、設定変更スイッチがオンであると判定した場合にはステップS2020-27に処理を移し、設定変更スイッチがオンでないと判定した場合にはステップS2020-29に処理を移す。
(ステップS2020-29)
メインCPU500aは、設定変更スイッチ間隔タイマをセットする。
(ステップS2020-31)
メインCPU500aは、設定変更スイッチ間隔タイマが0になるまで待つタイマウェイト処理を実行する。
(ステップS2020-33)
メインCPU500aは、スタートスイッチ418のオンエッジを検出していないかを判定する。その結果、スタートスイッチ418のオンエッジを検出していないと判定した場合にはステップS2020-9に処理を移し、スタートスイッチ418のオンエッジを検出していると判定した場合にはステップS2020-35に処理を移す。
(ステップS2020-35)
メインCPU500aは、設定ドアキーがオフであるかを判定する。その結果、設定ドアキーがオフであると判定した場合にはステップS2020-35に処理を移し、設定ドアキーがオフでないと判定した場合にはステップS2020-37に処理を移す。
(ステップS2020-37)
メインCPU500aは、設定ドアキーがオンであるかを判定する。その結果、設定ドアキーがオンであると判定した場合にはステップS2020-37に処理を移し、設定ドアキーがオンでないと判定した場合にはステップS2021に処理を移す。
(ステップS2021)
メインCPU500aは、初期化スタートを開始する初期化スタート処理を実行する。なお、この初期化スタート処理については後述する。
図86は、主制御基板500における初期化スタート処理(S2021)を説明するフローチャートである。
(ステップS2021-1)
メインCPU500aは、設定値の変更が終了したことを示す設定変更終了コマンドを送信バッファにセットする。
(ステップS2021-3)
メインCPU500aは、設定値の変更が終了したときの状態を示す設定変更状態コマンドを送信バッファにセットする。
(ステップS2021-5)
メインCPU500aは、初期化スタート時ウェイトタイマをセットする。
(ステップS2021-7)
メインCPU500aは、初期化スタート時ウェイトタイマが0になるまで待つタイマウェイト処理を実行する。
(ステップS2021-9)
メインCPU500aは、メインRAM500cのうちの別領域をクリアする設定変更時RAMクリア処理を実行する。
(ステップS2021-11)
メインCPU500aは、メインRAM500cにおいて設定変更時にクリアすべき使用領域をクリアするRAMクリア処理を実行する。
(ステップS2021-13)
メインCPU500aは、現在の遊技状態を示す遊技状態コマンドを送信バッファにセットする。
(ステップS2100)
メインCPU500aは、遊技を開始するための遊技開始処理を実行する。なお、この遊技開始処理については後述する。
図87は、主制御基板500における状態復帰処理(S2030)を説明するフローチャートである。
(ステップS2030-1)
メインCPU500aは、スタックポインタを復帰させる。
(ステップS2030-3)
メインCPU500aは、メインRAM500cのうちの未使用領域をクリアする未使用領域クリア処理を実行する。
(ステップS2030-5)
メインCPU500aは、スタックポインタ保存バッファをクリアする。
(ステップS2030-7)
メインCPU500aは、電源断復帰後フラグを設定(オン)する。
(ステップS2030-9)
メインCPU500aは、入力ポートのイメージを更新するポート入力処理を実行する。
(ステップS2030-11)
メインCPU500aは、上記ステップS2030-9で更新された入力ポートのイメージに基づいて、操作対象ビットの情報を抽出する操作対象ビット抽出処理を実行する。
(ステップS2030-13)
メインCPU500aは、上記ステップS2030-11で抽出した操作対象ビットを、前回状態の操作対象ビットとしてセットする。
(ステップS2030-15)
メインCPU500aは、リール410a、410b、410cのモータフェーズを取得する。ここで、リール410a、410b、410cの状態として、モータフェーズが設定されている。モータフェーズは、リール410a、410b、410cの動作状態、すなわち、加速中、定常回転中、停止中、待機中を示す。具体的に、モータフェーズに割り当てられた1バイト(記憶単位)の変数が、そのステッピングモータ452の動作状態に応じて、加速中=3、定常回転中=2、停止中=1、待機中=0といった値に変化する。
(ステップS2030-17)
メインCPU500aは、上記ステップS2030-15で取得したモータフェーズに基づいて、リール410a、410b、410cのいずれもが定常回転中および加速中でないかを判定する。その結果、リール410a、410b、410cのいずれもが定常回転中および加速中でないと判定した場合にはステップS2030-21に処理を移し、リール410a、410b、410cのいずれかが定常回転中または加速中であると判定した場合にはステップS2030-19に処理を移す。
(ステップS2030-19)
メインCPU500aは、リール410a、410b、410cのエラー検出時の設定を行う回転エラー処理を実行する。
(ステップS2030-21)
メインCPU500aは、退避していたレジスタ群を復帰させる。
(ステップS2030-23)
メインCPU500aは、割込みを許可し、当該状態復帰処理を終了する。これにより、メインCPU500aは、電源断直前の状態に復帰する。
図88は、主制御基板500における遊技開始処理(S2100)を説明するフローチャートである。
(ステップS2100-1)
メインCPU500aは、再遊技であるか否かを示す再遊技状態識別信号を出力するための再遊技状態識別信号出力設定処理を実行する。
(ステップS2100-3)
メインCPU500aは、メダルの投入枚数(ベット枚数)を表示する投入枚数表示器に対応するビットをオフ(消灯)するための投入枚数表示器出力ビットオフをセットする。
(ステップS2100-5)
メインCPU500aは、上記ステップS2100-3でセットしたビットについて、出力イメージを更新する出力ポートイメージセット処理を実行する。
(ステップS2100-7)
メインCPU500aは、遊技開始ウェイトタイマをセットする。
(ステップS2100-9)
メインCPU500aは、遊技開始ウェイトタイマが0になるまで待つタイマウェイト処理を実行する。
(ステップS2100-11)
メインCPU500aは、メインRAM500cにおける使用領域のうち、1遊技毎にクリアすべき領域をクリアする1遊技RAMクリア処理を実行する。
(ステップS2100-13)
メインCPU500aは、ボーナス信号を設定するボーナス信号設定処理を実行する。
(ステップS2100-15)
メインCPU500aは、入力ポートイメージのエッジ情報をクリアするエッジクリア処理を実行する。
(ステップS2200)
メインCPU500aは、メダルの投入を受け付ける遊技メダル投入処理を実行する。なお、この遊技メダル投入処理については後述する。
図89は、主制御基板500における遊技メダル投入処理(S2200)を説明するフローチャートである。
(ステップS2200-1)
メインCPU500aは、各種エラーの検出結果の確認を行うエラー確認処理を実行する。
(ステップS2200-3)
メインCPU500aは、入力ポートの信号の立ち上がりエッジ(オンエッジ)、および、立ち下がりエッジ(オフエッジ)を検出するエッジチェック処理を実行する。
(ステップS2200-5)
メインCPU500aは、前面上扉404または前面下扉406が開放されているときに1が立つドア開放エラー検出フラグを取得する。
(ステップS2200-7)
メインCPU500aは、上記ステップS2200-5で取得したドア開放エラー検出フラグに基づき、前面上扉404および前面下扉406が閉鎖されているかを判定する。その結果、前面上扉404および前面下扉406が閉鎖されていると判定した場合にはステップS2200-17に処理を移し、前面上扉404または前面下扉406の少なくとも一方が閉鎖されていないと判定した場合にはステップS2200-9に処理を移す。
(ステップS2200-9)
メインCPU500aは、前面上扉404または前面下扉406の少なくとも一方が開放されていることを示すエラーコード「E8」をセットする。
(ステップS2200-11)
メインCPU500aは、エラー表示、警告音の要求、ならびに、エラー復帰待ちを行うエラーウェイト処理を実行する。
(ステップS2200-13)
メインCPU500aは、設定値を確認する設定値確認処理を実行する。
(ステップS2200-15)
メインCPU500aは、入力ポートイメージのエッジ情報をクリアするエッジクリア処理を実行する。
(ステップS2200-17)
メインCPU500aは、貯留(クレジット)されているメダルを払い戻すためのクレジットスイッチ(不図示)が押下されている場合に、貯留されているメダルを払い戻すクレジットボタンチェック処理を実行する。
(ステップS2200-19)
メインCPU500aは、メダルをベットする遊技メダル投入ボタン関連処理を実行する。ここでは、ベットスイッチ416が押下された場合に、貯留(クレジット)されているメダルを規定数までベットするとともに、ベットした枚数分だけ貯留枚数を減算する。また、メダル投入口414aを通じてメダルが投入された場合、規定数までメダルをベットし、規定数よりも多くメダルが投入された場合、その分だけ貯留枚数に加算する。
(ステップS2200-21)
メインCPU500aは、投入枚数が規定数であるかを確認する遊技メダル取得処理を実行する。
(ステップS2200-23)
メインCPU500aは、上記ステップS2200-21の確認結果に基づき、投入枚数が規定数でないかを判定する。その結果、投入枚数が規定数でないと判定した場合にはステップS2200-1に処理を移し、投入枚数が規定数であると判定した場合にはステップS2200-25に処理を移す。
(ステップS2200-25)
メインCPU500aは、スタートスイッチ418の操作が有効になったか否かを示すスタート表示器(不図示)をオン(点灯)するためのスタート表示器出力ビットをセットする。
(ステップS2200-27)
メインCPU500aは、スタートスイッチ418の立ち下がりエッジ(押下)を検出していなかを判定する。その結果、スタートスイッチ418の立ち下がりエッジを検出していないと判定した場合にはステップS2200-1に処理を移し、スタートスイッチ418の立ち下がりエッジを検出していると判定した場合にはステップS2200-29に処理を移す。
(ステップS2200-29)
メインCPU500aは、メイン払出表示部432の表示をクリアするためにメイン払出表示部バッファをクリアする。
(ステップS2200-31)
メインCPU500aは、再遊技状態識別信号をクリアする再遊技状態識別信号クリア処理を実行する。
(ステップS2200-33)
メインCPU500aは、スタート表示器をオフ(消灯)するためのブロッカー閉塞前処理を実行する。
(ステップS2200-35)
メインCPU500aは、スタートスイッチ418が押下されたことを示すレバー押下コマンドを送信バッファにセットする。
(ステップS2300)
メインCPU500aは、当選種別抽選を行う内部抽選処理を実行する。なお、この内部抽選処理については後述する。
図90は、主制御基板500における内部抽選処理(S2300)を説明するフローチャートである。
(ステップS2300-1)
メインCPU500aは、設定値データを取得する。
(ステップS2300-3)
メインCPU500aは、設定値異常エラーを示すエラーコード「EC」をセットする。
(ステップS2300-5)
メインCPU500aは、上記ステップS2300-1で取得した設定値データが異常であるかを判定する。その結果、設定値データが異常であると判定した場合にはステップS2011に処理を移し、設定値データが異常でないと判定した場合にはステップS2300-7に処理を移す。
(ステップS2300-7)
メインCPU500aは、乱数発生器500dによって更新された当選種別抽選乱数を取得する。
(ステップS2300-9)
メインCPU500aは、遊技状態に係るオフセット値を取得する状態オフセット取得処理を実行する。
(ステップS2300-11)
メインCPU500aは、内部抽選エリア定義テーブル(当選種別抽選テーブル)のアドレスをセットする。
(ステップS2300-13)
メインCPU500aは、上記ステップS2300-11でセットしたアドレスに対して、上記ステップS2300-9で取得したオフセット値を加算したアドレスに示される値を当選領域の初期値としてセットする。ここでは、現在の遊技状態の当選種別抽選テーブルにおける最初の当選領域が初期値としてセットされることになる。
(ステップS2300-15)
メインCPU500aは、その当選領域の当選範囲を示す数値である抽選データを取得するとともに、当選領域を1ずらす抽選データ取得処理を実行する。
(ステップS2300-17)
メインCPU500aは、当選種別抽選を行わないかを判定する。その結果、当選種別抽選を行わないと判定した場合にはステップS2300-21に処理を移し、当選種別抽選を行うと判定した場合にはステップS2300-19に処理を移す。
(ステップS2300-19)
メインCPU500aは、乱数値から抽選データを減算する。
(ステップS2300-21)
メインCPU500aは、上記ステップS2300-19の減算結果が負であるか、すなわち、当選種別抽選によって、その当選領域に当選しているかを判定する。その結果、当選種別抽選に当選していると判定した場合にはステップS2400に処理を移し、当選種別抽選に当選していないと判定した場合にはステップS2300-23に処理を移す。
(ステップS2300-23)
メインCPU500aは、当選種別抽選が終了でないかを判定する。その結果、当選種別抽選が終了でないと判定した場合にはステップS2300-15に処理を移し、当選種別抽選が終了であると判定した場合にはステップS2300-25に処理を移す。
(ステップS2300-25)
メインCPU500aは、トリガー役種別をクリアする。
(ステップS2400)
メインCPU500aは、当選領域および遊技状態に基づいて、図柄コードを設定する図柄コード設定処理を実行する。なお、この図柄コード設定処理については後述する。
図91は、主制御基板500における図柄コード設定処理(S2400)を説明するフローチャートである。
(ステップS2400-1)
メインCPU500aは、上記ステップS2300で当選した当選領域を取得し、取得した当選領域にボーナス役が含まれる場合には遊技状態を内部中遊技状態に設定する遊技状態設定処理を実行する。
(ステップS2400-3)
メインCPU500aは、上記ステップS2400-1で取得した当選領域を停止制御番号として設定する。
(ステップS2400-5)
メインCPU500aは、上記ステップS2400-1で取得した当選領域に基づいて、当選種別を決定(設定)する。
(ステップS2400-7)
メインCPU500aは、上記ステップS2400-3で設定した停止制御番号に基づいて、表示可能な図柄、および、引き込み対象の図柄を示す図柄コードを設定する図柄コード初期設定処理を実行する。
(ステップS2400-9)
メインCPU500aは、表示図柄ビットを設定する表示図柄ビット初期値設定処理を実行する。
(ステップS2400-11)
メインCPU500aは、実行フラグの設定、演出状態に関する各種処理、補助演出に関する処理等を行う実行フラグ設定処理を実行する。
(ステップS2400-13)
メインCPU500aは、有利区間に関するコマンドである演出コマンドを送信バッファにセットする。
(ステップS2400-15)
メインCPU500aは、当選種別を示す当選情報コマンドを送信バッファにセットする。
(ステップS2400-17)
メインCPU500aは、1遊技間タイマを確認する。
(ステップS2400-19)
メインCPU500aは、リール410a、410b、410cが回転前であることを示す回胴回転前コマンドを送信バッファにセットする。
(ステップS2400-21)
メインCPU500aは、ステッピングモータ452の励磁解放を待つ励磁解放待ち処理を実行する。
(ステップS2400-23)
メインCPU500aは、1遊技間タイマが0でないかを判定する。その結果、1遊技間タイマが0でないと判定した場合にはステップS2400-23に処理を移し、1遊技間タイマが0であると判定した場合にはステップS2400-25に処理を移す。
(ステップS2400-25)
メインCPU500aは、リール410a、410b、410cの回転を開始させるための回胴開始処理を実行する。ここでは、リール410a、410b、410cのモータフェーズを加速中に設定して各リールの回転を開始させたり、1遊技間タイマを4.1秒に相当する値にセットしたりする。
(ステップS2400-27)
メインCPU500aは、リール410a、410b、410cの回転が開始したことを示す回胴開始コマンドを送信バッファにセットする。
(ステップS2500)
メインCPU500aは、リール410a、410b、410cの回転中の処理である回胴回転中処理を実行する。なお、この回胴回転中処理については後述する。
図92は、主制御基板500における回胴回転中処理(S2500)を説明するフローチャートである。
(ステップS2500-1)
メインCPU500aは、ストップスイッチ420a、420b、420cの表示器(不図示)に対応するビットをオフ(消灯)するために停止表示器出力ビットオフ(出力イメージ)をセットする。ここで、停止表示器出力ビットは、3ビットのビット列で構成され、各ビットがそれぞれ3つのストップスイッチ420a、420b、420cの発光色に対応付けられており、青色=1、赤色=0で表される。
(ステップS2500-3)
メインCPU500aは、上記ステップS2500-1でセットしたビットについて、出力イメージを更新する出力ポートイメージセット処理を実行する。
(ステップS2500-5)
メインCPU500aは、各種エラーの検出結果の確認を行うエラー確認処理を実行する。
(ステップS2500-7)
メインCPU500aは、インデックスフラグを参照し、回転しているリール410a、410b、410cのインデックスを取得する。なお、インデックスフラグは、リール410a、410b、410cが定速回転速度に到達した後にしか立たないので、換言すれば、インデックスフラグが立っているということは、リール410a、410b、410cが定速回転速度に到達していることも示すこととなる。
(ステップS2500-9)
メインCPU500aは、リール410a、410b、410c全てのインデックスフラグを検出済みでないかを判定する。その結果、全てのインデックスフラグを検出済みでないと判定した場合にはステップS2500-1に処理を移し、全てのインデックスフラグを検出済みであると判定した場合にはステップS2500-11に処理を移す。
(ステップS2500-11)
メインCPU500aは、停止または停止開始しているリール410a、410b、410cを示す停止回胴ビットを取得する。ここで、停止回胴ビットは、3ビットのビット列で構成され、各ビットがそれぞれ3つのリール410a、410b、410cのいずれかに対応付けられており、定速状態=1、加速状態、減速状態または停止状態=0で表される。
(ステップS2500-13)
メインCPU500aは、上記ステップS2500-11で取得した停止回胴ビットを回胴回転中フラグとして保存する。
(ステップS2500-15)
メインCPU500aは、ストップスイッチ420a、420b、420cの表示器(不図示)に対応するビットをオン(消灯)するために停止表示器出力ビットオン(出力イメージ)をセットする。
(ステップS2500-17)
メインCPU500aは、入力ポート0のイメージを取得し、取得したイメージから、操作対象ビットを抽出する操作対象ビット抽出処理を実行する。ここで、操作対象ビットは、3ビットのビット列で構成され、各ビットがそれぞれ3つのストップスイッチ420a、420b、420cのいずれかに対応付けられており、操作されている=1、操作されていない=0で表される。
(ステップS2500-19)
メインCPU500aは、上記ステップS2500-13で取得した回胴回転中フラグと、上記ステップS2500-17で抽出した操作対象ビットとの論理積を演算する。ここで、リール410が回転中であり、かつ、そのリールに対応するストップスイッチ420が操作されていれば、すなわち、操作したストップスイッチ420が有効に回転しているリール410に対応していれば、論理積は1となる。
(ステップS2500-21)
メインCPU500aは、上記ステップS2500-19で演算した論理積が0である、すなわち、回転しているリール410に対応したストップスイッチ420が操作されていないかを判定する。その結果、回転しているリール410に対応したストップスイッチ420が操作されていないと判定した場合にはステップS2500-3に処理を移し、回転しているリール410に対応したストップスイッチ420が操作されていると判定した場合にはステップS2500-23に処理を移す。
(ステップS2500-23)
メインCPU500aは、停止表示器出力ビットが含まれる出力イメージを取得し、取得した出力イメージと、上記ステップS2500-19で演算した論理積との論理積を演算する。ここでは、操作されたストップスイッチ420が、赤色点灯中である場合に論理積のビットが0となり、青色点灯中である場合に論理積のビットが1となる。
(ステップS2500-25)
メインCPU500aは、上記ステップS2500-23で演算した論理積が0であるか、すなわち、操作されたストップスイッチ420が赤色点灯中であるかを判定する。その結果、操作されたストップスイッチ420が赤色点灯中であると判定した場合にはステップS2500-1に処理を移し、操作されたストップスイッチ420が赤色点灯中でないと判定した場合にはステップS2500-27に処理を移す。
(ステップS2500-27)
メインCPU500aは、操作されたストップスイッチ420が有効でないかを判定する。その結果、操作されたストップスイッチ420が有効でないと判定した場合にはステップS2500-1に処理を移し、操作されたストップスイッチ420が有効であると判定した場合にはステップS2500-29に処理を移す。なお、ここでは、操作されたストップスイッチ420が1つであるか否かを判定している。そして、操作されたストップスイッチ420が1つであると判定した場合にはステップS2500-29に処理を移し、操作されたストップスイッチ420が1つでない、すなわち、2つ以上であると判定した場合にはステップS2500-1に処理を移す。
(ステップS2500-29)
メインCPU500aは、操作されたストップスイッチ420に対応するリール410を停止させるための各種パラメータを取得する停止制御回胴設定処理を実行する。
(ステップS2500-31)
メインCPU500aは、割込みを禁止する。
(ステップS2500-33)
メインCPU500aは、有効ラインA上に位置する図柄の図柄番号を押下基準位置として導出する押下基準位置取得処理を実行する。
(ステップS2500-35)
メインCPU500aは、リール410の滑りコマ数を決定する滑りコマ数取得処理を実行する。
(ステップS2600)
メインCPU500aは、操作されたストップスイッチ420に対応するリール410を停止させる回胴停止処理を実行する。なお、この回胴停止処理については後述する。
図93は、主制御基板500における回胴停止処理(S2600)を説明するフローチャートである。
(ステップS2600-1)
メインCPU500aは、上記ステップS2500-35で導出した押下基準位置を取得する。
(ステップS2600-3)
メインCPU500aは、上記ステップS2600-1で取得した押下基準位置に対して、上記ステップS2500-37で決定した滑りコマ数を補正することにより、停止要求番号を算定する。
(ステップS2600-5)
メインCPU500aは、停止要求フラグを設定する(1にする)。停止要求フラグは、並行して動作するプログラムに対し、対象となるリール410の停止処理を要求するためのフラグであり、停止要求フラグを1とすることで、停止要求番号に対応する図柄を有効ラインA上に停止することが可能となる。かかる停止要求フラグおよび上記の停止要求番号は、並行して動作するプログラムにより読み出され、リール410の停止処理が行われる。なお、停止処理が完了すると、そのプログラムによって、停止要求フラグは0(OFF)にリセットされる。
(ステップS2600-7)
メインCPU500aは、割込みを許可する。
(ステップS2600-9)
メインCPU500aは、リール410の停止順序を示す停止情報コマンドを送信バッファにセットする。
(ステップS2600-11)
メインCPU500aは、ストップスイッチ420の表示器(不図示)に対応するビットをオフ(消灯)するために停止表示器出力ビットオフ(出力イメージ)をセットする。
(ステップS2600-13)
メインCPU500aは、上記ステップS2600-11でセットしたビットについて、出力イメージを更新する出力ポートイメージセット処理を実行する。
(ステップS2600-15)
メインCPU500aは、表示図柄ビットを設定する表示図柄ビット設定処理を実行する。
(ステップS2600-17)
メインCPU500aは、次のリール410を停止させるための次回胴設定前処理を実行する。
(ステップS2600-19)
メインCPU500aは、全てのリール410の停止処理が終了済みでないかを判定する。その結果、全てのリール410の停止処理が終了済みでないと判定した場合にはステップS2500に処理を移し、全てのリール410の停止処理が終了済みであると判定した場合にはステップS2600-21に処理を移す。
(ステップS2600-21)
メインCPU500aは、いずれかのリール410について停止要求フラグがオンである、すなわち、全てのリール410が停止済みでないかを判定する。その結果、全てのリール410が停止済みでないと判定した場合にはステップS2600-21に処理を移し、全てのリール410が停止済みであると判定した場合にはステップS2600-23に処理を移す。
(ステップS2600-23)
メインCPU500aは、各種エラーの検出結果の確認を行うエラー確認処理を実行する。
(ステップS2600-25)
メインCPU500aは、操作対象ビットの情報を抽出する操作対象ビット抽出処理を実行する。
(ステップS2600-27)
メインCPU500aは、上記ステップS2600-25で取得した操作対象ビットに基づいて、ストップスイッチ420が押下されているかを判定する。その結果、ストップスイッチ420が押下されていると判定した場合にはステップS2600-23に処理を移し、ストップスイッチ420が押下されていないと判定した場合にはステップS2700に処理を移す。
(ステップS2700)
メインCPU500aは、入賞した当選役を判定する表示判定処理を実行する。なお、この表示判定処理については後述する。
図94は、主制御基板500における表示判定処理(S2700)を説明するフローチャートである。
(ステップS2700-1)
メインCPU500aは、メイン払出表示部432のバッファをクリアする。
(ステップS2700-3)
メインCPU500aは、有効ラインA上に表示された図柄組み合わせと、有効ラインA上に表示許可された図柄組み合わせとが一致するか否かによって、表示判定異常が発生しているかを判定する表示判定異常検出処理を実行する。
(ステップS2700-5)
メインCPU500aは、表示判定異常(エラー)であることを示すエラーコード「EE」をセットする。
(ステップS2700-7)
メインCPU500aは、上記ステップS2700-3の判定結果に基づき、表示判定異常であるかを判定する。その結果、表示判定異常であると判定した場合にはステップS2011に処理を移し、表示判定異常でないと判定した場合にはステップS2700-9に処理を移す。
(ステップS2700-9)
メインCPU500aは、有効ラインA上に停止(表示)された図柄組み合わせに基づいて、入賞した当選役を決定する表示図柄識別生成処理を実行する。
(ステップS2700-11)
メインCPU500aは、払出枚数の初期値として0をセットする。
(ステップS2700-13)
メインCPU500aは、小役が入賞したかを判定する。その結果、小役が入賞したと判定した場合にはステップS2700-15に処理を移し、小役が入賞していないと判定した場合にはステップS2700-35に処理を移す。
(ステップS2700-15)
メインCPU500aは、小役が入賞したことを示す入賞フラグをオンにする。
(ステップS2700-17)
メインCPU500aは、入賞した小役に応じた払出枚数を設定する払出枚数設定処理を実行する。
(ステップS2700-19)
メインCPU500aは、有利区間でないかを判定する。その結果、有利区間でないと判定した場合にはステップS2800に処理を移し、有利区間であると判定した場合にはステップS2700-21に処理を移す。
(ステップS2700-21)
メインCPU500aは、有利区間中の純増枚数をカウントする有利区間MYカウンタの値を取得する。
(ステップS2700-23)
メインCPU500aは、上記ステップS2700-23で取得した有利区間MYカウンタの値に払出枚数を加算する。
(ステップS2700-25)
メインCPU500aは、当該遊技の投入枚数を取得する。
(ステップS2700-27)
メインCPU500aは、上記ステップS2700-23で加算した値から投入枚数を減算する。
(ステップS2700-29)
メインCPU500aは、上記ステップS2700-27の減算結果が負でないかを判定する。その結果、減算結果が負でないと判定した場合にはステップS2700-33に処理を移し、減算結果が負であると判定した場合にはステップS2700-31に処理を移す。
(ステップS2700-31)
メインCPU500aは、有利区間MYカウンタの値をクリアする(0にする)。
(ステップS2700-33)
メインCPU500aは、上記ステップS2700-27で減算した値、または、上記ステップS2700-31でクリアした値に、有利区間MYカウンタの値を更新する。
(ステップS2700-35)
メインCPU500aは、リプレイ役が入賞していなかを判定する。その結果、リプレイ役が入賞していないと判定した場合にはステップS2800に処理を移し、リプレイ役が入賞していると判定した場合にはステップS2700-37に処理を移す。
(ステップS2700-37)
メインCPU500aは、払出枚数に投入枚数をセットする。
(ステップS2700-39)
メインCPU500aは、再遊技作動中フラグをオンにする。
(ステップS2700-41)
メインCPU500aは、自動投入枚数をセットする。
(ステップS2800)
メインCPU500aは、メダルを払い出す払出処理を実行する。なお、この払出処理については後述する。
図95は、主制御基板500における払出処理(S2800)を説明するフローチャートである。
(ステップS2800-1)
メインCPU500aは、再遊技作動中フラグを取得する。
(ステップS2800-3)
メインCPU500aは、メダルの払い出しが開始されたことを示す払出開始コマンドを送信バッファにセットする。
(ステップS2800-5)
メインCPU500aは、上記ステップS2800-1で取得した再遊技作動中フラグに基づいて、リプレイ役が入賞したかを判定する。その結果、リプレイ役が入賞したと判定した場合にはステップS2800-41に処理を移し、リプレイ役が入賞していないと判定した場合にはステップS2800-7に処理を移す。
(ステップS2800-7)
メインCPU500aは、メイン払出表示部432に0を表示するためのメイン表示器表示処理を実行する。
(ステップS2800-9)
メインCPU500aは、払い出しがない(払出枚数が0枚)を判定する。その結果、払い出しがないと判定した場合にはステップS2800-35に処理を移し、払い出しがあると判定した場合にはステップS2800-11に処理を移す。
(ステップS2800-11)
メインCPU500aは、貯留枚数が50枚以上であるかを判定する。その結果、貯留枚数が50枚以上であると判定した場合にはステップS2800-13に処理を移し、貯留枚数が50枚以上でないと判定した場合にはステップS2800-15に処理を移す。
(ステップS2800-13)
メインCPU500aは、メダル払出装置442からメダルを1枚払い出させるメダル払出装置制御処理を実行し、ステップS2800-23に処理を移す。
(ステップS2800-15)
メインCPU500aは、払出開始間隔タイマをセットする。
(ステップS2800-17)
メインCPU500aは、払出開始タイマが0でない、すなわち、初回払出時であるかを判定する。その結果、初回払出時であると判定した場合にはステップS2800-21に処理を移し、初回払出時でないと判定した場合にはステップS2800-19に処理を移す。
(ステップS2800-19)
メインCPU500aは、払出開始間隔タイマが0になるまで待つタイマウェイト処理を実行する。
(ステップS2800-21)
メインCPU500aは、貯留枚数を1インクリメントする。
(ステップS2800-23)
メインCPU500aは、1枚のメダルが払い出されたことを示す払出実行コマンドを送信バッファにセットする。
(ステップS2800-25)
メインCPU500aは、既に払い出された払出枚数をメイン払出表示部432に表示するためのメイン表示器表示前処理を実行する。
(ステップS2800-27)
メインCPU500aは、ボーナス遊技状態でないかを判定する。その結果、ボーナス遊技状態でないと判定した場合にはステップS2800-31に処理を移し、ボーナス遊技状態であると判定した場合にはステップS2800-29に処理を移す。
(ステップS2800-29)
メインCPU500aは、ボーナス遊技状態において払い出されたメダルの枚数であるボーナス作動中獲得枚数を1インクリメントする。
(ステップS2800-31)
メインCPU500aは、払出枚数のメダルの払い出しが終了していないかを判定する。その結果、払い出しが終了していないと判定した場合にはステップS2800-11に処理を移し、払い出しが終了していると判定した場合にはステップS2800-33に処理を移す。
(ステップS2800-33)
メインCPU500aは、メダルの払い出しを終了するための払出終了処理を実行する。
(ステップS2800-35)
メインCPU500aは、オーバーエラーが検出されていないかを判定する。その結果、オーバーエラーが検出されていないと判定した場合にはステップS2800-41に処理を移し、オーバーエラーが検出されていると判定した場合にはステップS2800-37に処理を移す。
(ステップS2800-37)
メインCPU500aは、オーバーエラーを示すエラーコード「E5」をセットする。
(ステップS2800-39)
メインCPU500aは、エラー表示、警告音の要求、ならびに、エラー復帰待ちを行うエラーウェイト処理を実行する。
(ステップS2800-41)
メインCPU500aは、メダルの払い出しが終了したことを示す払出終了コマンドを送信バッファにセットする。
(ステップS2900)
メインCPU500aは、遊技状態の移行、有利区間を管理する処理等を行う遊技移行処理を実行する。なお、この遊技移行処理については後述する。
図96は、主制御基板500における遊技移行処理(S2900)を説明するフローチャートである。
(ステップS2900-1)
メインCPU500aは、再遊技作動中フラグを取得し、取得した再遊技作動中フラグに基づいて、次遊技が再遊技であることを示すリプレイ表示器(不図示)に対応するビットをオンまたはオフするために停止表示器出力ビットオフ(出力イメージ)をセットし、セットした出力イメージの出力ビットを更新するリプレイ表示器制御処理を実行する。
(ステップS2900-3)
メインCPU500aは、ボーナス役が入賞した場合に、ボーナス遊技状態を制御するための各種パラメータを設定する役物作動図柄表示処理を実行する。
(ステップS2900-5)
メインCPU500aは、ボーナス遊技状態において、ボーナス作動中獲得枚数が所定枚数に到達した場合に、遊技状態を非内部遊技状態に移行させるボーナス作動終了処理を実行する。
(ステップS2900-7)
メインCPU500aは、有利区間を管理する有利区間更新処理を実行する。
(ステップS2900-9)
メインCPU500aは、次遊技がAT演出状態でないかを判定する。その結果、次遊技がAT演出状態でないと判定した場合にはステップS2900-15に処理を移し、次遊技がAT演出状態であると判定した場合にはステップS2900-11に処理を移す。
(ステップS2900-11)
メインCPU500aは、ボーナス遊技状態でないかを判定する。その結果、ボーナス遊技状態でないと判定した場合にはステップS2900-15に処理を移し、ボーナス遊技状態であると判定した場合にはステップS2900-13に処理を移す。
(ステップS2900-13)
メインCPU500aは、区間表示器460を点灯させるための有利ランプフラグをオンにセットする。
(ステップS2900-15)
メインCPU500aは、有利区間に関するコマンドである演出コマンドを送信バッファにセットする演出コマンド設定処理を実行する。
(ステップS2900-17)
メインCPU500aは、1遊技が終了したことを示す遊技終了コマンドを送信バッファにセットする。
(ステップS2900-19)
メインCPU500aは、外部信号を出力するための端子板信号出力処理を実行する。
(ステップS2900-21)
メインCPU500aは、上記ステップS2900-7において有利区間を終了させるときに設定される演出用ウェイトタイマが0でないかを判定する。その結果、演出用ウェイトタイマが0でないと判定した場合にはステップS2900-21に処理を移し、演出用ウェイトタイマが0であると判定した場合にはステップS2900-23に処理を移す。
(ステップS2900-23)
メインCPU500aは、遊技状態を示す遊技状態コマンドを送信バッファにセットする。
(ステップS2900-25)
メインCPU500aは、次遊技の開始を示す遊技開始コマンドを送信バッファにセットし、ステップS2100に処理を移す。
ステップS2100からステップS2900までの一連の処理を通じて1遊技が実行される。以後は、ステップS2100からステップS2900までを繰り返すこととなる。
次に、主制御基板500における電源断時退避処理およびタイマ割込み処理について説明する。
(主制御基板500の電源断時退避処理)
図97は、主制御基板500における電源断時退避処理を説明するフローチャートである。メインCPU500aは、電源断検知回路を監視しており、電源電圧が所定値以下になると、割り込んで電源断時退避処理を実行する。
(ステップS3000-1)
電源断予告信号が入力されると、メインCPU500aは、レジスタを退避する。
(ステップS3000-3)
メインCPU500aは、電源断予告信号をチェックする。
(ステップS3000-5)
メインCPU500aは、電源断予告信号を検出しているかを判定する。その結果、電源断予告信号を検出していると判定した場合にはステップS3000-11に処理を移し、電源断予告信号を検出していないと判定した場合にはステップS3000-7に処理を移す。
(ステップS3000-7)
メインCPU500aは、レジスタを復帰させる。
(ステップS3000-9)
メインCPU500aは、割込みを許可するための処理を行い、当該電源断時退避処理を終了する。
(ステップS3000-11)
メインCPU500aは、出力ポートの出力を停止する出力ポートクリア処理を実行する。
(ステップS3000-13)
メインCPU500aは、別領域についての電源断時の退避処理を実行する。
(ステップS3000-15)
メインCPU500aは、メインRAM300cへのアクセスを禁止するために必要なRAMプロテクト設定処理を実行する。
(ステップS3000-17)
メインCPU500aは、電源断発生監視時間を設定すべく、ループカウンタのカウンタ値に所定の電源断検出信号検出回数をセットする。
(ステップS3000-19)
メインCPU500aは、上記ステップS3000-17でセットしたループカウンタの値を1減算する。
(ステップS3000-21)
メインCPU500aは、ループカウンタのカウンタ値が0でないかを判定する。その結果、カウンタ値が0ではないと判定した場合にはステップS3000-19に処理を移し、カウンタ値が0であると判定した場合には上記したCPU初期化処理(ステップS1000)に移行する。
なお、実際に電源断が生じた場合には、ステップS3000-19~ステップS3000-21をループしている間にスロットマシン400の稼働が停止する。
(主制御基板500のタイマ割込み処理)
図98は、主制御基板500におけるタイマ割込み処理を説明するフローチャートである。主制御基板500には、所定の周期(同時回し参考例では1.49ミリ秒、以下「1.49ms」という)毎にクロックパルスを発生させるリセット用クロックパルス発生回路が設けられている。そして、リセット用クロックパルス発生回路によって、クロックパルスが発生すると、割り込んで、以下のタイマ割込み処理が実行される。
(ステップS3100-1)
メインCPU500aは、レジスタを退避する。
(ステップS3100-3)
メインCPU500aは、割込みフラグをクリアする。
(ステップS3100-5)
メインCPU500aは、各種の入力ポートイメージを読み込み、最新のスイッチ状態を正確に取得するためのポート入力処理を実行する。
(ステップS3100-7)
メインCPU500aは、セットされた出力イメージを出力ポートに出力し、メインクレジット表示部430、メイン払出表示部432、投入枚数表示器、スタート表示器、ストップスイッチ420a、420b、420cの表示器、リプレイ表示器、区間表示器460を点灯制御するダイナミックポート出力処理を実行する。
(ステップS3100-9)
メインCPU500aは、タイマ割込み用フェーズを更新する。なお、タイマ割込み用フェーズは、0~3のいずれかであり、ここでは、タイマ割込み用フェーズが0、1、2の場合には1加算され、タイマ割込み用フェーズが3の場合には0に変更される。
(ステップS3100-11)
メインCPU500aは、送信バッファに格納されたコマンドを副制御基板502に送信するためのサブコマンド送信処理を行う。
(ステップS3100-13)
メインCPU500aは、ステッピングモータ452を制御するステッピングモータ制御処理を実行する。
(ステップS3100-15)
メインCPU500aは、メダル払出装置442へ出力する出力イメージを出力する出力ポートイメージ出力処理を実行する。
(ステップS3100-17)
メインCPU500aは、各種乱数を更新する乱数更新処理を実行する。
(ステップS3100-19)
メインCPU500aは、エラーに対応する外部信号(外部信号4、5)を外部に出力するためにエラーを検出する不正監視処理を実行する。
(ステップS3100-21)
メインCPU500aは、上記ステップS3100-9で更新したタイマ割込み処理用フェーズに対応するモジュール(サブルーチン)を実行する。ここで、タイマ割込み処理用フェーズは0~3のいずれかに設定されており、タイマ割込み処理用フェーズ0~3それぞれに対応するモジュールが1つずつ設けられているため(合計4つ)、1つのモジュールは、タイマ割込み処理の4回に1回(5.96ms毎に)実行されることになる。例えば、各種タイマを減算する時間監視処理を実行するモジュールが1つのタイマ割込み処理用フェーズに対応付けられている。
(ステップS3100-23)
メインCPU500aは、試験信号を外部に出力する試験信号出力処理を実行する。
(ステップS3100-25)
メインCPU500aは、各種の入力ポートイメージを読み込み、最新のスイッチ状態を正確に取得するためのポート入力処理を実行する。
(ステップS3100-27)
メインCPU500aは、レジスタを復帰する。
(ステップS3100-29)
メインCPU300aは、割込みを許可し、当該タイマ割込み処理を終了する。
また、上述した実施形態では、主制御基板500と副制御基板502とが、遊技を進行するための機能部を分担するように配したが、主制御基板500の機能部を副制御基板502に配しても、副制御基板502の機能部を主制御基板500に配してもよく、また、全ての機能部を1の制御基板に纏めて配することもできる。
また、上述した実施形態では、AT演出状態が1種類のみ設けられるようにしたが、例えば、AT演出状態の継続遊技数の上乗せ特化ゾーンなど、複数種類のAT演出状態が設けられるようにしてもよい。
また、上記した実施形態では、遊技価値としてのメダルを用いて遊技を行うようにしたが、遊技価値は電気的な情報であってもよい(所謂メダルレスであってもよい)。この場合、当選役が入賞したときに、当選役に対応する価値量を遊技者に電気的な情報で付与すればよい。
また、上述した主制御基板500および副制御基板502が行う各処理は、必ずしもフローチャートとして記載された順序に沿って時系列に処理する必要はなく、並列的あるいはサブルーチンによる処理を含んでもよい。
また、上述した主制御基板500および副制御基板502が行う各処理は、必ずしもフローチャートとして記載された順序に沿って時系列に処理する必要はなく、並列的あるいはサブルーチンによる処理を含んでもよい。
<主制御基板のCPU周辺の構成>
図99は、メインCPU300a周辺の電気的な接続を説明するための図である。メインCPU300aは、CPUコア700とバスコントローラ702とを含む。CPUコア700は、BC端子から出力されるバス制御信号(Bus Cont)を通じてバスコントローラ702を制御し、メインROM300b、メインRAM300c、もしくは、入出力部704からデータを読み出し、または、メインRAM300cや入出力部704にデータを書き込む。なお、ここでは、メインCPU300aとして、Z80系CPUをベースとするエルイーテック(LETech)社が販売するマイクロプロセッサを用いている。なお、ここでは、パチンコ機のメインCPU300a、メイン、ROM300b、メインRAM300cを挙げて説明するが、スロットマシン400のメインCPU500a、メイン、ROM500b、メインRAM500cに置き替え可能なのは言うまでもない。
例えば、メインROM300b、メインRAM300c、または、入出力部704からデータを読み出す場合、バスコントローラ702は、16ビットのアドレス(A[16])信号を出力し、デコーダ706a、706b、706cを通じてメインROM300b、メインRAM300c、または、入出力部704のいずれかを特定するとともに、リード(RD)信号を制御して、メインROM300b、メインRAM300c、または、入出力部704からデータ(D[8])信号を読み出す。また、メインRAM300c、または、入出力部704にデータを書き込む場合、バスコントローラ702は、アドレス(A[16])信号およびデータ(D[8])信号を出力し、デコーダ706b、706cを通じてメインRAM300c、または、入出力部704のいずれかを特定するとともに、ライト(WR)信号を制御して、メインRAM300c、または、入出力部704にデータ(D[8])信号を書き込む。
ここでは、後述するように、入出力部704のアドレス空間を、メインROM300bおよびメインRAM300cのアドレス空間と一体化している。したがって、従来、メモリとI/Oのいずれにアクセスするかを特定するための信号を出力するメモリリクエスト(MREQ)端子およびI/Oリクエスト(IORQ)端子を設けていない。かかる2端子を任意の他の信号に割り当て直すことで、プログラム開発の自由度を高めることができる。
また、CPUコア700には、割込処理の開始トリガとなる割り込み/待ち(INT/WAIT)信号、最優先で割込処理を実行できるマスク不可割込(NMI)信号、バス信号をハイインピーダンスに遷移可能なバスリクエスト(BUSREQ)信号等の外部信号も入力される。
図100は、CPUコア700の内部構成を示したブロック図である。CPUコア700は、外部入力ユニット710、状態制御ユニット712、中央制御ユニット714、レジスタユニット716、算術論理演算装置(ALU)718を含む。外部入力ユニット710は、外部信号を受信し、その外部信号に基づいた制御情報を状態制御ユニット712および中央制御ユニット714に出力する。
状態制御ユニット712は、入力された制御情報に基づいて、内部状態(RESET、命令フェッチ、命令デコード、演算、メモリロード、メモリストア、HALT等)を管理および遷移させてCPUコア700の動作状態を決定するとともに、その動作状態に基づいた制御情報を中央制御ユニット714に出力する。
中央制御ユニット714は、バスコントローラ702を経由して入力された入力データ(DI[8])からオペコード(命令)を抽出し、命令デコーダによってデコードしたコマンドに基づいてALU718を制御する。また、中央制御ユニット714は、デコードしたコマンドによりレジスタユニット716の各レジスタから必要な情報を取得したり、各レジスタを更新したりする。
レジスタユニット716は、セレクタポート722a、722b、722c、入力側バンクセレクタ724、第1レジスタバンク726、第2レジスタバンク728、出力側バンクセレクタ730、アドレスポート732、個別レジスタ734を含む。なお、個別レジスタ734には、次に実行すべきプログラムのアドレスを示す16ビットのプログラムカウンタ(PC)、割込モード時に使用される8ビットのインタラプト(I)レジスタ、オペコードフェッチサイクルを計数する8ビットのリフレッシュ(R)レジスタ、割込の許可/禁止を制御する8ビットの割込許可(IFF)レジスタが含まれる。
また、レジスタユニット716には、大役抽選に係る種々の乱数値(大当たり決定乱数、当たり図柄乱数、リーチグループ決定乱数、リーチモード決定乱数、変動パターン乱数、当たり決定乱数)を取得するための乱数発生器(図示せず)が対応付けられ、入力ポート(FE73h~FE9Ch)を介してラッチされた乱数値が取得される。
乱数発生器は、システムクロック(外部入力を2分周したクロック)で動作し、所定の最大値未満の乱数を発生する。なお、乱数発生器は、乱数の最大値を設定可能な乱数発生器である最大値設定乱数発生器として、16ビットの最大値を設定可能な乱数発生器が4チャンネル、8ビットの最大値を設定可能な乱数発生器が8チャンネル準備されている。ここで、16ビットの最大値設定乱数発生器は、乱数更新周期が32~47クロックの範囲で選択でき、最大値の設定範囲が256~65535の範囲で設定できる。また、8ビットの最大値設定乱数発生器は、乱数更新周期が16~31クロックの範囲で選択でき、最大値の設定範囲が4チャンネルで16~255の範囲で設定でき、他の4チャンネルで64~255の範囲で設定できる。また、乱数の最大値が固定された乱数発生器である最大値固定乱数発生器として、16ビットの最大値を設定可能な乱数発生器が4チャンネル、8ビットの最大値を設定可能な乱数発生器が8チャンネル準備されている。ここで、16ビットの最大値固定乱数発生器は、乱数更新周期が1クロックに、最大値が65535に固定されている。また、8ビットの最大値固定乱数発生器は、乱数更新周期が1クロックに、最大値が255に固定されている。
なお、乱数の種類が足りない場合、ハードウェア乱数生成部(乱数発生器)から取得した乱数値に、プログラム内において所定の数値を乗じ、また、除算することで他の乱数を生成する(ソフトウェア乱数生成部)ことも可能である。
図101は、レジスタの構成を説明した図である。レジスタユニット716には、第1レジスタバンク(バンク0)726と、第1レジスタバンク726と対(ペア)となる第2レジスタバンク(バンク1)728が設けられている。また、第1レジスタバンク726には、メインレジスタ群(表レジスタ群)726aと、メインレジスタ群726aと対となるサブレジスタ群(裏レジスタ群)726bが設けられ、第2レジスタバンク728には、メインレジスタ群728aと、メインレジスタ群728aと対となるサブレジスタ群728bが設けられている。第1レジスタバンク726のメインレジスタ群726aおよびサブレジスタ群726b、ならびに、第2レジスタバンク728のメインレジスタ群728aおよびサブレジスタ群728bには、いずれも、8ビットのレジスタ(Q、A、F、B、C、D、E、H、L)と、16ビットのレジスタ(IX、IY)が含まれる。ただし、メインレジスタ群726a、728aには、サブレジスタ群726b、728bと異なり、さらに、8ビットのレジスタ(U)と16ビットのレジスタ(SP)が含まれている。メインCPU300a、500aは、第1レジスタバンク726と第2レジスタバンク728とを切り換えて利用し、後述するFレジスタにおけるレジスタバンク指定レジスタRBの示す一方のレジスタバンクのみにアクセスでき、そのレジスタバンクと対になる他方のレジスタバンクには同時にアクセスすることができない。
図101に示すレジスタのうち、Qレジスタは、拡張レジスタとして、各レジスタバンクに2セット設けられ、一部のコマンドにおいて用いられるアドレスの上位バイトを格納する8ビットのレジスタである。かかるQレジスタの値として、例えば、F0hが設定されている場合、メインCPU300a、500aは、メインRAM300cのF000h~F0FFhへのアクセスにQレジスタを利用することができる。Uレジスタは、拡張レジスタとして、各レジスタバンクに1セット設けられ、一部のコマンドにおいて用いられるアドレスの上位バイトを格納する8ビットのレジスタである。かかるUレジスタの値として、例えば、FEhが設定されている場合、メインCPU300a、500aは、FE00h~FFFFhの入出力部704に接続された内蔵デバイス(タイマ、乱数発生器、外部入出力回路等)へのアクセスにUレジスタを利用することができる。Aレジスタは、演算処理やデータ転送に使う8ビットのアキュムレータとしても機能する汎用レジスタである。Fレジスタは、各種演算結果を保持する8ビットのフラグレジスタである。ここで、Fレジスタの各ビットは、図101に示すように、最上位ビット(MSB:Most Significant Bit)から最下位ビット(LSB:Least Significant Bit)にかけて、Sは、演算結果が負のとき1にセットされるサインフラグであり、Zは、演算の結果、全ビットが0のとき1にセットされるゼロフラグ(第1ゼロフラグ)であり、TZは、データ転送命令(LD;ロード)の実行により、全ビットが0のとき1にセットされる(値の変わる)遊技機用拡張仕様の特定ビットフラグ(第2ゼロフラグ)であり、ティーゼットフラグと呼ぶ場合もある。Hは、プログラマーが関与できないハーフキャリーフラグであり、RB(レジスタバンク指定レジスタ)は、現在のレジスタバンク(第1レジスタバンク726=0、第2レジスタバンク728=1)を示すレジスタバンクモニタであり、P/Vは、パリティオーバーフローフラグであり、Nは、プログラマーが関与できない加減算フラグであり、Cは、演算の結果、桁上げまたはボロー発生時に1がセットされるキャリーフラグである。なお、Fレジスタは、AレジスタとペアレジスタAFを構成する。
また、Bレジスタ、Cレジスタ、Dレジスタ、Eレジスタ、Hレジスタ、Lレジスタは、各レジスタバンクに2セット設けられた8ビットの汎用レジスタであり、それぞれ予め組合せが定められている16ビットのペアレジスタ(例えば、レジスタBC、DE、HL、その他複数の組み合わせが存在する)を構成して利用される。IXレジスタ、IYレジスタは、インデックスアドレッシングに用いられる16ビットの汎用レジスタである。SP(スタックポインタ)レジスタは、16ビットであり、スタックポインタとなるアドレスを格納する。Q’レジスタ、A’レジスタ、F’レジスタ、B’レジスタ、C’レジスタ、D’レジスタ、E’レジスタ、H’レジスタ、L’レジスタ、IX’レジスタ、IY’レジスタは、Qレジスタ、Aレジスタ、Fレジスタ、Bレジスタ、Cレジスタ、Dレジスタ、Eレジスタ、Hレジスタ、Lレジスタ、IXレジスタ、IYレジスタのメインレジスタ群726a、728aとの交換命令または転送命令によりデータ(内容)交換またはデータ転送可能なサブレジスタ群726b、728bであり、A’レジスタとF’レジスタでペアレジスタAF’を構成し、B’レジスタとC’レジスタでペアレジスタBC’を構成し、D’レジスタとE’レジスタでペアレジスタDE’を構成し、H’レジスタとL’レジスタでペアレジスタHL’を構成して利用される。なお、ペアレジスタはBC’、DE’、HL’に限らず、その他複数の組み合わせが存在する。一方、Uレジスタ、SPレジスタについては、各レジスタバンクに1セット設けられている。
ところで、上述したように、主制御基板300、500においては、メインCPU300aが、メインROM300bに格納されたプログラムに基づきメインRAM300cと協働して遊技の進行を制御する。これらの機能部を実行するためのプログラムは、メインROM300bおよびメインRAM300cの所定の領域(使用領域)に配される。
図102は、メモリマップを示す説明図である。なお、パチンコ機におけるメモリマップについては、図5を用いて既に説明されているので、ここでは、スロットマシン400のメモリマップを挙げて説明する。メインROM500bには、0000h~3FFFh(12kbyte)のメモリ空間が割り当てられ、メインRAM500cには、F000h~F3FFh(1kbyte)のメモリ空間が割り当てられ、入出力部704には、FE00h~FFFFh(512byte)のメモリ空間が割り当てられている。なお、プログラムの命令コードはアセンブラ言語で記述されている。ここで、プログラムは、命令コードで構成されたものであり、コンピュータに読み出され、データやワークエリアと協働して所定の処理を実現することができる。
メインROM500bの0000h~1DF3hのメモリ空間には使用領域が割り当てられている。使用領域は、遊技の進行を制御する遊技制御処理を実行するためのプログラムやデータを格納する領域である。具体的に、0000h~11FFh(4.5kbyte)に制限されたメモリ空間(制御領域)に、初期化手段600、ベット手段602、当選種別抽選手段604、リール制御手段606、判定手段608、払出制御手段610、遊技状態制御手段612、演出状態制御手段614、コマンド送信手段616を機能させて遊技の進行を制御する遊技制御処理を実行するためのプログラムの命令コードが格納され、1200h~1DF3h(3.0kbyte)に制限されたメモリ空間(データ領域)に、遊技制御処理のプログラムに用いられるデータが格納されている。また、1E00h~1FFFhのメモリ空間にはコメント領域が割り当てられ、3FC0h~3FFFhのメモリ空間にはプログラム管理領域が割り当てられている。また、2000h~3FBFhのメモリ空間には別領域(使用外領域)が割り当てられている。別領域は、後述するように、使用領域に格納することが定められていないプログラムやデータを格納する領域である。具体的に、2000h~3FBFhのメモリ空間には、遊技の進行に影響を及ぼさない、遊技機用試験処理やセキュリティ関連処理のうち一部または全部の処理(以降では、単に遊技制御外処理という場合がある)を遂行するプログラムの命令コードおよびプログラムデータが格納されている。ここで、遊技機用試験処理は、回胴式遊技機用試験機の接続仕様書(第四版)に記載されているスロットマシン400の試験処理である。セキュリティ関連処理は、第三者の不正防止や不具合発見を目的とした異常状態を特定する処理であり、例えば、上述したバックアップフラグの判定やチェックサムの実行も含まれる。なお、別領域に記憶容量の制限はなく、図102の例では、使用領域、コメント領域、および、プログラム管理領域以外の記憶領域に、自由に割り当てることができる。
上記のように、メインCPU500aは、遊技制御処理のみならず、遊技機用試験処理、セキュリティ関連処理(遊技制御外処理)も遂行する場合がある。しかし、使用領域の記憶容量は予め定められており、例えば、図102に示したように、制御領域が4.5kbyteに制限され、データ領域が3.0kbyteに制限されている。したがって、遊技制御処理のみならず、遊技機用試験処理、セキュリティ関連処理のプログラムやデータまでも使用領域に配すると、その分、遊技制御処理を行うための記憶領域が制限されてしまう。ここで、遊技制御処理を実行するためのプログラム(使用プログラム)やデータは、必ず使用領域に格納しなければならないが、遊技制御処理以外の遊技の進行に影響を及ぼさない遊技制御外処理(遊技機用試験処理、セキュリティ関連処理等)を実行するためのプログラム(別プログラム)やデータは使用領域および別領域のいずれにも格納することができる。そこで、セキュリティ関連処理に該当する処理であるバックアップフラグの判定処理やチェックサムの実行処理を実行するためのプログラムやデータの少なくとも一部を、使用領域とは異なる(使用領域以外の)記憶領域のうちの一部である別領域に記述している。
このように使用領域で遂行される処理(ここでは、遊技制御処理)と、必ずしも使用領域で行わなくてよい処理(ここでは、セキュリティ関連処理)とが混在している場合には、遊技制御処理を実行するためのプログラム(使用プログラム)やデータを使用領域に格納し、使用領域で行わなくてよい、遊技制御処理以外の遊技の進行に影響を及ぼさない遊技制御外処理(セキュリティ関連処理)を実行するためのプログラム(別プログラム)やデータを別領域に格納することが望ましい。このように記憶領域を複数に区分することで、別領域に移動させたプログラムの分だけ使用領域の記憶領域(容量)に余裕が生じる。したがって、その分、使用領域を遊技制御処理(使用プログラム)に割り当てることが可能となる。
ただし、上記のように記憶領域を、使用領域、別領域とで役割分担した場合においても、遊技機の公正さは担保されなくてはならない。そこで、遊技機の公正さを担保しつつ、使用領域と別領域とで適切に役割分担するために、以下の(1)~(6)の条件を規定する。
条件(1)、別領域に配置するプログラムについては、遊技機の試験に必要な信号の出力(遊技機用試験処理)および不正防止(セキュリティ関連処理)を目的として使用され、遊技の公正を害さない(損なわない)ものであること。条件(2)、使用領域と別領域の制御領域およびデータ領域については、それぞれを明示的に区別された領域に配置すること。条件(3)、別領域に配置するプログラム(別プログラム)は、使用領域のプログラム(使用プログラム)から静的に呼び出された上で実行されること。また、その際のプログラムリストにおいては、呼び出し先アドレスが明らかに記載されていること。条件(4)、別領域に配置するプログラムは機能ごとにモジュール化し、呼び出された際には、使用領域で利用している全レジスタの内容を保護すること。条件(5)、使用領域または別領域から互いの領域にあるRAMへのアクセスは参照のみ可能とし、更新は不可とすること。条件(6)、別領域の制御領域から使用領域の制御領域にあるサブルーチンを呼び出すことは不可とすること。なお、使用領域に割込処理を行うサブルーチンを設けることから、別領域の制御領域を使用する際には、割込禁止にする必要が生じる。なお、遊技制御処理を適切に遂行するために、割込禁止を行ってから割込禁止を解除するまでの時間は、遊技制御処理における割込処理の間隔(例えば1.49msec)以内とならなければならない。したがって、別領域の制御領域を使用するサブルーチンを呼び出す場合、その1回の呼び出しにかかる総時間は、遊技制御処理の割込処理の間隔以内となるように設定することとなる。
また、メインRAM500cのF000h~F1FFhのメモリ空間には使用領域が割り当てられている。具体的に、F000h~F13Fhのメモリ空間には、上記遊技制御処理のワークエリアが割り当てられ、タイマ、カウンタ、フラグ等の変数管理に用いられる。F1C0h~F1FFhのメモリ空間には、上記遊技制御処理のスタック領域が割り当てられている。また、メインRAM500cのF200h~F3FFhのメモリ空間には別領域が割り当てられている。具体的に、F210h~F22Fhのメモリ空間には、上記セキュリティ関連処理のうち一部または全部の処理のワークエリアが割り当てられ、タイマ、カウンタ、フラグ等の変数管理に用いられる。F230h~F246hのメモリ空間には、上記セキュリティ関連処理のうち一部または全部の処理のスタック領域が割り当てられている。
また、FE00h~FFFFhのメモリ空間には入出力部704が割り当てられている。従来、入出力部704に対応するデバイスにアクセスするため、メモリ空間と独立して512バイトのI/O空間が設けられていた。これに対し、本実施形態では、MREQ、IORQの信号をなくし、メモリ、入出力部704へのアクセスを共通化してRD、WR信号で行うこととした。また、入出力部704に接続されたデバイスにアクセスするための上位8ビットのアドレスを指定するハードウェアとしてのUレジスタを設け、ここに予め8ビットの上位アドレスを指定しておく。これにより、メモリ空間とは独立して設けられていたI/O空間を、メモリ空間に統合して一つのアドレス空間とし、IN命令、OUT命令を実行するとメモリ空間に割り当てられた入出力部704に対し、上位8ビットをUレジスタで指定し下位8ビットはIN命令、OUT命令のオペランドで指定した下位8ビットを用いてアクセス可能とした。
本実施形態では、LDQ命令ではQレジスタの値を用いてメモリ空間(主にデータエリア、ワークエリア)にアクセスし、IN命令、OUT命令ではUレジスタを用いてデバイス(タイマ、乱数発生器、外部入出力回路等)のI/Oにアクセスするようにプログラムを記述できるようになる。かかる構成により、設計時にプログラムを把握し易くなる。また、メモリおよびI/Oを、16ビットのアドレスで特定してアクセスしていたものを下位8ビットのオペランドでアクセスすることが可能になり、プログラム容量を圧縮することができる。さらにQレジスタ、Q’レジスタ、Uレジスタと複数の上位指定レジスタを持つことにより、上位レジスタが1つだけの時よりも上位レジスタの使い回しによる入れ替えの回数が少なくなり、プログラム容量をさらに圧縮することができる。
上記の例ではIN命令、OUT命令でI/O空間に対応するメモリ空間にアクセスしたが、IN命令、OUT命令で直接メモリ空間にアクセスしてもよい。このことは、例えばメモリ上の3つの256バイト領域にアクセスする場合に、Qレジスタ、Q’レジスタ、Uレジスタにそれぞれの上位8ビットを指定しておき、LDQ命令とIN命令、OUT命令でそれぞれの領域にアクセスすることで実現できる。
(遊技情報の表示)
ところで、遊技機、例えば、スロットマシン400では、上述したようなボーナス遊技状態やAT演出状態への移行頻度が偏ると射倖性が過度に高まってしまう懸念がある。そこで、メダルの獲得性能が高い遊技状態が偏っているか否かを統括的かつ画一的に判定すべく、有利区間比率、指示込役物比率、連続役物比率、役物比率、役物等状態比率といった判断基準を設ける。有利区間比率は、初回起動時から、有利区間に滞在している遊技数である滞在遊技数を、遊技数の総数である総遊技数で除算し、%で示した値を言い、指示込役物比率は、初回起動時から、所定の基準集計期間における、ボーナス遊技等、役物の作動および指示機能作動に基づいて払出制御手段610が払い出したメダルの枚数である指示込役物払出数を、払出制御手段610が払い出したメダルの総数である総払出数で除算し、%で示した値を言い、連続役物比率は、初回起動時から、所定の基準集計期間における、レギュラーボーナス遊技等、第1種特別役物の作動によって払出制御手段610が払い出したメダルの枚数である連続役物払出数を、払出制御手段610が払い出したメダルの総数である総払出数で除算し、%で示した値を言い、役物比率は、初回起動時から、所定の基準集計期間における、ボーナス遊技等、役物の作動に基づいて払出制御手段610が払い出したメダルの枚数である役物払出数を、払出制御手段610が払い出したメダルの総数である総払出数で除算し、%で示した値を言い、役物等状態比率は、初回起動時から、所定の基準集計期間における、ボーナス遊技等、役物が作動した遊技数である作動遊技数を、遊技数の総数である総遊技数で除算し、%で示した値を言う。なお、有利区間比率、指示込役物比率、連続役物比率、役物比率、役物等状態比率は、設定変更によってはクリアされない。
このような、有利区間比率、指示込役物比率、連続役物比率、役物比率、役物等状態比率の表示は、図98に示したタイマ割込み処理S3100のダイナミックポート出力処理(SYNMOUTモジュール)S3100-7における使用領域該役比表示取得処理(E_SDPSTモジュール)において実行される。
ここで、有利区間は、非AT演出状態のうちの一部の演出状態(ここでは非有利演出状態)を除く全ての演出状態に滞在している区間を言う。なお、有利区間に対し、非有利演出状態を非有利区間という場合もある。ただし、有利区間として、AT演出状態や非AT演出状態に限らず、遊技者に対し有利に遊技が進行する遊技状態および演出状態のいずれかを任意に設定してもよい。
また、役物は、入賞を容易にするための装置であり、レギュラーボーナス(RB)、チャレンジボーナス(CB)、シングルボーナス(SB)等が該当する。また、かかる役物のうち、レギュラーボーナス(RB)が第1種特別役物に対応する。なお、レギュラービッグボーナス(RBB)は、第1種特別役物であるレギュラーボーナス(RB)の入賞形態を示す図柄組合せの表示によらずにレギュラーボーナス(RB)が連続で作動するものであり、チャレンジビッグボーナス(CBB)は、第2種特別役物(役物のうちの一つ)であるチャレンジボーナス(CB)の入賞形態を示す図柄組合せの表示によらずにチャレンジボーナス(CB)が連続で作動するものである。したがって、連続役物比率は、所定の基準集計期間において払い出された総払出数に対する第1種特別役物の作動によって払い出された連続役物払出数の比率を表すこととなり、役物比率は、所定の基準集計期間において払い出された総払出数に対する役物の作動によって払い出された役物払出数の比率を表すこととなる。
なお、基準集計期間は、払出制御手段610が払い出したメダルの枚数を累積する対象期間である。本実施形態では、例えば、有限の値である6000遊技や、当該スロットマシン400を遊技場(ホール)に設置してから全ての期間(以下、「総累計」という)の2通りを挙げる。したがって、連続役物比率としては、6000遊技の連続役物比率と、総累計の連続役物比率とを導出し、役物比率としては、6000遊技の役物比率と、総累計の役物比率とを導出する。ただし、基準集計期間として、任意の遊技数を設定できるのは言うまでもない。
このような、有利区間比率、指示込役物比率、連続役物比率、役物比率、役物等状態比率を求めるべく、累積手段(図示せず)は、総遊技数、滞在遊技数、作動遊技数、総払出数、指示込役物払出数、連続役物払出数、役物払出数を累積する。このとき、総遊技数、滞在遊技数、作動遊技数、総払出数、指示込役物払出数、連続役物払出数、役物払出数それぞれには、カウンタが対応付けられている。具体的に、累積手段は、1遊技が開始されると、総遊技数を示す総遊技数カウンタを1だけインクリメントする。そして、現在の遊技が有利区間における遊技であるか否か判定し、有利区間における遊技であれば、滞在遊技数を示す滞在遊技数カウンタを1だけインクリメントする。なお、滞在遊技数カウンタの更新は、非有利区間である場合において有利区間に当選した遊技(有利区間への移行処理が行われた遊技)の次遊技から開始される。ただし、レギュラービッグボーナス(RBB)またはチャレンジビッグボーナス(CBB)の当選に基づいて有利区間に当選した場合には当該ボーナスが入賞した遊技(有利区間への移行処理が行われた遊技)の次遊技から開始される。また、現在の遊技が、役物が作動した遊技であるか否か判定し、役物が作動した遊技であれば、作動遊技数を示す作動遊技数カウンタを1だけインクリメントする。
また、累積手段は、その遊技でメダルが払い出されると、総払出数を示す総払出数カウンタを、その払出枚数分だけインクリメントする。そして、当該メダルの払い出しが役物の作動および指示機能作動に基づいていれば、指示込役物払出数を示す指示込役物払出数カウンタを、その払出枚数分だけインクリメントし、当該メダルの払い出しが役物に基づいていれば、役物払出数を示す役物払出数カウンタを、その払出枚数分だけインクリメントし、さらに、当該メダルの払い出しが第1種特別役物に基づいていれば、連続役物払出数を示す連続役物払出数カウンタを、その払出枚数分だけインクリメントする。
なお、総累計については、かかるカウンタのみで計数できるが、連続役物比率および役物比率に関しては、総累計のみならず、基準集計期間、ここでは、6000遊技といった限られた期間も対象にしなければならない。そこで、6000遊技を、例えば、400遊技毎に均等に区分けし、400遊技ずつ計数する複数(例えば15個)のカウンタを設け、リングバッファとして利用する。なお、ここでは、6000遊技を400遊技毎に区分けして計数する例を挙げているが、6000の因数(約数)であれば、区分けする遊技数を任意に設定可能なのは言うまでもない。
具体的に、累積手段は、その遊技でメダルが払い出されると、総払出数カウンタ、連続役物払出数カウンタ、役物払出数カウンタを更新する処理を400遊技まで行い、400遊技に到達すると、過去に計数した14個のカウンタと合算して、総払出数、連続役物払出数、役物払出数を導出する。そして、14個のカウンタのうち最も古い遊技で計数したカウンタを初期化し、その初期化したカウンタによって、新たに400遊技分、総払出数カウンタ、連続役物払出数カウンタ、役物払出数カウンタを更新する。こうして、400遊技毎に、新たな400遊技分の遊技情報と、過去の5600遊技分の遊技情報とを参照することができるので、直近の6000遊技の総払出数、連続役物払出数、役物払出数を導出することが可能となる。なお、かかるカウンタによる計数は、規定数や設定値に拘わらず常に実行される。このようにして、総遊技数、滞在遊技数、作動遊技数、総払出数、指示込役物払出数、連続役物払出数、役物払出数がそれぞれ累積される。
続いて、比率導出手段(図示せず)は、累積手段が累積した、総遊技数、滞在遊技数、作動遊技数、総払出数、指示込役物払出数、連続役物払出数、役物払出数に基づいて有利区間比率、指示込役物比率、連続役物比率、役物比率、役物等状態比率を導出する。具体的に、比率導出手段は、滞在遊技数を総遊技数で除算し、%換算して有利区間比率を導出し、総累計の指示込役物払出数を総累計の総払出数で除算し、%換算して総累計の指示込役物比率を導出し、総累計の連続役物払出数を総累計の総払出数で除算し、%換算して総累計の連続役物比率を導出し、総累計の役物払出数を総累計の総払出数で除算し、%換算して総累計の役物比率を導出し、作動遊技数を総遊技数で除算し、%換算して役物等状態比率を導出する。また、比率導出手段は、400遊技毎に、6000遊技の連続役物払出数を6000遊技の総払出数で除算し、%換算して6000遊技の連続役物比率を導出し、6000遊技の役物払出数を6000遊技の総払出数で除算し、%換算して6000遊技の役物比率を導出する。
次に、比率表示手段(図示せず)は、所定の表示指令に基づいて、比率導出手段が導出した有利区間比率、指示込役物比率、6000遊技の連続役物比率、6000遊技の役物比率、総累計の連続役物比率、総累計の役物比率、役物等状態比率を比率表示部860に表示する。
図103は、主制御基板500の外観を示した説明図である。図103(a)に示すように、主制御基板500の端側には複数のコネクタ870が設けられ、また、主制御基板500の中央近傍には比率表示部860が設けられている。比率表示部860は、十進のアラビア数字を表すことができる7つのセグメントと、その右下に位置するドットセグメント(DP)とからなる7セグメントを4つ並置して構成される。そして、主制御基板500をスロットマシン400に組み込む際には、図103(b)のように、主制御基板500を基板ケース872に収容し、基板ケース872の前面部位872aに主制御基板500の背面からビス874で固定する。基板ケース872の前面部位872aにおける、比率表示部860に対応する位置には、比率表示部860を視認可能な透過窓872bが設けられている。したがって、管理者は、図74に示したように、前面上扉404を開放した状態で、当該透過窓872bを通じ、比率表示部860の表示内容を視認することができる。なお、かかる透過窓872bの代わりに、基板ケース872全体を透過または半透過な材質で形成してもよい。
ここでは、比率表示部860を構成する4つの7セグメントのみで、有利区間比率、6000遊技の連続役物比率、6000遊技の役物比率、総累計の連続役物比率、総累計の役物比率といった5つの遊技情報を表示するため、各比率に識別子を対応付け、比率表示部860には、その識別子と各比率とを順次表示することとする。なお、各比率は、0~99の範囲で示される。したがって、4つの7セグメントのうち、左側に位置する2つの7セグメントで識別子を示し、右側に位置する2つの7セグメントで比率を示す。
図104は、比率表示部860の表示態様を説明するための説明図である。電源スイッチ444をONすると、図104(a)のように、比率表示手段は、有利区間比率に対応する識別子である「7U」と、その比率である、例えば「70」%とを一度に表示する(所謂7Uタイプ)。また、スロットマシン100によっては、有利区間比率の代わりに指示込役物比率を表示することもできる。この場合、比率表示手段は、指示込役物比率に対応する識別子である「7P」と、その比率である、例えば「70」%とを一度に表示する(所謂7Pタイプ)。ここで、7Uタイプでは、設定差のある当選種別を参照して有利区間に移行させる抽選を行うことは可能であるが、設定値を直接参照して有利区間に移行させる抽選を行うことはできない。一方、7Pタイプでは、設定差のある当選種別、および、設定値のいずれも参照して有利区間に移行させる抽選を行うことが可能である。なお、比率表示手段は、比率表示部860の2つめの7セグメントのドットセグメントを点灯することで識別子と比率とを区切っている。
この状態で、所定時間(例えば5.0sec)が経過すると、図104(b)ように、比率表示手段は、6000遊技の連続役物比率に対応する識別子である「6Y」と、その比率である「60」%とを一度に表示する。そして、所定時間が経過する度に、図104(c)のような、6000遊技の役物比率に対応する識別子である「7Y」と、その比率である「70」%との組み合わせ、図104(d)のような、総累計の連続役物比率に対応する識別子である「6A」と、その比率である「60」%との組み合わせ、図104(e)のような、総累計の役物比率に対応する識別子である「7A」と、その比率である「70」%との組み合わせ、図104(f)のような、役物等状態比率に対応する識別子である「5H」と、その比率である「50」%との組み合わせが順次表示される。また、図104(f)のように、役物等状態比率に対応する識別子である「5H」と、その比率である「50」%との組み合わせが表示されている状態で、さらに所定時間が経過すると、図104(a)に示した、有利区間比率に対応する識別子である「7U」と、その比率である「70」%とが再度表示され、以後、所定時間が経過する度に、有利区間比率(指示込役物比率)、6000遊技の連続役物比率、6000遊技の役物比率、総累計の連続役物比率、総累計の役物比率、役物等状態比率の順で表示が切り換わる。
なお、ここでは、4つの7セグメントで識別子と比率を同時に示す例を挙げて説明したが、2つの7セグメントのみを用い、識別子と比率とを切り換えて表示することもできる。この場合、比率表示手段は、比率表示部860において、所定時間が経過する度に、例えば、「7U」→「70」→「6Y」→「60」→「7Y」→「70」→「6A」→「60」→「7A」→「70」→「5H」→「50」といった順に表示を切り替える。
なお、比率表示手段は、主制御基板500の比率表示部860に代えて、4つの7セグメントに対応する既存の表示部(メインクレジット表示部430およびメイン払出表示部432)に識別子と比率とを切り換えて表示することもできる。この場合、1遊技の結果が報知された後、次の遊技の開始までに、前面上扉404を開放し、その状態で、既存のスイッチ、例えば、設定値を設定または変更する操作を実行するスイッチを操作することで、有利区間比率に対応する識別子と、その比率が表示され、以後、所定時間が経過する度に、有利区間比率(指示込役物比率)→6000遊技の連続役物比率→6000遊技の役物比率→総累計の連続役物比率→総累計の役物比率→指示込役物比率の順で表示が繰り返し切り換わることとなる。なお、比率表示手段が既存の表示部に、有利区間比率(指示込役物比率)、6000遊技の連続役物比率、6000遊技の役物比率、総累計の連続役物比率、総累計の役物比率、役物等状態比率を表示している間であっても、メダルの投入等、スロットマシン400の状態に変化があった場合には、その表示を削除する。
管理者は、このような比率表示部860または既存の表示部を通じて、有利区間比率、指示込役物比率、6000遊技の連続役物比率、6000遊技の役物比率、総累計の連続役物比率、総累計の役物比率、役物等状態比率といった遊技情報を視認することができる。そして、遊技情報が適切な範囲に収まっているか否かを判定し、スロットマシン400が適正に動作しているかを判断することが可能となる。
かかる適切な範囲は、例えば、有利区間比率<70%、、指示込役物比率<70%、6000遊技の連続役物比率<60%、6000遊技の役物比率<70%、総累計の連続役物比率<60%、総累計の役物比率<70%、役物等状態比率<50%と設定している。かかる適切な範囲を逸脱している場合、比率表示手段は、その対象となる比率に関し、比率表示部860の各セグメントを例えば0.6sec周期で点滅させるとしてもよい。かかる点滅表示により、管理者は、適切な範囲を逸脱している識別子およびその比率を迅速に把握することが可能となる。
ところで、上述したように、比率導出手段は、滞在遊技数を総遊技数で除算して有利区間比率を導出し、総累計の指示込役物払出数を総累計の総払出数で除算して総累計の指示込役物払出数を導出し、総累計の連続役物払出数を総累計の総払出数で除算して総累計の連続役物払出数を導出し、総累計の役物払出数を総累計の総払出数で除算して総累計の役物払出数を導出し、作動遊技数を総遊技数で除算して役物等状態比率を導出している。しかし、主制御基板500におけるメインCPU500aは処理能力が低く、かかるメインCPU500aで利用可能な乗算命令や除算命令は、被乗数、乗数、被除数、および、除数となる数値の範囲が制限されている。例えば、メインCPU500aでの演算命令として予め準備されている、除算を実行するDIV命令には、被除数および除数のいずれも数値範囲が2バイトに制限される場合があり、つまり、0~65535までの範囲までしか取り扱うことができない場合がある。そうすると、総遊技数が、例えば175000遊技以上となる場合、数値範囲を超えてしまい、単純に2バイトのDIV命令を利用することができない。この場合、人が筆算で除算を行うのと同様、加算および減算を繰り返すプログラムを別途準備しなければならず、処理負荷の増大を招くこととなる。そこで、本実施形態では、処理負荷の増大を抑えつつ、遊技情報を適切に得ることを目的とする。
なお、上記では、スロットマシン400において、例えば、有利区間比率、指示込役物比率、6000遊技の連続役物比率、6000遊技の役物比率、総累計の連続役物比率、総累計の役物比率、役物等状態比率といった遊技情報を比率表示部860に表示する例を挙げて説明した。パチンコ機においては、例えば、所定の基準集計期間における、賞球数(低確時かつ時短無し時の払出個数である低確払出個数)を、アウト数(低確時かつ時短無し時のアウト個数である低確アウト個数)で除算し、%で示したベース値を性能表示モニタ(比率表示部860)に表示するとしてもよい。なお、パチンコ機におけるベース値では、スロットマシン400のように、小数点以下を切り捨てしないで、四捨五入する。
(各比率の導出処理)
ここでは、各比率(有利区間比率、指示込役物比率、連続役物比率、役物比率、役物等状態比率)を導出する処理例を複数挙げて説明するが、まず、その複数の処理に共通する部分を詳述する。本実施形態では、有利区間比率、指示込役物比率、連続役物比率、役物比率、役物等状態比率として、最終的に%に換算された値を求めることとなる。これは、除算した結果に対し、小数点以下2桁のみが必要であることを示す。また、スロットマシン400では、%に換算した場合の小数点以下の値は切り捨てとしている。これは、除算した結果に対し、小数点以下2桁のみを導出できれば、小数点以下3桁以降の演算を要さないことを意味する。したがって、本実施形態では、除算の結果を2桁繰上すべく、所定の乗数(ここでは100)を乗じる。なお、ここでは、小数点2桁のみが必要なので乗数として「100」を乗じる例を挙げたが、小数点3桁が必要な場合は乗数として「1000」を乗じる等、必要な桁数に応じて乗数を変更することができる。
また、ここでは、導出処理の対象として「役物比率」を挙げて説明するが、有利区間比率、指示込役物比率、連続役物比率、役物等状態比率にも同様の処理が適用できるのは言うまでもない。役物比率は、上述したように、役物払出数を総払出数で除算し、%換算して導出される。かかる「%換算する」点が乗数「100」を乗じることに相当する。したがって、役物比率=役物払出数÷総払出数×100といった式で表すことができる。しかし、役物払出数≦総払出数となるので、役物払出数=総払出数ではない限り、この式の順では役物払出数÷総払出数の時点で必ず小数点以下の値となってしまい、例えば、メインCPU500aでは演算不能となる。
そこで、演算順を変更し、役物比率=役物払出数×100÷総払出数といった順、すなわち、まず、役物払出数に乗数(100)を乗じ、その後、乗数を乗じた結果(被除数)を総払出数で除算する順で演算を行う。こうすることで、小数点以下の演算を行うこと無く、整数のみで演算結果を完結することが可能となり、結果的に、小数点以下の切り捨てが簡易に実現される。
図105は、役物比率の演算例を示すフローチャートである。図105の例では、仮に、役物払出数が「7123」、総払出数が「10000」であるとして役物比率を導出する。ここでは、例えば、除算を減算に置き換えることで、数値範囲(0~65535)を超えた数の除算を実現している。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。
まず、比率導出手段は、役物払出数が総払出数より大きいか否か判定する(S1)。その結果、役物払出数が総払出数より大きいと判定されれば(S1におけるYES)、役物払出数または総払出数が適正な数値ではないとして、役物比率が異常であるという結果を導出し、当該演算処理を終了する(S2)。役物払出数が総払出数以下であると判定されれば(S1におけるNO)、比率導出手段は、総払出数が0であるか否か判定する(S3)。その結果、総払出数が0、すなわち、まだメダルの払い出しが行われていない状態であれば(S3におけるYES)、役物比率が0%であると決定して当該演算処理を終了する(S4)。総払出数が0ではないと判定されれば(S3におけるNO)、比率導出手段は、役物払出数と総払出数とが等しいか否か判定する(S5)。その結果、役物払出数と総払出数とが等しいと判定されれば(S5におけるYES)、役物比率が99%であると決定して当該演算処理を終了する(S6)。このように、本実施形態では、役物払出数と総払出数とが等しい場合、役物比率として本来100%と示すところ、99%と表している。こうすることで、役物比率を全て2桁で表すことが可能となる。
役物払出数と総払出数とが等しくないと判定されれば(S5におけるNO)、比率導出手段は、役物払出数「7123」に乗数「100」を乗じ(=「712300」)、被除数(変数)として保持する(S7)。続いて、比率導出手段は、被除数「712300」を除数である総払出数「10000」で除算して商(=「71」)を求める(S8)。かかる商「71」が役物比率となる。これは、役物払出数「7123」を総払出数「10000」で除算した結果を%換算した71.23%の整数部分に相当するので、かかる演算が正しいことが理解できる。
このような役物比率の演算例により、加算、減算、乗算といった簡易な演算のみで、また、整数のみにより、除算を実現することが可能となる。
なお、上記では、役物比率の小数点以下を切り捨てることを前提としたが、かかる場合に限らず、役物比率の小数点以下を四捨五入する場合、負となる最終的な被除数の値(ここでは「-7700」)の絶対値が、除数(総払出数、ここでは「10000」)の1/2より大きければ切り捨て、1/2以下であれば切り上げるとすることで実現できる。
ここでは、さらに、役物比率を算出する際の2段階の演算手順、すなわち、役物払出数×乗数の演算(図105のS7)と、乗算結果÷総払出数(図105のS8)とに分けて、有効な演算手順を模索する。具体的に、まず、役物払出数×乗数を実行する複数の演算手順の有効性を検討し、次に、乗算結果÷総払出数を実行する複数の演算手順の有効性を検討する。
(役物払出数×乗数)
役物払出数を数値として表す場合、その数値範囲から、最大値は3バイトとなり、メモリ容量として3バイト(24ビット)を要す。また、乗数は、ここでは100なので、1バイト(8ビット)で表すことができる。そうすると、役物払出数×乗数の演算は、24ビット×8ビットの演算となる。ここで、メインCPU500aは、8ビット×8ビットの乗算で16ビットの演算結果を得られる8ビットMUL命令を用いて24ビット×8ビットの演算を実行することができる。
また、メインCPU500aには、上述したように、内蔵デバイスとしてメインCPU500aと独立かつ並行して演算を実行可能な乗算器および除算器が内蔵されている。ここで、乗算器は、コマンドの処理と並行して、例えば16ビット×16ビットの乗算を行うものであり、内蔵レジスタの指定のアドレス(被乗数設定レジスタ)に被乗数を書き込み、他の指定のアドレス(乗数設定レジスタ)に乗数を書き込むと、乗算器内で乗算が実行され、所定の時間後、異なる指定のアドレス(乗算結果レジスタ)に、例えば32ビットの乗算結果が設定される機能部である。また、除算器は、コマンドの処理と並行して、例えば32ビット÷32ビットの除算を行うものであり、内蔵レジスタの指定のアドレス(被除数設定レジスタ)に被除数を書き込み、他の指定のアドレス(除数設定レジスタ)に除数を書き込むと、除算器内で除算が実行され、所定の時間後、異なる指定のアドレス(除算結果レジスタ)に、例えば32ビットの除算結果が設定される機能部である。したがって、メインCPU500aでは、上記の8ビットMUL命令に加え、16ビット×16ビットの乗算器(以下、単に16ビット乗算器という)を採用することができる。
ここでは、8ビットMUL命令のみを用いた第1の演算例と、16ビット乗算器を用いた第2の演算例を挙げ、その有効性を比較する。
(役物払出数×乗数を実行する第1の演算例)
図106は、8ビットMUL命令のみを用いた第1の演算例を説明するための説明図である。8ビットMUL命令のみを用いた第1の演算例では、被乗数(3バイト)×乗数(1バイト)の演算をするため、図106に示すように、被乗数をBCDレジスタ(BCレジスタ、および、Dレジスタ)に格納し、8ビットMUL命令を用い、1バイト単位に分離されたDレジスタの値、Cレジスタの値、Bレジスタの値それぞれと乗数(100)とを、その順に乗算する。そして、乗算した結果である、Dレジスタの値×100、Cレジスタの値×100、Bレジスタの値×100それぞれを加算(積算)することで、BCDレジスタの値×100の演算結果(4バイト)を得ることができる。
図107は、第1の演算例を実現するための具体的な処理を示したフローチャートであり、図108は、第1の演算例を実現するための具体的なコマンドの一例を示した図である。かかる図107の説明におけるステップSの数値は、本図の説明においてのみ用いることとする。
図107に示すように、まず、累計役物カウンタの値をBCDレジスタに読み出す(S1)。具体的に、図108の2行目のコマンド「LD A,(_EX_YAKR)」によって、アドレス「_EX_YAKR」に格納されている1バイト値がAレジスタに読み出され、3行目のコマンド「LD D,A」によって、Aレジスタの値がDレジスタに複製され、4行目のコマンド「LD BC,(_EX_YAKR+1)」によって、アドレス「_EX_YAKR+1」に格納されている2バイト値がBCレジスタに読み出される。
次に、図107に示すように、BCDレジスタに格納された累計役物カウンタの値が0であるか否か判定され(S2)、0であれば(S2におけるYES)、乗数を乗じても結果が変わらないので(0なので)、当該第1の演算例を終了する。具体的に、図108の5行目のコマンド「OR A,B」によって、Dレジスタの値と等しいAレジスタの値とBレジスタの値との論理和を演算し、図108の6行目のコマンド「OR A,C」によって、5行目の演算結果であるAレジスタの値とCレジスタの値との論理和を演算し、7行目のコマンド「JR Z,E_PYSAV28」によって、BCDレジスタの論理和が0であれば、他の処理を示す指標「E_PYSAV28」(図示せず)に移動する。なお、コマンド「JR Z,E_PYSAV28」等、Fレジスタの内容によって処理が異なる場合、サイクル数も異なることとなる。例えば、コマンド「JR Z,E_PYSAV28」は、移動を伴う場合、図108のサイクル数のスラッシュより左に示すように3サイクルとなり、移動を伴わない場合、サイクル数のスラッシュより右に示すように2サイクルとなる。以下のコマンドについても、Fレジスタの内容によって処理が異なる場合は同様の表示をしている。
続いて、図107に示すように、被乗数の最下位バイトであるDレジスタの値と乗数(100)とを乗じ(S3)、その演算結果をDEレジスタに設定する(S4)。具体的に、図108の8行目のコマンド「LD A,D」によって、Dレジスタの値をAレジスタに複製し、9行目のコマンド「MUL HL,A,100」によって、Aレジスタの値と100とを乗じた結果をHLレジスタに保持し、10行目のコマンド「EX DE,HL」によって、HLレジスタの値をDEレジスタに設定する。
次に、図107に示すように、被乗数の中位バイトであるCレジスタの値と乗数(100)とを乗じ(S5)、その演算結果にDレジスタの値を加算した結果をDレジスタに戻し(S6)、メインRAM500cに設定する(S7)。具体的に、図108の11行目のコマンド「LD A,C」によって、Cレジスタの値をAレジスタに複製し、12行目のコマンド「MUL HL,A,100」によって、Aレジスタの値と100とを乗じた結果をHLレジスタに保持し、13行目のコマンド「ADDWB HL,D」によって、乗算結果のHLレジスタに、10行目のコマンド「EX DE,HL」によって設定されたDEレジスタのうちの上位1バイト(Dレジスタの値)のみを加算し、14行目のコマンド「LD D,L」によって、加算結果のうち下位1バイトをDレジスタに戻し、15行目のコマンド「EX DE,HL」によって、乗算結果の下位2バイトに相当するDEレジスタの値をHLレジスタに移動し、16行目のコマンド「LD (_EX_WRK2),HL」によって、HLレジスタの2バイト値をアドレス「_EX_WRK2」に格納する。
続いて、図107に示すように、被乗数の最上位バイトであるBレジスタの値と乗数(100)とを乗じ(S8)、その演算結果に、ステップS6の演算結果のうち上位1バイト(Hレジスタの値)とを加算し(S9)、メインRAM500cに設定する(S10)。具体的に、図108の17行目のコマンド「LD A,B」によって、Bレジスタの値をAレジスタに複製し、18行目のコマンド「MUL HL,A,100」によって、Aレジスタの値と100とを乗じた結果をHLレジスタに保持し、19行目のコマンド「ADDWB HL,D」によって、乗算結果のHLレジスタに、15行目のコマンド「EX DE,HL」によって設定されたDEレジスタ(13行目のコマンド「ADDWB HL,D」の演算結果)のうちの上位1バイト(Dレジスタの値)のみを加算し、20行目のコマンド「LD (_EX_WRK2+2),HL」によって、HLレジスタの2バイト値をアドレス「_EX_WRK2+2」に格納する。こうして、アドレス「_EX_WRK2」に、4バイトのBCDレジスタの値×100の演算結果を得ることができる。
ここで、当該コマンド例では、図108に示すように、コマンドサイズの合計は38バイトとなり、サイクル数の単純合計(移動命令を考慮することなく単純にサイクル数を合計したもの)は49/48サイクルとなる。
(役物払出数×乗数を実行する第2の演算例)
図109は、16ビット乗算器を用いた第2の演算例を説明するための説明図である。16ビット乗算器を用いた第2の演算では、被乗数(3バイト)×乗数(1バイト)の演算をするため、図109に示すように、被乗数をBCDレジスタ(BCレジスタおよびDレジスタ)に格納し、BCレジスタの値(2バイト値)と乗数(100)とを16ビット乗算器を用いて乗算するとともに、Dレジスタの値それぞれと乗数(100)とを8ビットMUL命令を用いて乗算する。そして、乗算した結果、BCレジスタの値×100、Dレジスタの値×100を加算することで、4バイトのBCDレジスタの値×100の演算結果を得ることができる。
図110は、第2の演算例を実現するための具体的な処理を示したフローチャートであり、図111は、第2の演算例を実現するための具体的なコマンドの一例を示した図である。かかる図110の説明におけるステップSの数値は、本図の説明においてのみ用いることとする。
図110に示すように、まず、累計役物カウンタの値をBCDレジスタに読み出す(S1)。具体的に、図111の2行目のコマンド「LD A,(_EX_YAKR)」によって、アドレス「_EX_YAKR」に格納されている1バイト値がAレジスタに読み出され、3行目のコマンド「LD D,A」によって、Aレジスタの値がDレジスタに複製され、4行目のコマンド「LD BC,(_EX_YAKR+1)」によって、アドレス「_EX_YAKR+1」に格納されている2バイト値がBCレジスタに読み出される。
次に、図110に示すように、BCDレジスタに格納された累計役物カウンタの値が0であるか否か判定され(S2)、0であれば(S2におけるYES)、乗数を乗じても結果が変わらないので(0なので)、当該第2の演算例を終了する。具体的に、図111の5行目のコマンド「OR A,B」によって、Dレジスタの値と等しいAレジスタの値とBレジスタの値との論理和を演算し、図111の6行目のコマンド「OR A,C」によって、5行目の演算結果であるAレジスタの値とCレジスタの値との論理和を演算し、7行目のコマンド「JR Z,E_PYSAV28」によって、BCDレジスタの論理和が0であれば、他の処理を示す指標「E_PYSAV28」(図示せず)に移動する。
続いて、図110に示すように、被乗数の上位2バイトを被乗数設定レジスタに設定し(S3)、乗数(100)を乗数設定レジスタに設定して、乗算を実行する(S4)。具体的に、図111の8行目のコマンド「LD (@MULA16_),BC」によって、BCレジスタの値を被乗数設定レジスタ「@MULA16_」に設定し、9行目のコマンド「LD A,100」によって、Aレジスタに乗数「100」を設定し、10行目のコマンド「OUT (LOW @MULB16_),A」によって、Uレジスタの値をアドレスの上位1バイトとし、アドレス「@MULB16_」を下位1バイトとし、そのアドレスで示される乗数設定レジスタにAレジスタの値を出力する。なお、乗数設定レジスタ「@MULB16_」の上位1バイトにはデフォルト値として「00H」が設定されている。こうして、16ビット乗算器を動作させ、乗算結果レジスタに乗算結果が格納される。
次に、図110に示すように、乗数の最下位バイトであるDレジスタの値と乗数(100)とを乗じる(S5)。具体的に、図111の11行目のコマンド「LD A,D」によって、Dレジスタの値をAレジスタに複製し、12行目のコマンド「MUL HL,A,100」によって、Aレジスタの値と100とを乗じた結果をHLレジスタに保持する。
続いて、図110に示すように、乗算結果レジスタに格納された乗算結果の下位3バイトをDEAレジスタに読み出し(S6)、Aレジスタの値と、ステップS5の乗算結果のうち上位1バイト(Hレジスタの値)とを加算し(S7)、メインRAM500cに設定する(S8)。具体的に、図111の13行目のコマンド「IN A,(LOW @MUL32__+0」によって、Uレジスタの値をアドレスの上位1バイトとし、アドレス「@MULB32__+0」を下位1バイトとし、そのアドレスで示される乗算結果レジスタの値をAレジスタに読み出し、14行目のコマンド「LD ED,(LOW @MUL32__+1」によって、乗算結果レジスタの最下位から2バイト目と3バイト目をDEレジスタに読み出し、15行目のコマンド「ADD A,H」によって、Aレジスタの値に、12行目のコマンド「MUL HL,A,100」によって設定された乗算結果の上位1バイト(Hレジスタの値)を加算し、16行目のコマンド「LD H,A」によって、加算結果(Aレジスタの値)をHレジスタに戻し、17行目のコマンド「OUT (LOW @DIVA32_+0),HL」によって、Uレジスタの値をアドレスの上位1バイトとし、アドレス「@DIVA32_」を下位1バイトとし、そのアドレスで示される被除数設定レジスタ「@DIVA32_」にHLレジスタの値を出力する。
次に、図110に示すように、ステップS6で設定したDEレジスタの値をHLレジスタに複製し(S9)、ステップS7の加算において値が繰り上げされたか否か判定され(S10)、繰り上げされていれば(S10におけるYES)、HLレジスタに繰り上げ分を加算し(S11)、メインRAM500cに設定する(S12)。具体的に、図111の18行目のコマンド「EX DE,HL」によって、DEレジスタの値をHLレジスタに設定し、19行目のコマンド「JR NC,E_PYSAVX1」によって、15行目のコマンド「ADD A,H」によりキャリーフラグが立っているか否か判断され、キャリーフラグが立っていなかったら、21行目の指標「E_PYSAVX1」に移動し、キャリーフラグが立っていれば、20行目のコマンド「INC HL」によって、HLレジスタの値が1だけインクリメントされ、22行目のコマンド「OUT (LOW @DIVA32_+2),HL」によって、Uレジスタの値をアドレスの上位1バイトとし、アドレス「@DIVA32_+2」を下位1バイトとし、そのアドレスで示される除数設定レジスタにHLレジスタの値を出力する。
ここで、当該コマンド例では、図111に示すように、コマンドサイズの合計は43バイトとなり、サイクル数の単純合計は59/57サイクルとなる。
以上説明したように、役物払出数×乗数を実行する第1の演算例と、役物払出数×乗数を実行する第2の演算例とを比較すると、コマンドサイズの合計およびサイクル数の単純合計のいずれも第1の演算例の方が小さくなる。したがって、スロットマシン400で役物払出数×乗数を実行する場合、図106~図108を用いて説明したように、8ビットMUL命令のみによって実行する方が好ましい。
なお、上述した第1の演算例では、図108の16行目および20行目のコマンドとしてコマンド「LD」を用いたが、それ以後の処理態様に応じ、図112のように、これに代えて、16行目および20行目のコマンドとしてコマンド「OUT」を用いてもよい。図112の場合でも、図108同様、コマンドサイズの合計は38バイトとなり、サイクル数の単純合計は49/48サイクルとなる。
(乗算結果÷総払出数)
次に、役物比率を算出する際の複数段階の演算手順のうち、(役物払出数×乗数の)乗算結果÷総払出数について有効性を検討する。上述したように、役物払出数(3バイト)×乗数(1バイト)の乗算結果は、最大4バイトとなるため、メモリの容量として4バイト以上を要する。したがって、ここでは、乗算結果を4バイト(32ビット)で表す。また、総払出数も、最大値が3バイトとなるため、メモリ容量として3バイト以上を要する。したがって、総払出数も4バイトで表す。そうすると、乗算結果÷総払出数の演算は32ビット÷32ビットの演算となる。メインCPU500aは、乗算結果から総払出数を繰り返し減算し、その減算回数で32ビット÷32ビットの演算を実現することができる。
しかし、単純に、乗算結果から総払出数を繰り返し減算していく方法では、役物比率に相当する回数分、繰り返し乗算結果から総払出数を減算しなければならない。そうすると、減算処理が最大で100回実行されることになる。そこで、除数である総払出数を整数倍して減算することで減算処理の回数を削減することが考えられる。例えば、役物払出数が「7123」、総払出数が「10000」であった場合に、被除数である乗算結果「712300」から総払出数「10000」を単純に減算せず、総払出数「10000」に整数「10」を乗じた「100000」を減算することで、役物比率の2桁目(10の桁)に相当する「7」を導出することができる。また、更新された(減算された)乗算結果から元の総払出数「10000」を減算することで、役物比率の1桁目(1の桁)に相当する「1」を導出することができる。このように、総払出数(除数)を整数倍することで、ここでは、減算処理を多くとも20回に削減することが可能となる。
ただし、メインCPU500aでは、2進数で演算が行われるので、ここでは、10進数の桁上がりに相当する数「10」の代わりに、2進数の桁上がりに対応する数「2」を用いる。したがって、ここでは、乗算結果「712300」から、総払出数「10000」に、2の累乗数である所定の整数「64(2の6乗)」を乗じた数を減算し、以降、整数を「32(2の5乗)」→「16(2の4乗)」→「8(2の3乗)」→「4(2の2乗)」→「2(2の1乗)」→「1(2の0乗)」の順に変更して総払出数を乗じ、乗算結果から減算する。ここで、総払出数に乗じる整数を、2の累乗数である64から開始しているのは、役物比率が0~99の範囲に収まるため、「128(2の7乗)」以上の数値を減算する必要がないからである。
また、上述したように、メインCPU500aには、例えば、32ビット÷32ビットの除算器(以下、単に32ビット除算器という)が内蔵されている。したがって、メインCPU500aでは、上記の乗算結果から、総払出数に2の累乗数を乗じた数を繰り返し減算する演算(以下、単に2の累乗数を乗じた数の繰り返し減算という)の代わりに、32ビット除算器を採用することができる。
ここでは、2の累乗数を乗じた数の繰り返し減算を用いた第3の演算例と、32ビット除算器を用いた第4の演算例を挙げ、その有効性を比較する。
(乗算結果÷総払出数を実行する第3の演算例)
図113は、2の累乗数を乗じた数の繰り返し減算を用いた第3の演算例を説明するための説明図である。2の累乗数を乗じた数の繰り返し減算を用いた第3の演算例では、乗算結果である被乗数(4バイト)÷総払出数である除数(4バイト)の演算例を示す。ここで、被除数は「712300」、除数は本来の除数「10000」に64を乗じた「64×10000」と仮定する。
図113に示すように、1回目の判定において、被除数≧除数と判定されれば、被乗数から除数を減算できるので、比率導出手段は、被除数「712300」から除数「64×10000」を減算して被除数を「72300」に更新するとともに、商「0」に「64」を加算して商を「64(2進数で表すと1000000B)」に更新する。2回目~4回目の判定では、被除数<除数なので、除数の減算を行わない。5回目の判定において、被除数≧除数と判定されれば、比率導出手段は、被除数「72300」から除数「4×10000」を減算して被除数を「32300」に更新するとともに、商「64」に「4」を加えて商を「68(2進数で表すと1000100B)」に更新する。同様に、6回目の判定において、被除数≧除数と判定されれば、比率導出手段は、被除数「32300」から除数「2×10000」を減算して被除数を「12300」に更新するとともに、商「68」に「2」を加えて商を「70(2進数で表すと1000110B)」に更新する。7回目の判定において、被除数≧除数と判定されれば、比率導出手段は、被除数「12300」から除数「1×10000」を減算して被除数を「2300」に更新するとともに、商「70」に「1」を加えて商を「71(2進数で表すと1000111B)」に更新する。
整数=「64」から、減算ステップおよび加算ステップを7回繰り返すと、整数は小数点以下が切り捨てられて0(<1)となるので、演算処理が終了し、役物比率は、その時点の商「71」となる。これは、役物払出数「7123」を総払出数「10000」で除算した結果を%換算した71.23%の整数部分に相当するので、かかる演算が正しいことが理解できる。
図114は、第3の演算例を実現するための具体的な処理を示したフローチャートであり、図115は、第3の演算例を実現するための具体的なコマンドの一例を示した図である。かかる図114の説明におけるステップSの数値は、本図の説明においてのみ用いることとする。なお、ここでは、4バイトの除数を格納しているアドレス「_EX_WRK1」と、4バイトの被除数を格納しているアドレス「_EX_WRK2」とが連続して配置されているとする。
図114に示すように、まず、商を0に、整数(2の累乗数)を64に初期化し(S1)、被除数の上位2バイトと除数の上位2バイトを読み出し(S2)、被除数の上位2バイトが除数の上位2バイト未満であるか否か判定する(S3)。そして被除数の上位2バイトが除数の上位2バイト未満であれば(S3におけるYES)、ステップS10に移動する。具体的に、図115の1行目のコマンド「XOR A,A」によって商を示すAレジスタに「0」を設定し、2行目のコマンド「LD C,64」によって整数を示すCレジスタに「64」を設定し、4行目のコマンド「LD HL,_EX_WRK2+2」によって、被除数(役物払出数×乗数の乗算結果)を格納しているアドレス「_EX_WRK2」の値に2を加算した値(上位2バイトの値)をHLレジスタに読み出し、5行目のコマンド「LD DE,(HL-4)」によって、被除数を格納しているアドレス「_EX_WRK2」の4バイト下位に位置するアドレス「_EX_WRK1」に格納された除数の上位2バイトをDEレジスタに読み出し、6行目のコマンド「JCP C,(HL),DE,E_PYSAV27」によって、HLレジスタで示されるアドレスの値(被除数の上位2バイト)と、DEレジスタの値(除数の上位2バイト)とが比較され、キャリーフラグが立っていれば、すなわち、被除数の上位2バイトが除数の上位2バイト未満であれば、20行目の指標「E_PYSAV27」に移動する。
次に、図114に示すように、被除数の上位2バイトが除数の上位2バイト以上であれば(S3におけるNO)、後段の計算のため、被除数の下位2バイトと除数の下位2バイトを読み出し(S4)、被除数の上位2バイトと除数の上位2バイトとが等しくないか否か、すなわち、被除数の上位2バイトが除数の上位2バイトより大きいか否か判定する(S5)。そして被除数の上位2バイトと除数の上位2バイトとが等しくなければ(S5におけるYES)、ステップS8に移動する。具体的に、図115の7行目のコマンド「LD HL,_EX_WRK1」によって、除数を格納しているアドレス「_EX_WRK1」の下位2バイトをHLレジスタに読み出し、8行目のコマンド「LD DE,(HL+4)」によって、除数を格納しているアドレス「_EX_WRK1」の4バイト上位に位置するアドレス「_EX_WRK2」に格納された被除数の下位2バイトをDEレジスタに読み出し、9行目のコマンド「JR NZ,E_PYSAV26」によって、6行目のコマンドの実行によってゼロフラグが立っていなければ、12行目の指標「E_PYSAV26」に移動する。
続いて、図114に示すように、ステップS4で読み出した被除数の下位2バイトが除数の下位2バイトより大きいか否か判定し(S6)、被除数の下位2バイトが除数の下位2バイトより大きい場合(S6におけるYES)、ステップS8に移動し、除数の下位2バイトが除数の下位2バイト以下の場合(S6におけるNO)、ステップS6において、被除数の下位2バイトと除数の下位2バイトとが等しくないか否か、すなわち、被除数の下位2バイトが除数の下位2バイト未満であるか否か判定する(S7)。そして被除数の下位2バイトと除数の下位2バイトとが等しくなければ(S7におけるYES)、ステップS10に移動する。具体的に、図115の10行目のコマンド「JCP C,(HL),DE,E_PYSAV26」によって、HLレジスタで示されるアドレスの値(除数の下位2バイト)と、DEレジスタの値(被除数の下位2バイト)とが比較され、キャリーフラグが立っていれば、すなわち、被除数の下位2バイトが被除数の下位2バイトより大きいと、12行目の指標「E_PYSAV26」に移動し、11行目のコマンド「JR NZ,E_PYSAV27」によって、10行目のコマンドの実行によってゼロフラグが立っていなければ、20行目の指標「E_PYSAV27」に移動する。
次に、図114に示すように、被除数が除数以上であれば、商に、現在の整数を加算し(S8)、被除数から除数を減算して、その減算結果を新たな被除数として更新する(S9)。具体的に、図115の13行目のコマンド「ADD A,C」によって、商を示すAレジスタに、整数を示すCレジスタの値を加算し、14行目のコマンド「SUB DE,(HL)」によって、被除数の下位2バイトが格納されたDEレジスタの値から、HLレジスタで示されるアドレスに格納された除数の下位2バイトの値を減算してDEレジスタを更新し、15行目のコマンド「LD (HL+4),DE」によって、HLレジスタで示される除数を格納しているアドレスの4バイト上位に位置する被除数を示すアドレスに、減算結果である更新された被除数の下位2バイトを格納し、16行目のコマンド「LD DE,(HL+2)」によって、HLレジスタで示されるアドレスに格納された除数の上位2バイトをDEレジスタに読み出し、17行目のコマンド「LD HL,(HL+6)」によって、HLレジスタで示される除数を格納しているアドレスの6バイト上位に位置する被除数の上位2バイトをHLレジスタに読み出し、18行目のコマンド「SBC HL,DE」によって、被除数の上位2バイトが格納されたHLレジスタの値から、除数の上位2バイトが格納されたDEレジスタの値を減算してHLレジスタを更新し、19行目のコマンド「LD (_EX_WRK2+2),HL」によって、アドレス「_EX_WRK2」が示す被除数の上位2バイトに、減算結果である更新された被除数の上位2バイトを格納する。
続いて、図114に示すように、除数を2で除算(右にビットシフト)し、新たな除数として更新し(S10)、整数を2で除算(右にビットシフト)し、新たな整数として更新し(S11)、整数が0ではないか否か判定し(S12)、0でなければ(S12におけるYES)、ステップS2からの処理を繰り返し、0であれば(S12におけるNO)、役物比率をメインRAM500cに設定し(S13)、当該2の累乗数を乗じた数を繰り返し減算する処理を終了する。具体的に、図115の21行目のコマンド「LD HL,_EX_WRK1+3」によって、除数の最上位1バイトを示すアドレス「_EX_WRK1+3」をHLレジスタに読み出し、22行目のコマンド「SRL (HL)」によってHLレジスタで示されるアドレスの値(除数の4バイト目)が右に1だけビットシフトされ、23行目のコマンド「DEC HL」によって、HLレジスタの値が1だけデクリメントされ、24行目のコマンド「RR (HL)」によってHLレジスタで示されるアドレスの値(除数の下位から3バイト目)が右に1だけビットシフトされ、25行目のコマンド「DEC HL」によって、HLレジスタの値が1だけデクリメントされ、26行目のコマンド「RR (HL)」によってHLレジスタで示されるアドレスの値(除数の下位から2バイト目)が右に1だけビットシフトされ、27行目のコマンド「DEC HL」によって、HLレジスタの値が1だけデクリメントされ、28行目のコマンド「RR (HL)」によってHLレジスタで示されるアドレスの値(除数の最下位1バイト)が右に1だけビットシフトされ、29行目のコマンド「SRL C」によって、整数を示すCレジスタの値が右に1だけビットシフトされ、30行目のコマンド「JR NZ,E_PYSAV25」によって、29行目のコマンドの実行によってゼロフラグが立っていなければ、3行目の指標「E_PYSAV25」に移動し、32行目の「LD (_EX_DPA7),A」によって、商であるAレジスタの値をアドレス「_EX_DPA7」に格納する。
かかる第3の演算例により、加算、減算、乗算といった簡易な演算のみで、また、整数のみにより、除算を実現することが可能となる。また、ここでは、減算および加算処理を7回繰り返せば足りるので、演算処理を迅速に行うことができる。さらに、役物比率の小数点以下を切り捨てることを前提とすると、誤差が生じないので、役物比率を正確に導出することが可能となる。
ここで、当該コマンド例では、図115に示すように、コマンドサイズの合計は59バイトとなり、サイクル数の単純合計は95/90サイクルとなる。また、実際のサイクル数は、以下のようになる。すなわち、当該処理では、指標「E_PYSAV25」の次のコマンド(4行目)から指標「E_PYSAV28」の直前のコマンド(30行目)までを7回ループすることとなる。このとき、7回全てのループにおいて、6行目のコマンド「JCP C,(HL),DE,E_PYSAV27」で指標「E_PYSAV27」に移動した場合、7行目~19行目のコマンドを実行しないので、サイクル数は最小の321(3+45(最初の6ループ)×6+44(7ループ目)+4)サイクルとなる。一方、全ループにおいて、6行目のコマンド「JCP C,(HL),DE,E_PYSAV27」で指標「E_PYSAV27」に移動しなかった場合、サイクル数は最大となる。ただし、役物比率は100%を越えることはなく、95%および63%のときの処理負荷が最大になることを勘案すると、サイクル数の最大は566(3+61(初回ループ)+83(残りの6ループ)×6+4)サイクルとなる。したがって、サイクル数の実質的な合計は、321~566サイクルの範囲となる。
なお、ここでも、役物比率の小数点以下を切り捨てることを前提としたが、かかる場合に限らず、役物比率の小数点以下を四捨五入する場合、減算および加算処理を8回繰り返し、8回目の判定において、被除数≧除数と判定されれば、商に1を加えるとすることで実現できる。
(乗算結果÷総払出数を実行する第4の演算例)
図116は、第4の演算例を実現するための具体的な処理を示したフローチャートであり、図117は、第4の演算例を実現するための具体的なコマンドの一例を示した図である。かかる図116の説明におけるステップSの数値は、本図の説明においてのみ用いることとする。なお、ここでは、図112を用いて説明したように、役物払出数×乗数の乗算結果である被除数は、すでに被除数設定レジスタ「DIVA32」に設定されているとする。
図116に示すように、まず、累計役物カウンタの値をレジスタに呼び出し、除数設定レジスタ「DIVB32」に設定する(S1)。具体的に、図117の1行目のコマンド「LD HL,(_EX_PRZR)」によって、累計役物カウンタを示すアドレス「_EX_PRZR」に格納されている値がHLレジスタに読み出され、2行目のコマンド「LD A,(_EX_PRZR+2)」によって、累計役物カウンタの上位1バイトを示すアドレス「_EX_PRZR+2」に格納されている値がAレジスタに読み出され、3行目のコマンド「OUT (LOW @DIVB32_+0),HL」によって、Uレジスタの値をアドレスの上位1バイトとし、アドレス「@DIVB32_」を下位1バイトとし、そのアドレスに、HLレジスタの値を出力し、4行目のコマンド「OUT (LOW @DIVB32_+2),A」によって、Uレジスタの値をアドレスの上位1バイトとし、アドレス「@DIVB32_+2」を下位1バイトとし、そのアドレスに、Aレジスタの値を出力する。なお、除数設定レジスタ「@DIVB32_」の上位1バイトにはデフォルト値として「00H」が設定されている。
次に、図116に示すように、除算の時間待ちを行い(S2)、所定時間経過後、演算結果をメインRAM500cに設定する(S3)。具体的に、図117の5~8行目のコマンド「NOP」によって4サイクルの時間を消費させ、9行目のコマンド「IN A,(LOW @DIV32__+0)によって、Uレジスタの値をアドレスの上位1バイトとし、アドレス「@DIV32__+0」を下位1バイトとし、そのアドレスで示される除算結果レジスタの値をAレジスタに読み出し、11行目の「LD (_EX_DPA7),A」によって、商であるAレジスタの値をアドレス「_EX_DPA7」に格納する。
ここで、当該コマンド例では、図117に示すように、コマンドサイズの合計は20バイトとなり、サイクル数の合計は28サイクルとなる。
以上説明したように、乗算結果÷総払出数を実行する第3の演算例と、乗算結果÷総払出数を実行する第4の演算例とを比較すると、コマンドサイズの合計およびサイクル数の合計のいずれも第4の演算例の方が小さくなる。したがって、スロットマシン400で乗算結果÷総払出数を実行する場合、図116、図117を用いて説明したように、32ビット除算器を用いて実行する方が好ましい。
以上、第1の演算例~第4の演算例を挙げて、スロットマシン400における役物比率の演算態様を説明した。以下、パチンコ機におけるベース値について説明する。なお、スロットマシン400における有利区間比率、指示込役物比率、連続役物比率、役物比率、役物等状態比率については、全て小数点以下を切り捨てるとしているが、パチンコ機におけるベース値(賞球数/アウト数)は小数点以下を四捨五入する。そこで、パチンコ機においては、賞球数の乗数として「100」ではなく「200」を採用し、小数点以下が0.5以上であるか否かを整数(最下位ビット)に置き換えて判断する。したがって、ベース値は、賞球数に乗数(200)を乗じ、その後、乗数を乗じた結果(被除数)をアウト数で除算し、最下位ビット(MLB)に応じて切り上げまたは切り捨てを判断する。
ここでは、8ビットMUL命令および2の累乗数を乗じた数の繰り返し減算を用いた第5の演算例と、16ビット乗算器および32ビット除算器を用いた第6の演算例を挙げ、その有効性を比較する。
(賞球数×乗数÷アウト数を実行する第5の演算例)
図118は、8ビットMUL命令および2の累乗数を乗じた数の繰り返し減算を用いた第5の演算例を実現するための具体的な処理を示したフローチャートであり、図119は、第5の演算例を実現するための具体的なコマンドの一例を示した図である。かかる図118の説明におけるステップSの数値は、本図の説明においてのみ用いることとする。なお、ここでは、3バイトの被除数(賞球数に乗数を乗じた演算結果)を格納しているアドレス「R_ERW_BF1」と、3バイトの除数(アウト数)を格納しているアドレス「R_ERW_BF2」とが連続して配置されているとする。
図118に示すように、まず、通常賞球カウンタの値をBCレジスタに読み出し(S1)、通常アウトカウンタの値をHLレジスタに読み出し(S2)、HLレジスタが0であるか否か判定され(S3)、0であれば(S3におけるYES)、ステップS23に移行する。具体的に、図119の2行目のコマンド「XOR A,A」によって、後程、除数の計算に用いられるAレジスタの値を初期化し、3行目の「LD BC,(R_ERW_TJS)」によって、アドレス「R_ERW_TJS」で示される通常賞球カウンタの値(賞球数)がBCレジスタに読み出され、4行目のコマンド「LD HL,(R_ERW_TJO」によって、アドレス「R_ERW_TJO」で示される通常アウトカウンタの値(アウト数)がHLレジスタに読み出され、5行目のコマンド「JR TZ,E_SHYMT_60」によって、HLレジスタの値が0であれば、49行目の指標「E_SHYMT_60」に移動する。
次に、図118に示すように、アウト数に整数(2の累乗数、ここでは128)を乗じ(S4)、その演算結果を除数バッファとしてメインRAM500cに格納する(S5)。具体的に、図119の6行目のコマンド「SRL H」によって、Hレジスタの値が右に1だけビットシフトされ、7行目のコマンド「RR L」によって、Hレジスタからのキャリアも含めLレジスタの値が右に1だけビットシフトされ、8行目のコマンド「RRA」によって、Lレジスタからのキャリアも含めAレジスタの値が右に1だけビットシフトされる。ここで、HLAレジスタという単位で数値を判断すると、HLレジスタの値に256を乗じ、その後に右に1だけビットシフトされていると見做せるので、アウト数に128(256/2)を乗じたこととなり、これが除数となる。そして、図119の9行目のコマンド「LD (R_ERW_BF2),A」によって、除数の下位バイトであるAレジスタの値をアドレス「R_ERW_BF2」に格納し、10行目のコマンド「LD (R_ERW_BF2+1),HL」によって、除数の上位2バイトであるHLレジスタの値をアドレス「R_ERW_BF2+1」に格納する。
続いて、図118に示すように、被乗数(賞球数)の下位バイトであるCレジスタの値と乗数(200)とを乗じ(S6)、その演算結果をDEレジスタに設定する(S7)。具体的に、図119の11行目のコマンド「LD A,C」によって、Cレジスタの値をAレジスタに複製し、12行目のコマンド「MUL HL,A,200」によって、Aレジスタの値と200とを乗じた結果をHLレジスタに保持し、13行目のコマンド「EX DE,HL」によって、HLレジスタの値をDEレジスタに設定する。
次に、図118に示すように、被乗数の上位バイトであるBレジスタの値と乗数(200)とを乗じ(S8)、その演算結果にDレジスタの値を加算して演算結果を更新し(S9)、その演算結果を被除数バッファとしてメインRAM500cに格納する(S10)。具体的に、図119の14行目のコマンド「LD A,B」によって、Bレジスタの値をAレジスタに複製し、15行目のコマンド「MUL HL,A,200」によって、Aレジスタの値と200とを乗じた結果をHLレジスタに保持し、16行目のコマンド「ADDWB HL,D」によって、乗算結果のHLレジスタに、13行目のコマンド「EX DE,HL」によって設定されたDEレジスタのうちの上位1バイト(Dレジスタの値)のみを加算し、17行目のコマンド「LD A,E」によって、13行目のコマンド「EX DE,HL」によって設定されたDEレジスタのうち下位1バイトをAレジスタに設定し、18行目のコマンド「LD (R_ERW_BF1),A」によって、被除数の下位バイトであるAレジスタの値をアドレス「R_ERW_BF1」に格納し、19行目のコマンド「LD (R_ERW_BF1+1),HL」によって、被除数の上位2バイトであるHLレジスタの値をアドレス「R_ERW_BF1+1」に格納する。
続いて、図118に示すように、ループ回数を8に、商を0に初期化し(S11)、商を2倍し(S12)、被除数の上位2バイトと除数の上位2バイトを読み出し(S13)、被除数の上位2バイトが除数の上位2バイト未満であるか否か判定する(S14)。そして被除数の上位2バイトが除数の上位2バイト未満であれば(S14におけるYES)、ステップS20に移動する。具体的に、図119の20行目のコマンド「LD BC,8*256+0」によって、ループ回数を示すBレジスタに8を、商を示すCレジスタに0を設定し、22行目のコマンド「SLA C」によって、Cレジスタの値を左に1ビットシフトし(MSBには0が入る)、23行目のコマンド「LD HL,R_ERW_BF1+1」によって、被除数(賞球数×乗数の乗算結果)を格納しているアドレス「R_ERW_BF1」の値に1を加算した値をHLレジスタに読み出し、24行目のコマンド「LD DE,(HL+3)」によって、被除数を格納しているアドレス「R_ERW_BF1」の3バイト上位に位置するアドレス「R_ERW_BF2」に格納された除数の上位2バイトをDEレジスタに読み出し、25行目のコマンド「JCP C,(HL),DE,E_SHYMT_55」によって、HLレジスタで示されるアドレスの値(被除数の上位2バイト)と、DEレジスタの値(除数の上位2バイト)とが比較され、キャリーフラグが立っていれば、すなわち、被除数の上位2バイトが除数の上位2バイト未満であれば、38行目の指標「E_SHYMT_55」に移動する。
次に、図118に示すように、被除数の上位2バイトが除数の上位2バイト以上であれば(S14におけるNO)、後段の計算のため、除数の下位1バイトと被除数の下位1バイトを読み出し(S15)、ステップS14において、被除数の上位2バイトと除数の上位2バイトとが等しくないか否か、すなわち、被除数の上位2バイトが除数の上位2バイトより大きいか否か判定する(S16)。そして被除数の上位2バイトと除数の上位2バイトとが等しくなければ(S16におけるYES)、ステップS18に移動し、被除数の上位2バイトと除数の上位2バイトとが等しければ(S16におけるNO)、被除数の下位1バイトが除数の下位1バイト未満であるか否か判定する(S17)。そして被除数の下位1バイトが除数の下位1バイト未満であれば(S17におけるYES)、ステップS20に移動し、被除数の下位1バイトが除数の下位1バイト以上であれば(S17におけるNO)、ステップS18に移動する。具体的に、図119の26行目のコマンド「LD L,LOW R_ERW_BF2」によって、除数を格納しているアドレス「R_ERW_BF2」の下位1バイトをLレジスタに読み出し(なお、Hレジスタには、23行目のコマンド「LD HL,R_ERW_BF1+1」によって、既に「R_ERW_BF2」の上位1バイトが保持されている)、27行目のコマンド「LD A,(HL-3)」によって、除数を格納しているアドレス「R_ERW_BF2」の3バイト下位に位置するアドレス「R_ERW_BF1」に格納された被除数の下位1バイトをAレジスタに読み出し、28行目のコマンド「JR NZ,E_SHYMT_50」によって、25行目のコマンドの実行によってゼロフラグが立っていなければ、31行目の指標「E_SHYMT_50」に移動し、29行目のコマンド「CP A,(HL)」によって、Aレジスタの値(被除数の下位1バイト)と、HLレジスタで示されるアドレスの値(除数の下位1バイト)とが比較され、30行目のコマンド「JR C,E_SHYMT_55」によって、キャリーフラグが立っていれば、すなわち、被除数の下位1バイトが除数の下位1バイト未満であれば、38行目の指標「E_SHYMT_55」に移動する。
続いて、図118に示すように、被除数が除数以上であれば、被除数から除数を減算して、その減算結果を新たな被除数として更新し(S18)、商に1を加算する(S19)。具体的に、図119の32行目のコマンド「SUB A,(HL)」によって、被除数の下位1バイトが格納されたAレジスタの値から、HLレジスタで示される除数の下位1バイトの値を減算し、33行目のコマンド「LD (HL-3),A」によって、HLレジスタで示される除数を格納しているアドレスの3バイト下位に位置する被除数を示すアドレスに、減算結果である更新された被除数の下位1バイトを格納し、34行目のコマンド「LD HL,(HL-2)」によって、HLレジスタで示される除数を格納しているアドレスの2バイト下位に位置する被除数の上位2バイトを示すアドレスをHLレジスタに読み出し、35行目のコマンド「SBC HL,DE」によって、被除数の上位2バイトが格納されたHLレジスタの値から、除数の上位2バイトが格納されたDEレジスタの値を減算し、36行目のコマンド「LD (R_ERW_BF1+1),HL」によって、アドレス「R_ERW_BF1」が示す被除数の上位2バイトに、減算結果である更新された被除数の上位2バイトを格納し、37行目のコマンド「INC C」によって、商を示すCレジスタの値を1だけインクリメントする。
次に、図118に示すように、除数を2で除算(右にビットシフト)し、新たな除数として更新し(S20)、ループ回数を減算し、そのループ回数が0ではないか否か判定し(S21)、0でなければ(S21におけるYES)、ステップS12からの処理を繰り返し、0であれば(S21におけるNO)、四捨五入を実行し(S22)、ベース値をメインRAM500cに設定して(S23)、当該処理を終了する。具体的に、図119の39行目のコマンド「LD HL,R_ERW_BF2+2」によって、除数の上位1バイトを示すアドレス「R_ERW_BF2+2」をHLレジスタに読み出し、40行目のコマンド「SRL (HL)」によってHLレジスタで示されるアドレスの値(除数の3バイト目)が右に1だけビットシフトされ、41行目のコマンド「DEC HL」によって、HLレジスタの値が1だけデクリメントされ、42行目のコマンド「RR (HL)」によってHLレジスタで示されるアドレスの値(除数の2バイト目)が右に1だけビットシフトされ、43行目のコマンド「DEC HL」によって、HLレジスタの値が1だけデクリメントされ、44行目のコマンド「RR (HL)」によってHLレジスタで示されるアドレスの値(除数の1バイト目)が右に1だけビットシフトされ、45行目のコマンド「DJNZ E_SHYMT_45」によって、ループ回数を示すBレジスタの値が1だけデクリメントされ、その値が0でなければ、21行目の指標「E_SHYMT_45」へ移動する。一方、ループ回数が0となると、図119の46行目のコマンド「LD A,C」によって、商を示すCレジスタの値がAレジスタに複製され、47行目のコマンド「SRL A」によってAレジスタで示されるアドレスの値が右に1だけビットシフトされ、48行目のコマンド「ADC A,0」によって、47行目のコマンド「SRL A」によってキャリーフラグが立っていれば、すなわち、小数点以下が0.5以上であれば、Aレジスタに1が加算され、50行目のコマンド「LD HL,R_ERW_BAS」によって、ベース値を示すアドレス「R_ERW_BAS」がHLレジスタに設定され、51行目のコマンド「LD (HL),A」によって、ベース値を示すAレジスタの値がアドレス「R_ERW_BAS」に格納される。
かかる第5の演算例により、加算、減算、乗算といった簡易な演算のみで、また、2の累乗数を乗じた数の繰り返し減算を用いてベース値を導出することが可能となる。
ここで、当該コマンド例では、図119に示すように、コマンドサイズの合計は97バイトとなり、サイクル数の単純合計は136/131サイクルとなる。また、実際のサイクル数は、以下のようになる。すなわち、当該処理では、指標「E_SHYMT_45」の次のコマンド(22行目)から45行目のコマンド「DJNZ E_SHYMT_45」までを8回ループすることとなる。このとき、8回全てのループにおいて、25行目のコマンド「JCP C,(HL),DE,E_SHYMT_55」で指標「E_SHYMT_55」に移動した場合、26行目~37行目のコマンドを実行しないので、サイクル数は最小の367(54+38(最初の7ループ)×7+37(8回目のループ)+10)サイクルとなる。一方、全ループにおいて、25行目のコマンド「JCP C,(HL),DE,E_SHYMT_55」で指標「E_SHYMT_55」に移動しなかった場合、サイクル数は最大となる。ただし、取り得る数値の関係で、1、2回目のループでは、25行目のコマンド「JCP C,(HL),DE,E_SHYMT_55」で移動せず、28行目のコマンド「JR NZ,E_SHYMT_50」で移動し、3~8回目のループでは、25行目のコマンド「JCP C,(HL),DE,E_SHYMT_55」、28行目のコマンド「JR NZ,E_SHYMT_50」、30行目のコマンド「JR C,E_SHYMT_55」のいずれにおいても移動しない場合が最大となることを勘案すると、サイクル数の最大は601(54+65(最初の2ループ)×2+68(その後の5ループ)×5+67(8回目のループ)+10)サイクルとなる。したがって、サイクル数の実質的な合計は、367~601サイクルの範囲となる。
(賞球数×乗数÷アウト数を実行する第6の演算例)
図120は、16ビット乗算器および32ビット除算器を用いた第6の演算例を実現するための具体的な処理を示したフローチャートであり、図121は、第6の演算例を実現するための具体的なコマンドの一例を示した図である。かかる図120の説明におけるステップSの数値は、本図の説明においてのみ用いることとする。
図120に示すように、まず、賞球数を被乗数レジスタに設定し(S1)、乗数「200」を乗数レジスタに設定する(S2)。具体的に、図121の1行目のコマンド「LD HL,(R_ERW_TJS)」によって、アドレス「R_ERW_TJS」で示される通常賞球カウンタの値(賞球数)がHLレジスタに読み出され、2行目のコマンド「OUT (LOW @MULA16_)によって、Uレジスタの値をアドレスの上位1バイトとし、アドレス「@MULA16_」を下位1バイトとし、そのアドレスで示される乗数設定レジスタにHLレジスタの値を出力し、3行目のコマンド「EX DE,HL」によって、HLレジスタの値をDEレジスタに複製し、4行目のコマンド「LD A,200」によって、Aレジスタに乗数「200」を設定し、5行目のコマンド「OUT (LOW @MULB16_),A」によって、Uレジスタの値をアドレスの上位1バイトとし、アドレス「@MULB16_」を下位1バイトとし、そのアドレスで示される乗数設定レジスタにAレジスタの値を出力する。なお、乗数設定レジスタ「@MULB16_」の上位1バイトにはデフォルト値として「00H」が設定されている。
次に、図120に示すように、通常賞球カウンタが0である場合を想定し、ベース値の初期値として0を設定し(S3)、アウト数が0であるか否か判定され(S4)、0であれば(S4におけるYES)、乗数を乗じても結果が変わらないので(0なので)、ステップS13に移動し、0でなければ(S4におけるNO)、ベース値を100に設定し(S5)、アウト数が賞球数未満であるか否か判定し(S6)、アウト数が賞球数未満であれば(S6におけるYES)、ステップS13に移動する。具体的に、図121の6行目のコマンド「XOR A,A」によってベース値を示すAレジスタの値を0に設定し、7行目のコマンド「LD HL,(R_ERW_TJO)」によって、アドレス「R_ERW_TJO」で示される通常アウトカウンタの値(アウト数)がHLレジスタに読み出され、8行目のコマンド「JR TZ,E_SHYMT_60」によって、HLレジスタの値が0であれば、23行目の指標「E_SHYMT_60」に移動し、9行目のコマンド「LD A,100」によって、ベース値を示すAレジスタに初期値として100を設定し、10行目のコマンド「JCP C,HL,DE,E_SHYMT_60」によって、HLレジスタの値(アウト数)と、DEレジスタの値(賞球数)とが比較され、キャリーフラグが立っていれば、すなわち、アウト数が賞球数未満であれば、23行目の指標「E_SHYMT_60」に移動する。
続いて、図120に示すように、アウト数を除数設定レジスタに設定し(S7)、16ビット乗算器による乗算結果をHLAレジスタ(HLレジスタおよびAレジスタ)に読み出し(S8)、それを被除数設定レジスタに設定する(S9)。具体的に、図121の11行目のコマンド「OUT (LOW @DIVB32_),HL」によって、Uレジスタの値をアドレスの上位1バイトとし、アドレス「@DIVB32_」を下位1バイトとし、そのアドレスで示される除数設定レジスタ「@DIVB32_」にHLレジスタの値を出力し、12行目のコマンド「IN A,(LOW @MUL32__」によって、Uレジスタの値をアドレスの上位1バイトとし、アドレス「@MULB32__」を下位1バイトとし、そのアドレスで示される乗算結果レジスタの1バイト値をAレジスタに読み出し、13行目のコマンド「IN HL,(LOW @MUL32__+1」によって、Uレジスタの値をアドレスの上位1バイトとし、アドレス「@MULB32__+1」を下位1バイトとし、そのアドレスで示される乗算結果レジスタの2バイト値をHLレジスタに読み出し、14行目のコマンド「OUT (LOW @DIVA32_+0),A」によって、Uレジスタの値をアドレスの上位1バイトとし、アドレス「@DIVA32_」を下位1バイトとし、そのアドレスで示される被除数設定レジスタ「@DIVA32_」にAレジスタの値を出力し、15行目のコマンド「OUT (LOW @DIVA32_+1),HL」によって、Uレジスタの値をアドレスの上位1バイトとし、アドレス「@DIVA32_+1」を下位1バイトとし、そのアドレスで示される被除数設定レジスタ「@DIVA32_+1」にHLレジスタの値を出力する。こうして、16ビット乗算器を動作させ、乗算結果レジスタに乗算結果が格納される。
次に、図120に示すように、除算の時間待ちを行い(S10)、所定時間経過後、演算結果をAレジスタに読み出し(S11)、四捨五入を実行し(S12)、ベース値をメインRAM500cに設定して(S13)、当該処理を終了する。具体的に、図121の16~19行目のコマンド「NOP」によって4サイクルの時間を消費させ、20行目のコマンド「IN A,(LOW @DIV32__+0)によって、除算器から演算結果をAレジスタに読み出し、21行目のコマンド「SRL A」によってAレジスタで示されるアドレスの値が右に1だけビットシフトされ、22行目のコマンド「ADC A,0」によって、21行目のコマンド「SRL A」によってキャリーフラグが立っていれば、すなわち、小数点以下が0.5以上であれば、Aレジスタに1が加算され、24行目のコマンド「LD HL,R_ERW_BAS」によって、ベース値を示すアドレス「R_ERW_BAS」がHLレジスタに設定され、25行目のコマンド「LD (HL),A」によって、ベース値を示すAレジスタの値がアドレス「R_ERW_BAS」に格納される。
ここで、当該コマンド例では、図121に示すように、コマンドサイズの合計は49バイトとなり、サイクル数の単純合計は68/66サイクルとなる。
以上説明したように、ベース値を導出する第5の演算例と、ベース値を導出する第6の演算例とを比較すると、コマンドサイズの合計およびサイクル数の単純合計のいずれも、16ビット乗算器および32ビット除算器を用いた第6の演算例の方が小さくなる。したがって、パチンコ機でベース値を実行する場合、図120、図121を用いて説明したように、16ビット乗算器および32ビット除算器を用いて実行する方が好ましい。
以上、説明したように、本実施形態によると、処理負荷の増大を抑えることで、タイマ割込みの禁止区間を短縮化することができ、遊技情報を適切に得つつ、遊技機としての動作を安定化することが可能となる。
なお、上述した実施形態においては、第4の演算例や第6の演算例において、32ビット除算器による除算の時間待ちに1サイクルの時間を消費する「NOP」を4回連続して利用している。しかし、かかる場合に限らず、4サイクルを確保しさえすれば、他のコマンドでもよい。例えば、コマンドサイズ1バイトで2サイクルのコマンドを2回連続して利用するか、コマンドサイズ1バイトで4サイクルのコマンドや、コマンドサイズ2バイトで4サイクルのコマンドを利用するとしてもよい。こうして、コマンドサイズを削減することができる。
また、上述した実施形態においては、役物払出数×乗数を実行する演算例として8ビットMUL命令のみを用いた第1の演算例と、16ビット乗算器を用いた第2の演算例を挙げ、また、乗算結果÷総払出数を実行する演算例として2の累乗数を乗じた数の繰り返し減算を用いた第3の演算例と、32ビット除算器を用いた第4の演算例を挙げた。上述した実施形態においては、役物払出数×乗数を行った後、その乗算結果を用いて乗算結果÷総払出数を実行するので、第1の演算例または第2の演算例と、第3の演算例または第4の演算例とを組み合わせて演算することになる。かかる演算例の組み合わせは任意に設定できる。例えば、第1の演算例と第3の演算例との組み合わせ、第1の演算例と第4の演算例との組み合わせ、第2の演算例と第3の演算例との組み合わせ、第2の演算例と第4の演算例との組み合わせを採用することができる。また、第5の演算例および第6の演算例は、いずれも、役物払出数×乗数と、乗算結果÷総払出数とに分けることができ、かかる演算例の組み合わせは任意に設定できる。例えば、上述した第5の演算例の役物払出数×乗数と、第5の演算例の乗算結果÷総払出数との組み合わせ、第6の演算例の役物払出数×乗数と、第6の演算例の乗算結果÷総払出数との組み合わせに加え、第5の演算例の役物払出数×乗数と、第6の演算例の乗算結果÷総払出数との組み合わせ、第6の演算例の役物払出数×乗数と、第5の演算例の乗算結果÷総払出数との組み合わせを採用することができる。
また、上述した実施形態においては、スロットマシン400の役物比率を例に挙げて、様々な演算(第1の演算例~第4の演算例)を実行したが、かかる場合に限らず、スロットマシン400の各比率(有利区間比率、指示込役物比率、6000遊技の連続役物比率、6000遊技の役物比率、総累計の連続役物比率、総累計の役物比率、役物等状態比率)に適用できるのは言うまでもない。また、スロットマシン400に限らず、第5の演算例や第6の演算例を用いて説明したように、パチンコ機のベース値にも適用可能である。
<モジュールおよびコマンドの説明>
以下、上述した各処理(モジュール)について、それを実現するための具体的な命令コード(コマンド群)を、モジュール内で主として用いられるコマンド単位で説明する。
<コマンド「ADDALD」>
BYTESELモジュールは、バイトデータ選択処理、すなわち、選択アドレスをオフセットさせ、そのオフセットされたアドレスに格納された1バイト値を読み出すための汎用モジュールである。汎用モジュールは、プログラムを実行する上で用いられる同一の処理をサブルーチン化したもので、特に他のモジュールから呼び出される頻度が高いモジュールを示す。汎用モジュールは、図5(または図102)で示したメモリマップ上の最も低いアドレス0000H近傍に配置されることが多い。これは、呼び出される頻度の高い汎用モジュールを0000H近傍に配置することで、呼び出しに用いられるコマンド「CALL」のみならず、他のコマンド「RST」を利用して呼び出せるからである。なお、ここでは、BYTESELモジュールをメモリマップ上の0008Hに配置する例を挙げて説明する。
ここで、コマンド「RST」は、メモリマップのうち0000H近傍の低い数値のアドレスであり、8バイトずつ離れた複数のアドレス(0008H、0010H、0018H、0020H、0028H、0030H、0038H、0040H)のいずれかを呼び出すことができるコマンドである。コマンド「RST」は、呼び出しに用いられる通常のコマンド「CALL」と実行サイクルは「4」で等しいが、通常のコマンド「CALL」のコマンドサイズが「3」であるのに対し、コマンド「RST」のコマンドサイズは「1」である。したがって、コマンド「RST」を用いることでプログラムの短縮化を図ることができる。
メインCPU300aは、メインROM300bからプログラムを読み出し、読み出したプログラムを遂行し、任意の処理において、サブルーチンとしてBYTESELモジュールを呼び出し、BYTESELモジュールを遂行する。BYTESELモジュールでは、選択アドレスを所定値だけオフセットさせ、オフセットされたアドレスに格納された1バイト値を保持する。こうして、オフセットに応じた値を設定することができる。
図122は、BYTESELモジュールの具体的な処理を示したフローチャートである。ここでは、任意の処理として、図26のS400-31で示したLED表示設定処理を実行するLED_PRCモジュールの一部を挙げて説明する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。また、当該BYTESELモジュールの説明中、第1レジスタはHLレジスタであり、第2レジスタはAレジスタである。
メインCPU300aは、図122(a)のように、任意の処理において、オフセットをAレジスタに設定し(S1)、読み出し対象となるアドレス群の先頭アドレスをHLレジスタに設定する(S2)。そして、サブルーチンとしてBYTESELモジュールを呼び出す(S3)。
メインCPU300aは、図122(b)のように、BYTESELモジュールにおいて、HLレジスタの値にAレジスタの値を加算してHLレジスタを更新するとともに、HLレジスタで示されるアドレスに格納された1バイト値をAレジスタに読み出す(S4)。続いて、メインCPU300aは、Aレジスタの値が0(ゼロ)か否かに応じて、ゼロフラグ(第1ゼロフラグ)を設定する(S5)。そして、当該BYTESELモジュールを終了して1段上のルーチンに戻る(S6)。
図123、図124は、BYTESELモジュールを実現するためのコマンドの一例を説明するための説明図である。このうち、図123(a)は、BYTESELモジュールを呼び出す任意の処理のコマンド群を示し、図123(b)は、BYTESELモジュールのコマンド群を示し、図123(c)は、メインROM300bのプログラムデータにおける1バイトデータ群の配置を示す。図122で示したフローチャートは、例えば、図123に示したプログラムによって実現される。
図123(a)の1行目のコマンド「LDQ A,(LOW R_TZ1_DSP)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_TZ1_DSP」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(特別図柄1表示図柄カウンタのカウンタ値)をAレジスタに読み出す。かかる1行目のコマンドが、図122(a)のステップS1に対応する。2行目のコマンド「LD HL,D_DSP_TZ」によって、読み出し元となる特別図柄表示用LED出力データテーブルのデータ群の先頭アドレス「D_DSP_TZ」をHLレジスタに設定する。かかる2行目のコマンドが、図122(a)のステップS2に対応する。そして、3行目のコマンド「RST BYTESEL」によって、サブルーチンとしてBYTESELモジュールが呼び出される。かかる3行目のコマンドが、図122(a)のステップS3に対応する。
図123(b)の1行目の指標「BYTESEL:」は、当該BYTESELモジュールの先頭アドレスを示す。2行目のコマンド「ADDWB HL,A」によって、HLレジスタの値にAレジスタの値が加算され、HLレジスタの値が更新される。そして、3行目のコマンド「LD A,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト値がAレジスタに読み出される。かかる2、3行目のコマンドが、図122(b)のステップS4に対応する。4行目のコマンド「OR A,A」によって、Aレジスタの値とAレジスタの値との論理和が計算される。かかるコマンド「OR A,A」では、Aレジスタの値同士の論理和なので、Aレジスタの値は変化しない。一方、論理和によって、ゼロフラグ(第1ゼロフラグおよび第2ゼロフラグ)を変化させることができる。すなわち、かかるBYTESELモジュールでは、読み出されたAレジスタの値がゼロであるか否かをゼロフラグによって判定することが可能となる。かかる4行目のコマンドが、図122(b)のステップS5に対応する。そして、5行目のコマンド「RET」によって、1段上のルーチンに戻る。かかる5行目のコマンドが、図122(b)のステップS6に対応する。
なお、図123(c)における指標「D_DSP_TZ」を起点としたテーブルは、例えば、特1大当たり図柄および特2大当たり図柄に関する情報を示す。例えば、変数「R_TZ1_DSP」、すなわち、特別図柄1表示図柄カウンタのカウンタ値が「02H」であった場合、図124に示すように、メインROM300bのプログラムデータに記述されたテーブル(2AH、A2H、A8H、36H…5DH、FDH)において選択アドレス(例えば、1250H)にAレジスタの値(例えば、02H)を加算したアドレス(低い方から3番目のアドレス)に格納された値(A8H)をAレジスタに読み出すことができる。このように、ここでは、同一バイト長の複数の値を連続して並置したテーブル中の所望する1バイト値を取得することが可能となる。
BYTESELモジュールは、複数のモジュールからサブルーチンとして呼び出される。例えば、図23のステップS100-55で示したサブコマンド群セット処理を実行するSBCMDSTモジュール、図26のステップS400-31で示したLED表示設定処理を実行するLED_PRCモジュール、図26のステップS400-33で示したソレノイドデータ設定処理(ソレノイド出力イメージ合成処理)を実行するSOL_SETモジュール、図26のステップS400-31で示したLED表示設定処理のサブルーチンである保留球数ビットデータ合成処理を実行するMEM_DATモジュール、図28のステップS530、S540で示したカウントスイッチ通過処理(第2始動口通過処理、大入賞口通過処理)を実行するTDN_PASモジュール、図43のステップS630で示した特別図柄停止図柄表示処理を実行するTZ_STPモジュール、図47のステップS720で示した大入賞口開放制御処理を実行するTD_OPNモジュール、図52のステップS810-11で示した普通図柄変動時間設定処理(普通図柄変動時間の決定処理)を実行するFSPNTMRモジュール、図39のステップS612で示した特別図柄変動パターン決定処理(特別図柄変動番号決定処理)を実行するTHPTSELモジュール、図37のステップS610-17で示される予備領域設定処理を実行するTRSVSELモジュール、図48のステップS730-9で示したエンディング時間設定処理を実行するTENDTMRモジュール、図43のステップS630-13(特別電動役物最大作動回数設定処理)中で実行される図柄オフセット取得処理(図示せず)を実行するZUGOFFSモジュール、図33のステップS536で示した取得時演出判定処理を実行するRGETCHKモジュール等から呼び出される。
このように、図123(b)に示したBYTESELモジュールのコマンドの総コマンドサイズは、2行目のコマンド「ADDWB HL,A」1バイト+3行目のコマンド「LD A,(HL)」1バイト+4行目のコマンド「OR A,A」1バイト+5行目のコマンド「RET」1バイト=4バイトとなり、総実行サイクルは、2行目1サイクル+3行目2サイクル+4行目1サイクル+5行目3サイクル=7サイクルとなる。かかるBYTESELモジュールを設けることによって、上述した各モジュール内でバイトデータ選択処理を行うことなく、コマンドサイズ1バイトのコマンド「RST BYTESEL」で賄うことができるので、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図125は、BYTESELモジュールを実現するためのコマンドの他の例を説明するための説明図である。ここでは、図123(b)のBYTESELモジュールのコマンド群を図125(b)のBYTESELモジュールのコマンド群に置き換えており、他の、図123(a)のBYTESELモジュールを呼び出す任意の処理のコマンド群、および、図123(c)のメインROM300bのプログラムデータにおける1バイトデータ群は、図125(a)、図125(c)として、そのまま用いている。ここでは、図125(a)、図125(c)のように、図123(a)、図123(c)と実質的に等しい処理についてはその説明を省略し、図125(b)の異なる処理のみを説明する。
図125(b)の1行目の指標「BYTESEL:」は、当該BYTESELモジュールの先頭アドレスを示す。2行目のコマンド「ADDALD A,(HL)」によって、HLレジスタの値にAレジスタの値が加算され、加算後のHLレジスタで示されるアドレスに格納された1バイト値がAレジスタに読み出される。かかる2行目のコマンドが、図122(b)のステップS4に対応する。3行目のコマンド「OR A,A」によって、Aレジスタの値とAレジスタの値との論理和が計算される。かかる論理和により、ゼロフラグ(第1ゼロフラグおよび第2ゼロフラグ)を変化させることができる。すなわち、BYTESELモジュールでは、読み出されたAレジスタの値がゼロであるか否かをゼロフラグによって判定することが可能となる。かかる3行目のコマンドが、図122(b)のステップS5に対応する。そして、4行目のコマンド「RET」によって、1段上のルーチンに戻る。かかる4行目のコマンドが、図122(b)のステップS6に対応する。
ここで、コマンド「ADDALD A,(HL)」は、HLレジスタの値にAレジスタの値を加算してHLレジスタを更新するとともに、HLレジスタで示されるアドレスに格納された値をAレジスタに読み出すコマンドである。かかるコマンドのコマンドサイズは「1」であり、実行サイクルは「3」である。
図125(b)のBYTESELモジュールのコマンドの総コマンドサイズは、2行目のコマンド「ADDALD A,(HL)」1バイト+3行目のコマンド「OR A,A」1バイト+4行目のコマンド「RET」1バイト=3バイトとなり、総実行サイクルは、2行目3サイクル+3行目1サイクル+4行目3サイクル=7サイクルとなる。したがって、図123(b)の場合と比べ、総コマンドサイズが1バイト削減されていることが理解できる。かかるBYTESELモジュールによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図123(b)と図125(b)とを比較して理解できるように、図123(b)において2行(2、3行目)を占有していたコマンド群を、図125(b)においては1行(2行目)で表すことができ、コマンド数自体の削減、および、設計負荷の軽減を図ることが可能となる。
図126は、BYTESELモジュールを実現するためのコマンドのさらに他の例を説明するための説明図である。ここでは、図125(a)のBYTESELモジュールを呼び出す任意の処理のコマンド群、および、図125(b)のBYTESELモジュールのコマンド群を、図126(a)の任意の処理のコマンド群に置き換えており、他の、図125(c)のメインROM300bのプログラムデータにおける1バイトデータ群は、図126(b)として、そのまま用いている。ここでは、図126(b)のように、図125(c)と実質的に等しい処理についてはその説明を省略し、図126(a)の異なる処理のみを説明する。
図126(a)の1行目のコマンド「LDQ A,(LOW R_TZ1_DSP)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_TZ1_DSP」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値をAレジスタに読み出す。かかる1行目のコマンドが、図122(a)のステップS1に対応する。2行目のコマンド「LD HL,D_DSP_TZ」によって、読み出し元となる1バイトデータ群の先頭アドレス「D_DSP_TZ」をHLレジスタに設定する。かかる2行目のコマンドが、図122(a)のステップS2に対応する。そして、3行目のコマンド「ADDALD A,(HL)」によって、HLレジスタの値にAレジスタの値が加算され、加算後のHLレジスタで示されるアドレスに格納された1バイト値がAレジスタに読み出される。かかる3行目のコマンドが、図122(b)のステップS4に対応する。
図126の例では、図122(a)のステップS3に対応するコマンド「RST BYTESEL」、図122(b)のステップS5に対応するコマンド「OR A,A」、および、図122(b)のステップS6に対応するコマンド「RET」が省略されている。
図126(a)の任意の処理のコマンド群の総コマンドサイズは、1行目のコマンド「LDQ A,(LOW R_TZ1_DSP)」2バイト+2行目のコマンド「LD HL,D_DSP_TZ」3バイト+3行目のコマンド「ADDALD A,(HL)」1バイト=6バイトとなり、総実行サイクルは、1行目2サイクル+2行目3サイクル+3行目3サイクル=8サイクルとなる。
これに対し、図125(a)、図125(b)の任意の処理およびBYTESELモジュールのコマンドの総コマンドサイズは、図125(a)の1行目のコマンド「LDQ A,(LOW R_TZ1_DSP)」2バイト+2行目のコマンド「LD HL,D_DSP_TZ」3バイト+3行目のコマンド「RST BYTESEL」1バイト+図125(b)の2行目のコマンド「ADDALD A,(HL)」1バイト+3行目のコマンド「OR A,A」1バイト+4行目のコマンド「RET」1バイト=9バイトとなり、総実行サイクルは、図125(a)の1行目2サイクル+2行目3サイクル+3行目4サイクル+図125(b)の2行目3サイクル+3行目1サイクル+4行目3サイクル=16サイクルとなる。したがって、図126の例では、図125の場合と比べ、総コマンドサイズが3バイト削減され、総実行サイクルが8サイクル削減されている。このようにBYTESELモジュール自体をコマンドとして任意の処理に埋め込むことで、コマンドの更なる短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図125と図126とを比較して理解できるように、図125(b)において4行(1~4行目)を占有していたコマンド群を、図126においては記述する必要がなくなるので、コマンド数自体の削減、および、設計負荷の軽減を図ることが可能となる。
また、BYTESELモジュールは、コマンド「RST」の対象としての汎用モジュールであるが、かかる汎用モジュールを省略することで、貴重な汎用モジュールの領域を空け、その領域に他のモジュールを配置することができる。こうしてリソースの有効活用が可能となる。
ただし、図126の例では、コマンド「OR A,A」を省略することで、第1ゼロフラグを変化させることができなくなる。すなわち、読み出されたAレジスタの値がゼロであるか否かを第1ゼロフラグによって判定することができなくなる。しかし、バイトデータ選択処理後にAレジスタの値がゼロか否か判定する必要がない場合、そもそも、この機能を必要としない。また、コマンド「ADDALD A,(HL)」は、そのコマンドを実行しただけで、第2ゼロフラグを変化させることができる。したがって、Aレジスタの値がゼロか否か判定する必要がある場合、第2ゼロフラグを参照することによってAレジスタの値がゼロであるか否かを判定することが可能となる。
なお、かかるBYTESELモジュールは、パチンコ機のみならず、スロットマシンにおける、例えば、レジスタ加算処理を実行するためのモジュールに利用される。
<コマンド「ADDALDW」>
WORDSELモジュールは、ワードデータ選択処理、すなわち、選択アドレスをオフセットさせ、そのオフセットされたアドレスに格納された2バイト値を設定するための汎用モジュールである。ここでは、WORDSELモジュールをメモリマップ上の0018Hに配置する例を挙げて説明する。
メインCPU300aは、メインROM300bからプログラムを読み出し、読み出したプログラムを遂行し、任意の処理において、サブルーチンとしてWORDSELモジュールを呼び出し、WORDSELモジュールを遂行する。WORDSELモジュールでは、選択アドレスを所定値だけオフセットさせ、オフセットされたアドレスに格納された2バイト値を保持する。こうして、オフセットに応じた値を設定することができる。
図127は、WORDSELモジュールの具体的な処理を示したフローチャートである。ここでは、任意の処理として、図51のステップS800で示した普通遊技管理処理を実行するFUT_PRCモジュールの一部を挙げて説明する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。また、当該WORDSELモジュールの説明中、第1レジスタはHLレジスタであり、第2レジスタはAレジスタである。
メインCPU300aは、図127(a)のように、任意の処理において、オフセットをAレジスタに設定し(S1)、読み出し対象となるアドレス群の先頭アドレスをHLレジスタに設定する(S2)。そして、サブルーチンとしてWORDSELモジュールを呼び出す(S3)。
メインCPU300aは、図127(b)のように、WORDSELモジュールにおいて、HLレジスタの値にAレジスタの値を2回加算し、もしくは、Aレジスタの値を2倍した値を加算してHLレジスタを更新し(S4)、HLレジスタで示されるアドレスに格納された2バイト値をHLレジスタに読み出す(S5)。続いて、メインCPU300aは、Lレジスタの値をAレジスタに設定する(S6)。そして、当該WORDSELモジュールを終了して1段上のルーチンに戻る(S7)。
WORDSELモジュールによって、HLレジスタに2バイト値が設定されると、メインCPU300aは、そのHLレジスタの値を用いて様々な処理を遂行する。例えば、ここでは、図127(a)のように、HLレジスタが示すアドレスをサブルーチンとして呼び出している(S8)。
図128、図129は、WORDSELモジュールを実現するためのコマンドの一例を説明するための説明図である。このうち、図128(a)は、WORDSELモジュールを呼び出す任意の処理のコマンド群を示し、図128(b)は、WORDSELモジュールのコマンド群を示し、図128(c)は、メインROM300bのプログラムデータにおける2バイトデータ群の配置を示す。図127で示したフローチャートは、例えば、図128に示したプログラムによって実現される。
図128(a)の1行目のコマンド「LDQ A,(LOW R_FUT_PHS)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_TZ1_DSP」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値をAレジスタに読み出す。かかる1行目のコマンドが、図127(a)のステップS1に対応する。2行目のコマンド「LD HL,J_JMP_FUT」によって、読み出し元となる2バイトデータ群の先頭アドレス「J_JMP_FUT」をHLレジスタに設定する。かかる2行目のコマンドが、図127(a)のステップS2に対応する。そして、3行目のコマンド「RST WORDSEL」によって、サブルーチンとしてWORDSELモジュールが呼び出される。かかる3行目のコマンドが、図127(a)のステップS3に対応する。
図128(b)の1行目の指標「WORDSEL:」は、当該WORDSELモジュールの先頭アドレスを示す。2行目のコマンド「ADDWB HL,A」によって、HLレジスタの値にAレジスタの値が加算され、HLレジスタが更新される。さらに、3行目のコマンド「ADDWB HL,A」によって、HLレジスタの値にAレジスタの値が加算され、HLレジスタが更新される。ここで、Aレジスタの値をHLレジスタに2回加算しているのは、読み出し元の値が2バイト値だからである。すなわち、テーブルに2バイト単位でデータが割り当てられているので、データを読み出すためには、アドレスを2ずつオフセットする必要があるからである。なお、ここでは、コマンド「ADDWB HL,A」を2回実行することで、HLレジスタにAレジスタの値を2回加算しているが、2行目のコマンド「ADDWB HL,A」に代え、コマンド「ADD A,A」を用い、Aレジスタの値を予め2倍してから、HLレジスタに加算することでも実現できる。かかる2、3行目のコマンドが、図127(b)のステップS4に対応する。
そして、図128(b)の4行目のコマンド「LD HL,(HL)」によって、HLレジスタで示されるアドレスに格納された2バイト値がHLレジスタに読み出される。かかる4行目のコマンドが、図127(b)のステップS5に対応する。5行目のコマンド「LD A,L」によって、HLレジスタのうち、Lレジスタの値がAレジスタに設定される。こうして、HLレジスタの値の下位1バイトが予めAレジスタに設定される。かかる5行目のコマンドが、図127(b)のステップS6に対応する。そして、6行目のコマンド「RET」によって、1段上のルーチンに戻る。かかる6行目のコマンドが、図127(b)のステップS7に対応する。
なお、図128(c)における指標「J_JMP_FUT」を起点としたテーブルは、例えば、普通遊技の状態を示すアドレスを示す。例えば、変数「R_FUT_PHS」、すなわち、普通遊技管理フェーズの値が「02H」であった場合、図129に示すように、メインROM300bのプログラムデータに記述されたテーブル(FZ_STA、FZ_SPN、FZ_STP、FD_PRE、FD_OPN、FD_END)において選択アドレス(例えば、1270H)にAレジスタの値を2倍した値(例えば、04H)を加算したアドレス(低い方から5番目および6番目のアドレス)に格納された値、ここでは、0832H(FZ_STP)をHLレジスタに保持することができる。このように、ここでは、同一バイト長の複数の値を連続して並置したテーブル中の所望する2バイト値を取得することが可能となる。
ここで、FZ_STAは、図52のステップS810で示した普通図柄変動待ち処理のアドレス値を示し、FZ_SPNは、図53のステップS820で示した普通図柄変動中処理のアドレス値を示し、FZ_STPは、図54のステップS830で示した普通図柄停止図柄表示処理のアドレス値を示し、FD_PREは、図55のステップS840で示した普通電動役物入賞口開放前処理のアドレス値を示し、FD_OPNは、図57のステップS850で示した普通電動役物入賞口開放制御処理のアドレス値を示し、FD_CLSは、図58のステップS860で示した普通電動役物入賞口閉鎖有効処理のアドレス値を示し、FD_ENDは、図59のステップS870で示した普通電動役物入賞口終了ウェイト処理のアドレス値を示す。
続いて、図128(a)の4行目のコマンド「CALL (HL)」によって、取得された2バイト値、すなわち、普通遊技の状態に応じたアドレス値を呼び出す。例えば、上記のように、テーブルにおいて0832H(FZ_STP)がHLレジスタに読み出されると、かかるコマンド「CALL (HL)」によって「FZ_STP」が示すアドレスを呼び出し、普通図柄停止図柄表示処理が実行されることとなる。かかる4行目のコマンドが、図127(a)のステップS8に対応する。
WORDSELモジュールは、複数のモジュールからサブルーチンとして呼び出される。例えば、図43のステップS630で示した特別図柄停止図柄表示処理の中で実行されるダブルバイト選択処理(図示せず)を実行するDBLBYTEモジュール、図23のステップS100-65で示したサブコマンド送信処理を実行するSBC_OUTモジュール、図26のステップS400-5で示したダイナミックポート出力処理を実行するDYM_OUTモジュール、図51のステップS800で示した普通遊技管理処理を実行するFUT_PRCモジュール、図36のステップS600で示した特別遊技管理処理を実行するTOK_PRCモジュール、図44のステップS700で特別電動役物遊技管理処理を実行するTDN_PRCモジュール、図31のステップS530で示した第2始動口通過処理を実行するSTA_PASモジュール、図34のステップS540で示したカウントスイッチ通過処理(大入賞口通過処理)を実行するTDN_PASモジュール、図32のステップS535で示した特別図柄乱数取得処理を実行するTZ_RGETモジュール、普通図柄変動時間設定処理を実行するFSPNTMRモジュール、図56のステップS841で示した普通電動役物入賞口開閉切替処理を実行するFDNCHGモジュール、図37のステップS610-9で示した特別図柄記憶エリアシフト処理を実行するTMEMSFTモジュール、図39のステップS612で示した特別図柄変動パターン決定処理を実行するTHPTSELモジュール、図37のステップS610で示した特別図柄変動待ち処理のステップS610-15で示した特別図柄変動時間設定処理を実行するTSPNTMモジュール、図43のステップS630-15で示したオープニング時間設定処理を実行するTSTATMRモジュール、図46のステップS711で示した大入賞口開閉切替処理を実行するTDNCHGモジュール、図48のステップS730-7で示した大入賞口閉鎖時間設定処理を実行するTCLSTMRモジュール、図48のステップS730-9で示したエンディング時間設定処理を実行するTENDTMRモジュール、図39のS612-15で示した変動パターン選択2処理(変動パターン番号決定処理)を実行するHPT_MODモジュール、図39のS612-15で示した変動パターン選択3処理(変動パターン番号決定処理)を実行するHPT_PATモジュール、図52のステップS810-5の中で実行されるワードデータ判定処理(図示せず)を実行するWORDJDGモジュール、図33のステップS536で示した取得時演出判定処理を実行するRGETCHKモジュール、図47のステップS720-9で示した大入賞口閉鎖有効時間設定処理のサブルーチンである大入賞口閉鎖有効時間選択処理を実行するTEF_SELモジュール等から呼び出される。
このように、図128(b)に示したWORDSELモジュールのコマンドの総コマンドサイズは、2行目のコマンド「ADDWB HL,A」1バイト+3行目のコマンド「ADDWB HL,A」1バイト+4行目のコマンド「LD HL,(HL)」2バイト+5行目のコマンド「LD A,L」1バイト+6行目のコマンド「RET」1バイト=6バイトとなり、総実行サイクルは、2行目1サイクル+3行目1サイクル+4行目4サイクル+5行目1サイクル+6行目3サイクル=10サイクルとなる。かかるWORDSELモジュールを設けることによって、上述した各モジュール内でワードデータ選択処理を行うことなく、コマンドサイズ1バイトのコマンド「RST WORDSEL」で賄うことができるので、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図130は、WORDSELモジュールを実現するためのコマンドの他の例を説明するための説明図である。ここでは、図128(b)のWORDSELモジュールのコマンド群を図130(b)のWORDSELモジュールのコマンド群に置き換えており、他の、図128(a)のWORDSELモジュールを呼び出す任意の処理のコマンド群、および、図128(c)のメインROM300bのプログラムデータにおける2バイトデータ群は、図130(a)、図130(c)として、そのまま用いている。ここでは、図130(a)、図130(c)のように、図128(a)、図128(c)と実質的に等しい処理についてはその説明を省略し、図130(b)の異なる処理のみを説明する。
図130(b)の1行目の指標「WORDSEL:」は、当該WORDSELモジュールの先頭アドレスを示す。2行目のコマンド「ADDALDW HL,(HL)」によって、HLレジスタの値にAレジスタの値が2回加算され、加算後のHLレジスタで示されるアドレスに格納された2バイト値がHLレジスタに読み出される。かかる2行目のコマンドが、図127(b)のステップS4、S5に対応する。3行目のコマンド「LD A,L」によって、HLレジスタのうち、Lレジスタの値がAレジスタに設定される。こうして、HLレジスタの値の下位1バイトが予めAレジスタに設定される。かかる3行目のコマンドが、図127(b)のステップS6に対応する。そして、4行目のコマンド「RET」によって、1段上のルーチンに戻る。かかる6行目のコマンドが、図127(b)のステップS7に対応する。
ここで、コマンド「ADDALDW HL,(HL)」は、HLレジスタの値にAレジスタの値が2回加算されHLレジスタを更新するとともに、加算後のHLレジスタで示されるアドレスに格納された値をHLレジスタに読み出すコマンドである。かかるコマンドのコマンドサイズは「2」であり、実行サイクルは「6」である。
続いて、図130(a)の4行目のコマンド「CALL (HL)」によって、取得された2バイト値、すなわち、普通遊技の状態に応じたアドレス値を呼び出す。かかる4行目のコマンドが、図127(a)のステップS8に対応する。
図130(b)のWORDSELモジュールのコマンドの総コマンドサイズは、2行目のコマンド「ADDALDW HL,(HL)」2バイト+3行目のコマンド「LD A,L」1バイト+4行目のコマンド「RET」1バイト=4バイトとなり、総実行サイクルは、2行目6サイクル+3行目1サイクル+4行目3サイクル=10サイクルとなる。したがって、図128(b)の場合と比べ、総コマンドサイズが2バイト削減されている。かかるWORDSELモジュールによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図128(b)と図130(b)とを比較して理解できるように、図128(b)において3行(2、3、4行目)を占有していたコマンド群を、図130(b)においては1行(2行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
図131は、WORDSELモジュールを実現するためのコマンドのさらに他の例を説明するための説明図である。ここでは、図130(a)のWORDSELモジュールを呼び出す任意の処理のコマンド群、および、図130(b)のWORDSELモジュールのコマンド群を、図131(a)の任意の処理のコマンド群に置き換えており、他の、図130(c)のメインROM300bのプログラムデータにおける2バイトデータ群は、図131(b)として、そのまま用いている。ここでは、図131(b)のように、図130(c)と実質的に等しい処理についてはその説明を省略し、図131(a)の異なる処理のみを説明する。
図131(a)の1行目のコマンド「LDQ A,(LOW R_FUT_PHS)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FUT_PHS」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値をAレジスタに読み出す。かかる1行目のコマンドが、図127(a)のステップS1に対応する。2行目のコマンド「LD HL
,J_JMP_FUT」によって、読み出し元となる1バイトデータ群の先頭アドレス「J_JMP_FUT」をHLレジスタに設定する。かかる2行目のコマンドが、図127(a)のステップS2に対応する。そして、3行目のコマンド「ADDALDW HL,(HL)」によって、HLレジスタの値にAレジスタの値が2回加算され、加算後のHLレジスタで示されるアドレスに格納された2バイト値がHLレジスタに読み出される。かかる3行目のコマンドが、図127(b)のステップS4、5に対応する。4行目のコマンド「CALL (HL)」によって、取得された2バイト値、すなわち、普通遊技の状態に応じたアドレス値を呼び出す。かかる4行目のコマンドが、図127(a)のステップS8に対応する。
図131の例では、図127(a)のステップS3に対応するコマンド「RST WORDSEL」、図127(b)のステップS6に対応するコマンド「LD A,L」、および、図127(b)のステップS7に対応するコマンド「RET」が省略されている。
図131(a)の任意の処理およびWORDSELモジュールのコマンドの総コマンドサイズは、1行目のコマンド「LDQ A,(LOW R_FUT_PHS)」2バイト+2行目のコマンド「LD HL,J_JMP_FUT」3バイト+3行目のコマンド「ADDALDW HL,(HL)」2バイト+4行目のコマンド「CALL (HL)」2バイト=9バイトとなり、総実行サイクルは、1行目2サイクル+2行目3サイクル+3行目6サイクル+4行目5サイクル=16サイクルとなる。
これに対し、図130(a)、図130(b)の任意の処理およびWORDSELモジュールのコマンドの総コマンドサイズは、図130(a)の1行目のコマンド「LDQ A,(LOW R_FUT_PHS)」2バイト+2行目のコマンド「LD HL,J_JMP_FUT」3バイト+3行目のコマンド「RST WORDSEL」1バイト+4行目のコマンド「CALL (HL)」2バイト+図130(b)の2行目のコマンド「ADDALDW HL,(HL)」2バイト+3行目のコマンド「LD A,L」1バイト+4行目のコマンド「RET」1バイト=12バイトとなり、総実行サイクルは、図130(a)の1行目2サイクル+2行目3サイクル+3行目4サイクル+4行目5サイクル+図130(b)の2行目6サイクル+3行目1サイクル+4行目3サイクル=24サイクルとなる。したがって、図131の例では、図130の場合と比べ、総コマンドサイズが3バイト削減され、総実行サイクルが8サイクル削減されている。このようにWORDSELモジュール自体をコマンドとして任意の処理に埋め込むことで、コマンドの更なる短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図130と図131とを比較して理解できるように、図130(b)において4行(1~4行目)を占有していたコマンド群を、図131においては記述する必要がなくなるので、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、WORDSELモジュールは、コマンド「RST」の対象としての汎用モジュールであるが、かかる汎用モジュールを省略することで、貴重な汎用モジュールの領域を空け、その領域に他のモジュールを配置することができる。こうしてリソースの有効活用が可能となる。
ただし、図131の例では、コマンド「LD A,L」を省略している。したがって、Lレジスタの値をAレジスタに設定する必要がある場合、別途、コマンド「LD A,L」を追加する必要がある。しかし、コマンド「LD A,L」は、コマンドサイズが「1」であり、実行サイクルが「1」なので、かかるコマンドの追加の影響は小さい。
なお、かかるWORDSELモジュールは、パチンコ機のみならず、スロットマシンにおける、例えば、図98のステップS3100-21で示した状態別モジュール実行処理を実行するためのCAL_MODモジュールや、そのCAL_MODモジュールから移行し、本前兆開始判定処理を実行するためのHID_JUGモジュールに利用される。
図132は、CAL_MODモジュールを説明するための説明図である。図132に示したCAL_MODモジュールは、状態別モジュール実行処理、すなわち、状態に対応したモジュールを実行する。
かかるCAL_MODモジュールを実行する段階では、既に、オフセット値が所定のレジスタ(例えば、Aレジスタ)に保持されている。図132(a)の1行目の指標「CAL_MOD:」は、当該CAL_MODモジュールの先頭アドレスを示す。2行目のコマンド「LD HL,T_INT_PHASE」によって、読み出し元となる2バイトデータ群の先頭アドレス「T_INT_PHASE」がHLレジスタに設定される。3行目のコマンド「ADD A,A」によって、Aレジスタの値にAレジスタの値が加算され、Aレジスタの値が2倍になる。ここで、Aレジスタの値を2倍にしているのは、読み出し元の値が2バイト値だからである。すなわち、テーブルに2バイト単位でデータが割り当てられているので、データを読み出すためには、アドレスを2ずつオフセットする必要があるからである。4行目のコマンド「ADDWB HL,A」によって、HLレジスタの値にAレジスタの値が加算され、HLレジスタが更新される。
そして、図132(a)の5行目のコマンド「LD HL,(HL)」によって、HLレジスタで示されるアドレスに格納された2バイト値がHLレジスタに読み出される。6行目のコマンド「JP (HL)」によって、HLアドレスで示されるアドレスに移動する。
ここで、コマンド「ADDALDW」への置き換えを行うと、図132(a)のコマンド群を図132(b)のように変更することができる。図132(b)の1行目の指標「CAL_MOD:」は、当該CAL_MODモジュールの先頭アドレスを示す。2行目のコマンド「LD HL,T_INT_PHASE」によって、読み出し元となる2バイトデータ群の先頭アドレス「T_INT_PHASE」がHLレジスタに設定される。3行目のコマンド「ADDALDW HL,(HL)」によって、HLレジスタの値にAレジスタの値が2回加算され、加算後のHLレジスタで示されるアドレスに格納された2バイト値がHLレジスタに読み出される。そして、4行目のコマンド「JP (HL)」によって、HLアドレスで示されるアドレスに移動する。
ここで、図132(a)に示したCAL_MODモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LD HL,T_INT_PHASE」3バイト+3行目のコマンド「ADD A,A」1バイト+4行目のコマンド「ADDWB HL,A」1バイト+5行目のコマンド「LD HL,(HL)」2バイト+6行目のコマンド「JP (HL)」2バイト=9バイトとなり、総実行サイクルは、2行目3サイクル+3行目1サイクル+4行目1サイクル+5行目4サイクル+6行目2サイクル=11サイクルとなる。一方、図132(b)に示したCAL_MODモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LD HL,T_INT_PHASE」3バイト+3行目のコマンド「ADDALDW HL,(HL)」2バイト+4行目のコマンド「JP (HL)」2バイト=7バイトとなり、総実行サイクルは、2行目3サイクル+3行目6サイクル+4行目2サイクル=11サイクルとなる。したがって、図132(a)のコマンド群を図132(b)のコマンド群に置き換えることで、総コマンドサイズが2バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図133は、HID_JUGモジュールを説明するための説明図である。図133に示したHID_JUGモジュールは、本前兆開始判定処理を実行する。
図133(a)の1行目の指標「HID_JUG:」は、当該HID_JUGモジュールの先頭アドレスを示す。2行目のコマンド「LDQ A,(LOW _NMD_KND)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_NMD_KND」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(通常モード種別)をAレジスタに読み出す。3行目のコマンド「LD HL,T_DAT_PGM-2」によって、読み出し元となる2バイトデータ群の先頭アドレス(「T_DAT_PGM」から2を減算した値)がHLレジスタに設定される。4行目のコマンド「ADD A,A」によって、Aレジスタの値にAレジスタの値が加算され、Aレジスタの値が2倍になる。ここで、Aレジスタの値を2倍にしているのは、読み出し元の値が2バイト値だからである。すなわち、テーブルに2バイト単位でデータが割り当てられているので、データを読み出すためには、アドレスを2ずつオフセットする必要があるからである。5行目のコマンド「ADDWB HL,A」によって、HLレジスタの値にAレジスタの値が加算され、HLレジスタが更新される。そして、図133(a)の6行目のコマンド「LD HL,(HL)」によって、HLレジスタで示されるアドレスに格納された2バイト値がHLレジスタに読み出される。
ここで、コマンド「ADDALDW」への置き換えを行うと、図133(a)のコマンド群を図133(b)のように変更することができる。図133(b)の1行目の指標「HID_JUG:」は、当該HID_JUGモジュールの先頭アドレスを示す。2行目のコマンド「LDQ A,(LOW _NMD_KND)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_NMD_KND」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(通常モード種別)をAレジスタに読み出す。3行目のコマンド「LD HL,T_DAT_PGM-2」によって、読み出し元となる2バイトデータ群の先頭アドレス(「T_DAT_PGM」から2を減算した値)がHLレジスタに設定される。4行目のコマンド「ADDALDW HL,(HL)」によって、HLレジスタの値にAレジスタの値が2回加算され、加算後のHLレジスタで示されるアドレスに格納された2バイト値がHLレジスタに読み出される。
ここで、図133(a)に示したHID_JUGモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LDQ A,(LOW _NMD_KND)」2バイト+3行目のコマンド「LD HL,T_DAT_PGM-2」3バイト+4行目のコマンド「ADD A,A」1バイト+5行目のコマンド「ADDWB HL,A」1バイト+6行目のコマンド「LD HL,(HL)」2バイト=9バイトとなり、総実行サイクルは、2行目2サイクル+3行目3サイクル+4行目1サイクル+5行目1サイクル+6行目4サイクル=11サイクルとなる。一方、図133(b)に示したHID_JUGモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LDQ A,(LOW _NMD_KND)」2バイト+3行目のコマンド「LD HL,T_DAT_PGM-2」3バイト+4行目のコマンド「ADDALDW HL,(HL)」2バイト=7バイトとなり、総実行サイクルは、2行目2サイクル+3行目3サイクル+4行目6サイクル=11サイクルとなる。したがって、図133(a)のコマンド群を図133(b)のコマンド群に置き換えることで、総コマンドサイズが2バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
<コマンド「INLD」、「INLDTQR」>
RAMSETモジュールは、ラムセット処理、すなわち、メインRAM300cの変数に所定の値(初期値)を設定するための汎用モジュールである。ここでは、RAMSETモジュールをメモリマップ上の0020Hに配置する例を挙げて説明する。
メインCPU300aは、メインROM300bからプログラムを読み出し、読み出したプログラムを遂行し、任意の処理において、サブルーチンとしてRAMSETモジュールを呼び出し、RAMSETモジュールを遂行する。RAMSETモジュールでは、メインROM300bのプログラムデータに記述された複数の1バイト値を、メインRAM300cのワークエリアにおいて変数として扱われる複数のデータを保持する領域に転送する。こうして、複数の変数の値が設定される。ここで、転送するデータの数を単にデータ数と言う。
図134は、RAMSETモジュールの具体的な処理を示したフローチャートである。ここでは、任意の処理として、図22のステップS100で示したCPU初期化処理を実行するCPUINITモジュールの一部を挙げて説明する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。また、当該RAMSETモジュールの説明中、第1レジスタはBレジスタであり、第2レジスタはHLレジスタであり、第1値は「1」であり、第2値は「2」である。なお、第1値および第2値を任意に設定できるのは言うまでもない。
メインCPU300aは、図134(a)のように、任意の処理において、転送元となる1バイトデータ群の先頭アドレスをHLレジスタに設定する(S1)。そして、サブルーチンとしてRAMSETモジュールを呼び出す(S2)。
メインCPU300aは、図134(b)のように、RAMSETモジュールにおいて、HLレジスタで示されるアドレスに格納された1バイト値をBレジスタに読み出す(S3)。かかる1バイト値はデータ数を示す。続いて、メインCPU300aは、HLレジスタに「1」を加えた値で示されるアドレスに格納された値で特定されるアドレスに、HLレジスタに「2」を加えた値で示されるアドレスに格納された値を転送し、HLレジスタの値に「2」を加えて次に転送するアドレスを設定する(S4)。続いて、メインCPU300aは、Bレジスタの値をデクリメント(「1」減算)し、デクリメントした結果が0であるか否か判定する(S5)。ここで、デクリメントした結果が0でなければ(S5におけるNO)、ステップS4からの処理を繰り返し、デクリメントした結果が0であれば(S5におけるYES)、当該RAMSETモジュールを終了して1段上のルーチンに戻る(S6)。
図135、図136は、RAMSETモジュールを実現するためのコマンドの一例を説明するための説明図である。このうち、図135(a)は、RAMSETモジュールを呼び出す任意の処理のコマンド群を示し、図135(b)は、RAMSETモジュールのコマンド群を示し、図135(c)は、メインROM300bのプログラムデータにおける1バイトデータ群の配置を示し、図135(d)は、メインRAM300cのワークエリアにおける1バイトデータ群の配置を示す。図134で示したフローチャートは、例えば、図135に示したプログラムによって実現される。
図135(a)の1行目のコマンド「LD HL,D_RAM_RST_INI」によって、転送元となる1バイトデータ群の先頭アドレス「D_RAM_RST_INI」をHLレジスタに設定する。かかる1行目のコマンドが、図134(a)のステップS1に対応する。そして、2行目のコマンド「RST RAMSET」によって、サブルーチンとしてRAMSETモジュールが呼び出される。かかる2行目のコマンドが、図134(a)のステップS2に対応する。
図135(b)の1行目の指標「RAMSET:」は、当該RAMSETモジュールの先頭アドレスを示す。2行目のコマンド「LD B,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト値がBレジスタに読み出される。このとき、HLレジスタには、図135(a)で示したように、アドレス「D_RAM_RST_INI」が設定されている。したがって、図135(c)の2行目の1バイト値「(@D_RAM_RST_INI-D_RAM_RST_INI-1)/2」がデータ数(転送の繰り返し数)としてBレジスタに読み出されることとなる。なお、「@D_RAM_RST_INI」は、転送元となる1バイトデータ群の最終アドレスの次のアドレスであり、D_RAM_RST_INIは転送元となる1バイトデータ群の先頭アドレスなので、@D_RAM_RST_INI-D_RAM_RST_INI-1の値(データ数を示す1バイト値)の値が、1バイト値の総バイト数となり、その値を、アドレスと値との組み合わせ数である2で除算すると、データ数が導出される。図135(c)の例では、データ数は、(11-1)/2=5となる。かかる図135(c)の2行目のコマンドが、図134(b)のステップS3に対応する。
図135(b)の3行目の指標「RAMSET_10:」は繰り返し処理の先頭アドレスを示す。4行目のコマンド「INLD AC,(HL)」および5行目のコマンド「LDQ (C),A」によって、HLレジスタに「1」を加えた値で示されるアドレスに格納された値で特定されるアドレスに、HLレジスタに「2」を加えた値で示されるアドレスに格納された値が格納され、HLレジスタの値に「2」が加えられて次に転送するアドレスが設定される。かかる4、5行目のコマンドが、図134(b)のステップS4に対応する。
ここで、コマンド「INLD AC,(HL)」は、HLレジスタに「1」を加えた値で示されるアドレスに格納された値をCレジスタに格納し、HLレジスタに「2」を加えた値で示されるアドレスに格納された値をAレジスタに格納し、HLレジスタの値に「2」を加えてHLレジスタの値を更新するコマンドである。かかるコマンドのコマンドサイズは「2」であり、実行サイクルは「4」である。
例えば、HLレジスタがアドレス「D_RAM_RST_INI」の値であった場合、図135(c)の3行目における2バイト変数「R_TZ1_STP」の下位1バイト値がCレジスタに格納され、図135(c)の3行目における「@DSP_HAZ」の値がAレジスタに格納される。
また、図135(b)の5行目のコマンド「LDQ (C),A」は、Qレジスタの値をアドレスの上位1バイトとし、Cレジスタの値をアドレスの下位1バイトとし、そのアドレスに、Aレジスタの値を格納するコマンドである。かかるコマンドのコマンドサイズは「2」であり、実行サイクルは「3」である。
例えば、Cレジスタの値、すなわち「R_TZ1_STP」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに、Aレジスタの値、すなわち、「@DSP_HAZ」の値を格納する。
ここで、図135(c)、図135(d)において、変数「R_TZ1_STP」は、特別図柄1停止図柄番号を示し、変数「R_TZ2_STP」は、特別図柄2停止図柄番号を示し、変数「R_TZ1_DSP」は、特別図柄1表示図柄カウンタのカウンタ値を示し、変数「R_TZ2_DSP」は、特別図柄2表示図柄カウンタのカウンタ値を示し、変数「R_EXT_SEC_TMR」はセキュリティ外部信号タイマ値を示す。なお、図135(d)に示す変数の配置は図のように連続している必要はなく、離隔していてもよい。
続いて、図135(b)の6行目のコマンド「DJNZ RAMSET_10」によって、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0でなければ、アドレス「RAMSET_10」に移動し、デクリメントした結果が0であれば、当該コマンドの次のコマンドに処理を移す。ここでは、データ数が「5」なので、「RAMSET_10」からの処理を5回繰り返すとBレジスタの値が0となる。かかる6行目のコマンドが、図134(b)のステップS5に対応する。そして、7行目のコマンド「RET」によって、1段上のルーチンに戻る。かかる7行目のコマンドが、図134(b)のステップS6に対応する。
こうして、図136に示すように、メインROM300bのプログラムデータに記述された複数の1バイト値(55H、77H、66H、22H、AAH)を、メインRAM300cのワークエリアにおける変数(「R_TZ1_STP」、「R_TZ2_STP」、「R_TZ1_DSP」、「R_TZ2_DSP」、「R_EXT_SEC_TMR」)に転送することが可能となる。
RAMSETモジュールは、複数のモジュールからサブルーチンとして呼び出される。例えば、図22のステップS100で示したCPU初期化処理を実行するCPUINITモジュール、セキュリティ設定処理を実行するSEC_SETモジュール、図26のステップS400-21で示した状態管理処理(エラー管理処理)を実行するSTC_PRCモジュール、図52のステップS810で示した普通図柄変動待ち処理を実行するFZ_STAモジュール、図53のステップS820で示した普通図柄変動中処理を実行するFZ_SPNモジュール、図54のステップS830で示した普通図柄停止図柄表示処理を実行するFZ_STPモジュール、図55のステップS840で示した普通電動役物入賞口開放前処理を実行するFD_PREモジュール、図57のステップS850で示した普通電動役物入賞口開放制御処理を実行するFD_OPNモジュール、図37のステップS610で示した特別図柄変動待ち処理を実行するTZ_STAモジュール、図41のステップS620で示した特別図柄変動中処理を実行するTZ_SPNモジュール、図43のステップS630で示した特別図柄停止図柄表示処理を実行するTZ_STPモジュール、図45のステップS710で示した大入賞口開放前処理を実行するTD_PREモジュール、図47のステップS720で示した大入賞口開放制御処理を実行するTD_OPNモジュール、図48のステップS730で示した大入賞口閉鎖有効処理を実行するTD_EFFモジュール、図49のステップ740で示した大入賞口終了ウェイト処理を実行するTD_ENDモジュール、図43のステップS630の中で実行される特別図柄変動待ち状態移行処理(図示せず)を実行するTOKZEROモジュール、図40のステップS613で示した回数切り管理処理を実行するCHGSTSモジュール、図27のステップS450で示した設定関連処理を実行するRNK_PRCモジュール等から呼び出される。
このように、図135(b)に示したRAMSETモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LD B,(HL)」1バイト+4行目のコマンド「INLD AC,(HL)」2バイト+5行目のコマンド「LDQ (C),A」2バイト+6行目のコマンド「DJNZ RAMSET_10」2バイト+7行目のコマンド「RET」1バイト=8バイトとなり、総実行サイクルは、2行目2サイクル+4行目4サイクル+5行目3サイクル+6行目3サイクル(または2サイクル)+7行目3サイクル=15サイクル(または14サイクル)となる。なお、括弧内のサイクル数は、コマンド「DJNZ RAMSET_10」によって移動しなかった場合の実行サイクルを示している。かかるRAMSETモジュールを設けることによって、上述した各モジュール内でラムセット処理を行うことなく、コマンドサイズ1バイトのコマンド「RST RAMSET」で賄うことができるので、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図137は、RAMSETモジュールを実現するためのコマンドの他の例を説明するための説明図である。ここでは、図135(b)のRAMSETモジュールのコマンド群を図137(b)のRAMSETモジュールのコマンド群に置き換えており、他の、図135(a)のRAMSETモジュールを呼び出す任意の処理のコマンド群、図135(c)のメインROM300bのプログラムデータにおける1バイトデータ群、および、図135(d)のメインRAM300cのワークエリアにおける1バイトデータ群は、図137(a)、図137(c)、図137(d)として、そのまま用いている。ここでは、図137(a)、図137(c)、図137(d)のように、図135(a)、図135(c)、図135(d)と実質的に等しい処理についてはその説明を省略し、図137(b)の異なる処理のみを説明する。
図137(b)の1行目の指標「RAMSET:」は、当該RAMSETモジュールの先頭アドレスを示す。2行目のコマンド「LD B,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト値がBレジスタに読み出される。このとき、HLレジスタには、図137(a)で示したように、アドレス「D_RAM_RST_INI」が設定されている。したがって、図137(c)の2行目の1バイト値「(@D_RAM_RST_INI-D_RAM_RST_INI-1)/2」がデータ数としてBレジスタに読み出される。かかる図137(b)の2行目のコマンドが、図134(b)のステップS3に対応する。
図137(b)の3行目のコマンド「INLDTQR AC,(HL)」によって、HLレジスタに「1」を加えた値で示されるアドレスに格納された値で特定されるアドレスに、HLレジスタに「2」を加えた値で示されるアドレスに格納された値が転送され、HLレジスタの値に「2」を加えて次に転送するアドレスが設定され、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0になるまで、当該処理が繰り返される。かかる3行目のコマンドが、図134(b)のステップS4、S5に対応する。
ここで、コマンド「INLDTQR AC,(HL)」は、Qレジスタの値をアドレスの上位1バイトとし、HLレジスタに「1」を加えた値で示されるアドレスに格納された値をアドレスの下位1バイトとし、そのアドレスに、HLレジスタに「2」を加えた値で示されるアドレスに格納された値を転送し、HLレジスタの値に「2」を加えてHLレジスタの値を更新し、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0になるまで、値の転送を繰り返すコマンドである。かかるコマンドのコマンドサイズは「2」であり、実行サイクルは「5」である。
例えば、HLレジスタがアドレス「D_RAM_RST_INI」の値であった場合、Qレジスタの値をアドレスの上位1バイトとし、図137(c)の3行目における「R_TZ1_STP」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに、図137(c)の3行目における「@DSP_HAZ」の値が転送され、HLレジスタの値に「2」が加えられ、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0になるまで、すなわち、5回転送が繰り返される。
そして、図137(b)の4行目のコマンド「RET」によって、1段上のルーチンに戻る。かかる4行目のコマンドが、図134(b)のステップS6に対応する。
図137(b)のRAMSETモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LD B,(HL)」1バイト+3行目のコマンド「INLDTQR AC,(HL)」2バイト+4行目のコマンド「RET」1バイト=4バイトとなり、総実行サイクルは、2行目2サイクル+3行目5サイクル+4行目3サイクル=10サイクルとなる。したがって、図135(b)の場合と比べ、総コマンドサイズが4バイト削減され、総実行サイクルも少なくとも4サイクル削減される。特に、図135(b)の例では、コマンド「DJNZ RAMSET_10」におけるBレジスタの値が2以上であれば、その値に10サイクル(4行目4サイクル+5行目3サイクル+6行目3サイクル)を乗じた分だけ総実行サイクルが増えるので、図137(b)の総実行サイクルの削減量も多くなる。かかるRAMSETモジュールによって、コマンドの更なる短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、ここでは、図135の例と比較して、AレジスタおよびCレジスタを利用していない。したがって、Aレジスタの値やCレジスタの値を意図せず更新してしまうことはない。また、図135の例では、AレジスタやCレジスタが既に利用されている場合、スタックしてAレジスタやCレジスタの値を退避する必要があったが、ここでは、AレジスタやCレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
また、図135(b)と図137(b)とを比較して理解できるように、図135(b)において4行(3行目~6行目)を占有していたコマンド群を、図137(b)においては1行(3行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
なお、かかるRAMSETモジュールは、パチンコ機のみならず、スロットマシンにおいても、メインRAM500cの変数に所定の値(初期値)を設定するためのテーブルセット処理を実行するTABLSETモジュール(汎用モジュール)として利用されている。
図138は、TABLSETモジュールを実現するためのコマンドの一例を説明するための説明図である。このうち、図138(a)は、TABLSETモジュールを呼び出す任意の処理のコマンド群を示し、図138(b)は、TABLSETモジュールのコマンド群を示し、図138(c)は、メインROM500bのプログラムデータにおける1バイトデータ群の配置を示し、図138(d)は、メインRAM500cのワークエリアにおける1バイトデータ群の配置を示す。
なお、ここでは、任意の処理として、図89のステップS2200-11や図95のステップS2800-39で示したエラーウェイト処理、すなわち、エラー表示、警告音要求およびエラー復帰待ちを実行するERRWAITモジュールの一部を挙げている。
図138(a)の1行目のコマンド「LD HL,T_ERR_RCV」によって、転送元となる1バイトデータ群の先頭アドレス「T_ERR_RCV」をHLレジスタに設定する。そして、2行目のコマンド「RST TABLSET」によって、サブルーチンとしてTABLSETモジュールが呼び出される。
図138(b)の1行目の指標「TABLSET:」は、当該TABLSETモジュールの先頭アドレスを示す。2行目のコマンド「PUSH BC」によって、BCレジスタの値がスタック領域に退避される。3行目のコマンド「DI」によって割込が禁止される。
図138(b)の4行目のコマンド「LD B,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト値がBレジスタに読み出される。このとき、HLレジスタには、図138(a)で示したように、アドレス「T_ERR_RCV」が設定されている。したがって、図138(c)の2行目の1バイト値「(T_ERR_RCV_-T_ERR_RCV)/2」がデータ数(転送の繰り返し数)としてBレジスタに読み出されることとなる。なお、「T_ERR_RCV_」は、転送元となる1バイトデータ群の最終アドレスの次のアドレスであり、T_ERR_RCVは転送元となる1バイトデータ群の先頭アドレスなので、T_ERR_RCV_-T_ERR_RCVの値(データ数を示す1バイト値)の値が、1バイト値の総バイト数となり、その値を、アドレスと値との組み合わせ数である2で除算すると、データ数が導出される。図138(c)の例では、データ数は、9/2=4となる。
図138(b)の5行目の指標「TABLSET10:」は繰り返し処理の先頭アドレスを示す。6行目のコマンド「INLD AC,(HL)」および7行目のコマンド「LDQ (C),A」によって、HLレジスタに「1」を加えた値で示されるアドレスに格納された値で特定されるアドレスに、HLレジスタに「2」を加えた値で示されるアドレスに格納された値が格納され、HLレジスタの値に「2」が加えられて次に転送するアドレスが設定される。
例えば、HLレジスタがアドレス「T_ERR_RCV」の値であった場合、図138(c)の3行目における2バイト変数「_ERR_NUM」の下位1バイト値がCレジスタに格納され、図138(c)の3行目における「0」の値がAレジスタに格納される。
また、図138(b)の7行目のコマンド「LDQ (C),A」は、Qレジスタの値をアドレスの上位1バイトとし、Cレジスタの値をアドレスの下位1バイトとし、そのアドレスに、Aレジスタの値を格納するコマンドである。
例えば、Cレジスタの値、すなわち「_ERR_NUM」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに、Aレジスタの値、すなわち、「0」の値を格納する。
ここで、図138(c)、図138(d)において、変数「_ERR_NUM」は、エラー番号を示し、変数「_CRE_TMR」は、クレジットボタン検出タイマを示し、変数「_CRE_FLG」は、クレジットボタン検出フラグを示し、変数「_SNS_OLD」はメダル通過センサービット前回状態を示す。なお、図138(d)に示す変数の配置は図のように連続している必要はなく、離隔していてもよい。
続いて、図138(b)の8行目のコマンド「DJNZ TABLSET10」によって、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0でなければ、アドレス「TABLSET10」に移動し、デクリメントした結果が0であれば、当該コマンドの次のコマンドに処理を移す。ここでは、データ数が「4」なので、「TABLSET10」からの処理を4回繰り返すとBレジスタの値が0となる。
図138(b)の9行目のコマンド「EI」によって割込が許可される。10行目のコマンド「POP BC」によってスタック領域に退避されていたデータがBCレジスタに復帰される。そして、11行目のコマンド「RET」によって、1段上のルーチンに戻る。
ここで、コマンド「INLDTQR」への置き換えを行うと、コマンド群を以下のように記述できる。
図139は、TABLSETモジュールを実現するためのコマンドの他の例を説明するための説明図である。ここでは、図138(b)のTABLSETモジュールのコマンド群を、図139(b)のTABLSETモジュールのコマンド群に置き換えており、他の、図138(a)のTABLSETモジュールを呼び出す任意の処理のコマンド群、図138(c)のメインROM500bのプログラムデータにおける1バイトデータ群、および、図138(d)のメインRAM500cのワークエリアにおける1バイトデータ群は、図139(a)、図139(c)、図139(d)として、そのまま用いている。ここでは、図139(a)、図139(c)、図139(d)のように、図138(a)、図138(c)、図138(d)と実質的に等しい処理についてはその説明を省略し、図139(b)の異なる処理のみを説明する。
図139(b)の1行目の指標「TABLSET:」は、当該TABLSETモジュールの先頭アドレスを示す。2行目のコマンド「PUSH BC」によって、BCレジスタの値がスタック領域に退避される。3行目のコマンド「DI」によって割込が禁止される。
図139(b)の4行目のコマンド「LD B,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト値がBレジスタに読み出される。このとき、HLレジスタには、図139(a)で示したように、アドレス「T_ERR_RCV」が設定されている。したがって、図139(c)の2行目の1バイト値「(T_ERR_RCV_-T_ERR_RCV)/2」がデータ数(転送の繰り返し数)としてBレジスタに読み出されることとなる。図139(c)の例では、データ数は4となる。
図139(b)の5行目のコマンド「INLDTQR (HL)」によって、HLレジスタに「1」を加えた値で示されるアドレスに格納された値で特定されるアドレスに、HLレジスタに「2」を加えた値で示されるアドレスに格納された値が転送され、HLレジスタの値に「2」を加えて次に転送するアドレスが設定され、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0になるまで、当該処理が繰り返される。
続いて、図139(b)の6行目のコマンド「EI」によって割込が許可される。7行目のコマンド「POP BC」によってスタック領域に退避されていたデータがBCレジスタに復帰される。そして、8行目のコマンド「RET」によって、1段上のルーチンに戻る。
ここで、図138(b)に示したTABLSETモジュールのコマンドの総コマンドサイズは、2行目のコマンド「PUSH BC」1バイト+3行目のコマンド「DI」1バイト+4行目のコマンド「LD B,(HL)」1バイト+6行目のコマンド「INLD AC,(HL)」2バイト+7行目のコマンド「LDQ (C),A」2バイト+8行目のコマンド「DJNZ TABLSET10」2バイト+9行目のコマンド「EI」1バイト+10行目のコマンド「POP BC」1バイト+11行目のコマンド「RET」1バイト=12バイトとなり、総実行サイクルは、2行目3サイクル+3行目1サイクル+4行目2サイクル+6行目4サイクル+7行目3サイクル+8行目3サイクル(または2サイクル)+9行目1サイクル+10行目3サイクル+11行目3サイクル=23サイクル(または22サイクル)となる。一方、図139(b)に示したTABLSETモジュールのコマンドの総コマンドサイズは、2行目のコマンド「PUSH BC」1バイト+3行目のコマンド「DI」1バイト+4行目のコマンド「LD B,(HL)」1バイト+5行目のコマンド「INLDTQR (HL)」2バイト+6行目のコマンド「EI」1バイト+7行目のコマンド「POP BC」1バイト+8行目のコマンド「RET」1バイト=8バイトとなり、総実行サイクルは、2行目3サイクル+3行目1サイクル+4行目2サイクル+5行目5サイクル+6行目1サイクル+7行目3サイクル+8行目3サイクル=18サイクルとなる。したがって、図138(b)の場合と比べ、総コマンドサイズが4バイト削減され、総実行サイクルも少なくとも5サイクル削減される。特に、図138(b)の例では、コマンド「DJNZ TABLSET10」におけるBレジスタの値が2以上であれば、その値に10サイクル(6行目4サイクル+7行目3サイクル+8行目3サイクル)を乗じた分だけ総実行サイクルが増えるので、図139(b)の総実行サイクルの削減量も多くなる。かかるTABLSETモジュールによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、ここでは、図138の例と比較して、AレジスタおよびCレジスタを利用していない。したがって、Aレジスタの値やCレジスタの値を意図せず更新してしまうことはない。また、図138の例では、AレジスタやCレジスタが既に利用されている場合、スタックしてAレジスタやCレジスタの値を退避する必要があったが、ここでは、AレジスタやCレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
また、図138(b)と図139(b)とを比較して理解できるように、図138(b)において4行(5行目~8行目)を占有していたコマンド群を、図139(b)においては1行(5行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
なお、TABLSETモジュールは、ERRWAITモジュールのみならず、複数のモジュールからサブルーチンとして呼び出される。例えば、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、本前兆中処理(AT状態=「3」)を実行するHID_LOTモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、終了画面中処理(AT状態=「4」)を実行するFIN_LOTモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、準備中処理(AT状態=「5」)を実行するPRE_LOTモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、REG中処理(AT状態=「6」)を実行するREG_LOTモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、BIG中処理(AT状態=「7」)を実行するBIG_LOTモジュール、図85のステップS2020で示した設定値切り替え処理を実行するRANKSETモジュール、図91のステップS2400で示した図柄コード設定処理を実行するFGSETUPモジュール、図96のステップS2900で示した遊技移行処理を実行するGAMESETモジュール、図96のステップS2900-3で示した役物作動図柄表示処理を実行するJCGMSETモジュール等から呼び出される。
<コマンド「DECM」、「DECWM」>
BYTEDECモジュールは、バイトカウンタ減算処理、すなわち、メインRAM300cの1バイト変数を1だけデクリメントするための汎用モジュールである。なお、BYTEDECモジュールでは、デクリメントのみならず、デクリメントした結果、ゼロフラグおよびキャリーフラグを設定している。
メインCPU300aは、メインROM300bからプログラムを読み出し、読み出したプログラムを遂行し、任意の処理において、サブルーチンとしてBYTEDECモジュールを呼び出し、BYTEDECモジュールを遂行する。BYTEDECモジュールでは、メインRAM300cに保持された1バイト値をデクリメントする。
図140は、BYTEDECモジュールの具体的な処理を示したフローチャートである。ここでは、任意の処理として、図43のステップS630で示した特別図柄停止図柄表示処理を実行するTZ_STPモジュールの一部を挙げて説明する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。また、当該BYTEDECモジュールの説明中、所定のレジスタはHLレジスタである。
メインCPU300aは、図140(a)のように、任意の処理を実行する。メインCPU300aは、まず、HLレジスタに、デクリメントの対象となる変数のアドレスを設定する(S1)。そして、サブルーチンとしてBYTEDECモジュールを呼び出す(S2)。
メインCPU300aは、図140(b)のように、BYTEDECモジュールにおいて、HLレジスタで示されるアドレスに格納された1バイト値を1だけデクリメントし、かつ、ゼロフラグおよびキャリーフラグを設定する(S3)。そして、当該BYTEDECモジュールを終了して1段上のルーチンに戻る(S4)。以下、デクリメント態様とフラグの設定について詳述する。
図141は、BYTEDECモジュールにおけるデクリメント態様とゼロフラグおよびキャリーフラグの設定を説明するための説明図である。ここでは、デクリメント前が1以上(1または2以上)であれば、デクリメント後は、1だけデクリメントされた値になる。ただし、デクリメント前が0であった場合、デクリメント後は-1とならず、0となる。すなわち、下限値は0であり、負の値となることはない。このような0の維持は、デクリメント前が0であった場合、デクリメントしてさらにインクリメント、または、強制的に0を読み出して実現してもよいし、デクリメントを行わないことでも実現できる。
また、デクリメント前が2以上であれば、デクリメント後は1以上となるので、ゼロフラグは立たず0となるが、デクリメント前が1または0であれば、デクリメント後は0となるので、ゼロフラグが立って1となる。また、当該BYTEDECモジュールでは、デクリメント前が1であれば、デクリメント後は0となり、その場合にキャリーフラグを立たせて1とする。そして、デクリメント前が2以上または0であればキャリーフラグを立たせず0とする。
図140(a)に戻り、BYTEDECモジュールによって、ゼロフラグおよびキャリーフラグが設定されると、メインCPU300aは、そのフラグの値を用いて様々な処理を遂行する。例えば、ここでは、デクリメントが1を減算して0とする処理ではないことを判定し(S5)、その結果、1を減算して0とする処理でなければ(S5におけるYES)、特別図柄当たりフラグチェック処理を行う所定のアドレス(TZ_STP_10)に移動し(S6)、1を減算して0とする処理であれば(S5におけるNO)、移動することなく次の処理を遂行する。
図142は、BYTEDECモジュールを実現するためのコマンドの一例を説明するための説明図である。このうち、図142(a)は、BYTEDECモジュールを呼び出す任意の処理のコマンド群を示し、図142(b)は、BYTEDECモジュールのコマンド群を示す。図140で示したフローチャートは、例えば、図142に示したプログラムによって実現される。
図142(a)の1行目のコマンド「LDQ HL,LOW R_EXT_HCT」によって、Qレジスタの値をHレジスタに読み出し、アドレス「R_EXT_HCT」の下位1バイトの値をLレジスタに読み出す。かかる1行目のコマンドが、図140(a)のステップS1に対応する。そして、2行目のコマンド「CALLF BYTEDEC」によって、サブルーチンとしてBYTEDECモジュールが呼び出される。かかる2行目のコマンドが、図140(a)のステップS2に対応する。
ここで、コマンド「CALLF BYTEDEC」は、メモリマップのうち0000H~11FFHの範囲のみ呼び出しできるコマンドである。呼び出しに用いられるコマンド「CALLF」は通常のコマンド「CALL」と実行サイクルは「4」で等しいが、通常のコマンド「CALL」のコマンドサイズが「3」であるのに対し、コマンド「CALLF」のコマンドサイズは「2」である。したがって、プログラムの短縮化を図ることができる。なお、コマンド「CALLF BYTEDEC」の代わりに、上述した汎用モジュール同様「RST BYTEDEC」によってBYTEDECモジュールを呼び出すとしてもよい。そうすることで、コマンドサイズを「1」にすることができる。
図142(b)の1行目の指標「BYTEDEC:」は、当該BYTEDECモジュールの先頭アドレスを示す。2行目のコマンド「LD A,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト値がAレジスタに読み出される。かかるコマンド「LD A,(HL)」では、その実行により第2ゼロフラグが変化する。そして、3行目のコマンド「RT Z,A」によって、Aレジスタの値が0であれば(第2ゼロフラグが1であれば)、1段上のルーチンに戻る。このとき、Aレジスタの値が0であれば、コマンド「RT Z,A」によってゼロフラグ(第1ゼロフラグ)が1となり、キャリーフラグは0となる。こうして、HLレジスタで示されるアドレスに格納された値が0であれば、デクリメントを行うことなく、ゼロフラグ=1、キャリーフラグ=0とすることができる。
図142(b)の4行目のコマンド「CP A,2」によって、Aレジスタの値と2が比較され、Aレジスタが2以上であれば、キャリーフラグは立たず0となり、1であれば、キャリーフラグが立って1となる。なお、コマンド「CP A,2」は、Aレジスタが2未満の場合にキャリーフラグが立つコマンドであるが、かかるコマンド「CP A,2」の実行段階では、Aレジスタの値は1か2以上のいずれかとなっているので(0ではないので)、2未満でキャリーフラグを立たせることで、結果的に1の場合にキャリーフラグが立つこととなる。こうして、Aレジスタの値が1であれば、キャリーフラグ=1とすることができる。5行目のコマンド「DEC (HL)」によって、HLレジスタで示されるアドレスに格納された1バイト値を1だけデクリメントして、HLレジスタで示されるアドレスに格納された値を更新する。ここで、HLレジスタで示されるアドレスに格納された値が2以上であれば、デクリメントした値は1以上なので、ゼロフラグは立たず0となり、1であれば、デクリメントした値が0となるので、ゼロフラグが立って1となる。なお、コマンド「DEC (HL)」によってはキャリーフラグは変化しない。こうして、HLレジスタで示されるアドレスに格納された値が2以上であれば、ゼロフラグ=0、キャリーフラグ=0とし、1であれば、ゼロフラグ=1、キャリーフラグ=1とすることができる。かかる2~5行目のコマンドが図140(b)のステップS3に対応する。そして、6行目のコマンド「RET」によって、1段上のルーチンに戻る。かかる6行目のコマンドが、図140(b)のステップS4に対応する。こうして、HLレジスタで示されるアドレスに格納された値を1だけデクリメントし、かつ、ゼロフラグおよびキャリーフラグを設定することが可能となる。
続いて、図142(a)の3行目のコマンド「JR NC,TZ_STP_10」によって、キャリーフラグが0(NC)であれば、TZ_STP_10に移動する。かかる3行目のコマンドが、図140(a)のステップS5、6に対応する。こうして、BYTEDECモジュールの結果に基づいた処理が可能となる。
BYTEDECモジュールは、複数のモジュールからサブルーチンとして呼び出される。例えば、図26のステップS400-15で示したタイマ更新処理を実行するTMR_NEWモジュール、図26のステップS400-21で示した状態管理処理(エラー管理処理)を実行するSTC_PRCモジュール、図43のステップS630で示した特別図柄停止図柄表示処理を実行するTZ_STPモジュール、図40のステップS613で示した回数切り管理処理を実行するCHGSTSモジュール、図34のステップS540で示したカウントスイッチ通過処理(大入賞口通過処理)において大入賞口入球コマンドをセット(S540-3)した後に実行する大入賞口過剰入賞監視処理を実行するTDOVCHKモジュール、図26のステップS400-21で示した状態管理処理(エラー管理処理)のサブルーチンであるベース異常エラー監視処理を実行するBER_CHKモジュール等から呼び出される。
このように、図142(b)に示したBYTEDECモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LD A,(HL)」1バイト+3行目のコマンド「RT Z,A」1バイト+4行目のコマンド「CP A,2」2バイト+5行目のコマンド「DEC (HL)」1バイト+6行目のコマンド「RET」1バイト=6バイトとなり、総実行サイクルは、2行目2サイクル+3行目4サイクル(または2サイクル)+4行目2サイクル+5行目4サイクル+6行目3サイクル=15サイクル(または13サイクル)となる。なお、括弧内のサイクル数は、コマンド「RT Z,A」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。かかるBYTEDECモジュールを設けることによって、上述した各モジュール内でバイトカウンタ減算処理を行うことなく、コマンドサイズ2バイトのコマンド「CALLF BYTEDEC」で賄うことができるので、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図143は、BYTEDECモジュールを実現するためのコマンドの他の例を説明するための説明図である。ここでは、図142(b)のBYTEDECモジュールのコマンド群を図143(b)のBYTEDECモジュールのコマンド群に置き換えており、他の、図142(a)のBYTEDECモジュールを呼び出す任意の処理のコマンド群は、図143(a)として、そのまま用いている。ここでは、図143(a)のように、図142(a)と実質的に等しい処理についてはその説明を省略し、図143(b)の異なる処理のみを説明する。
図143(b)の1行目の指標「BYTEDEC:」は、当該BYTEDECモジュールの先頭アドレスを示す。2行目のコマンド「DECM (HL)」によって、HLレジスタで示されるアドレスに格納された値が1以上であれば1だけデクリメントし、0であれば0を維持する。
ここで、コマンド「DECM (HL)」は、HLレジスタで示されるアドレスに格納された1バイト値をデクリメントし、キャリーフラグが立っていれば(-1となれば)、HLレジスタで示されるアドレスに格納された1バイト値に強制的に0を格納するコマンドである。そうすると、HLレジスタで示されるアドレスに格納された値が1以上であれば1だけデクリメントし、0であれば0を維持することとなる。かかるコマンド「DECM (HL)」を実行することで、デクリメント後の値がゼロであれば(デクリメント前の値が1または0であれば)、ゼロフラグ(第1ゼロフラグおよび第2ゼロフラグ)を立てて1とし、デクリメント前の値がゼロであれば、キャリーフラグを立てて1とする。かかるコマンドのコマンドサイズは「2」であり、実行サイクルは「5」である。
図143(b)の3行目のコマンド「RET NZ」によって、ゼロフラグが1でなければ(デクリメント後の値がゼロでなければ)、1段上のルーチンに戻る。ここでは、コマンド「DECM (HL)」によって既にデクリメントが行われているので、ゼロフラグが1ではないということは、デクリメント前が2以上であることを示す。その場合、ゼロフラグは立たず0となり、キャリーフラグも立たずに0となるので、1段上のルーチンに戻ってもよい。なお、ここでは「NZ」を挙げ、第1ゼロフラグを参照しているが、通常、第1ゼロフラグを変化させた場合には併せて第2ゼロフラグも変化するので、全ての処理において「NZ」の代わりに「NTZ」を用いることもできる。
なお、コマンド「DECM (HL)」では、デクリメント前のHLレジスタで示されるアドレスに格納された値が1であれば、デクリメント後に0となるとともに、ゼロフラグ=1、キャリーフラグ=0となり、0であれば、デクリメントはされず0を維持するとともに、ゼロフラグ=1、キャリーフラグ=1となる。すなわち、キャリーフラグについて、図141に示した仕様と逆になる。そこで、図143(b)の4行目のコマンド「CCF」によって、キャリーフラグを反転(1→0、0→1)させる。なお、コマンド「CCF」によってはゼロフラグは変化しない。こうして、デクリメント前にHLレジスタで示されるアドレスに格納された値が1であれば、ゼロフラグ=0、キャリーフラグ=1とし、0であれば、ゼロフラグ=1、キャリーフラグ=0とすることができる。かかる2~4行目のコマンドが図140(b)のステップS3に対応する。そして、5行目のコマンド「RET」によって、1段上のルーチンに戻る。かかる5行目のコマンドが、図140(b)のステップS4に対応する。こうして、HLレジスタで示されるアドレスに格納された値を1だけデクリメントし、かつ、ゼロフラグおよびキャリーフラグを設定することが可能となる。
続いて、図143(a)の3行目のコマンド「JR NC,TZ_STP_10」によって、キャリーフラグが0(NC)であれば、TZ_STP_10に移動する。かかる3行目のコマンドが、図140(a)のステップS5、6に対応する。こうして、BYTEDECモジュールの結果に基づいた処理が可能となる。
図143(b)のBYTEDECモジュールのコマンドの総コマンドサイズは、2行目のコマンド「DECM (HL)」2バイト+3行目のコマンド「RET NZ」1バイト+4行目のコマンド「CCF」2バイト+5行目のコマンド「RET」1バイト=6バイトとなり、総実行サイクルは、2行目5サイクル+3行目3サイクル(1サイクル)+4行目2サイクル+6行目3サイクル=13サイクル(11サイクル)となる。なお、括弧内のサイクル数は、コマンド「RET NZ」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。したがって、図142(b)の場合と比べ、総実行サイクルが少なくとも2サイクル削減される。かかるBYTEDECモジュールによって、処理負荷の軽減を図りつつ、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、ここでは、図142の例と比較して、Aレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図142の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
また、図142(b)と図143(b)とを比較して理解できるように、図142(b)において4行(2行目~5行目)を占有していたコマンド群を、図143(b)においては3行(2行目~4行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
なお、かかるBYTEDECモジュールは、パチンコ機のみならず、スロットマシンにおいても、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、REG中処理(AT状態=「6」)を実行するREG_LOTモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、BIG中処理(AT状態=「7」)を実行するBIG_LOTモジュール、図96のステップS2900-3で示した役物作動図柄表示処理を実行するJCGMSETモジュール、図98のステップS3100で示したタイマ割込み処理を実行するTMR_IPTモジュール、図98のステップS3100-21で示した状態別モジュール実行処理を実行するためのCAL_MODモジュールにおいて、タイマ割込み処理用フェーズ(0~3)に応じて4回に1回(5.96msec毎に)選択的に移行し、端子板出力制御処理を実行するIPT_PAモジュール、図98のステップS3100-21で示した状態別モジュール実行処理を実行するためのCAL_MODモジュールにおいて、タイマ割込み処理用フェーズ(0~3)に応じて4回に1回(5.96msec毎に)選択的に移行し、時間監視処理を実行するIPT_PCモジュール、および、図98のステップS3100-21で示した状態別モジュール実行処理を実行するためのCAL_MODモジュールにおいて、タイマ割込み処理用フェーズ(0~3)に応じて4回に1回(5.96msec毎に)選択的に移行し、外部信号出力制御処理を実行するIPT_PDモジュール等からコマンド「RST」によって呼び出される、カウンタ減算処理を実行するRAM_DECモジュール(汎用モジュール)として利用されている。
図144は、RAM_DECモジュールを説明するための説明図である。図144に示したRAM_DECモジュールは、上述したBYTEDECモジュール同様、カウンタ減算処理、すなわち、メインRAM500cの1バイト変数を1だけデクリメントするための汎用モジュールである。なお、RAM_DECモジュールでは、BYTEDECモジュール同様、デクリメントのみならず、デクリメントした結果、図141に示したゼロフラグおよびキャリーフラグが設定される。
図144(a)の1行目の指標「RAM_DEC:」は、当該RAM_DECモジュールの先頭アドレスを示す。2行目のコマンド「LD A,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト値がAレジスタに読み出される。かかるコマンド「LD A,(HL)」では、その実行により第2ゼロフラグが変化する。そして、3行目のコマンド「RT Z,A」によって、Aレジスタの値が0であれば(第2ゼロフラグが1であれば)、1段上のルーチンに戻る。このとき、Aレジスタの値が0であれば、コマンド「RT Z,A」によってゼロフラグ(第1ゼロフラグ)が1となり、キャリーフラグは0となる。こうして、HLレジスタで示されるアドレスに格納された値が0であれば、デクリメントを行うことなく、ゼロフラグ=1、キャリーフラグ=0とすることができる。
図144(a)の4行目のコマンド「CP A,2」によって、Aレジスタの値と2が比較され、Aレジスタが2以上であれば、キャリーフラグは立たず0となり、1であれば、キャリーフラグが立って1となる。なお、コマンド「CP A,2」は、Aレジスタが2未満の場合にキャリーフラグが立つコマンドであるが、かかるコマンド「CP A,2」の実行段階では、Aレジスタの値は1か2以上のいずれかとなっているので(0ではないので)、2未満でキャリーフラグを立たせることで、結果的に1の場合にキャリーフラグが立つこととなる。こうして、Aレジスタの値が1であれば、キャリーフラグ=1とすることができる。5行目のコマンド「DEC A」によって、Aレジスタで示されるアドレスに格納された1バイト値が1だけデクリメントされる。6行目のコマンド「LD (HL),A」によって、Aレジスタの値がHLレジスタで示されるアドレスに格納される。ここで、HLレジスタで示されるアドレスに格納された値が2以上であれば、デクリメントした値は1以上なので、ゼロフラグは立たず0となり、1であれば、デクリメントした値が0となるので、ゼロフラグが立って1となる。なお、コマンド「DEC A」によってはキャリーフラグは変化しない。こうして、HLレジスタで示されるアドレスに格納された値が2以上であれば、ゼロフラグ=0、キャリーフラグ=0とし、1であれば、ゼロフラグ=1、キャリーフラグ=1とすることができる。そして、7行目のコマンド「RET」によって、1段上のルーチンに戻る。こうして、HLレジスタで示されるアドレスに格納された値を1だけデクリメントし、かつ、ゼロフラグおよびキャリーフラグを設定することが可能となる。
ここで、コマンド「DECM」への置き換えを行うと、図144(a)のコマンド群を図144(b)のように変更することができる。図144(b)の1行目の指標「RAM_DEC:」は、当該RAM_DECモジュールの先頭アドレスを示す。2行目のコマンド「DECM (HL)」によって、HLレジスタで示されるアドレスに格納された値が1以上であれば1だけデクリメントし、0であれば0を維持する。
図144(b)の3行目のコマンド「RET NZ」によって、ゼロフラグが1でなければ(デクリメント後の値がゼロでなければ)、1段上のルーチンに戻る。ここでは、コマンド「DECM (HL)」によって既にデクリメントが行われているので、ゼロフラグが1ではないということは、デクリメント前が2以上であることを示す。その場合、ゼロフラグは立たず0となり、キャリーフラグも立たずに0となるので、1段上のルーチンに戻ってもよい。続いて、4行目のコマンド「CCF」によって、キャリーフラグを反転(1→0、0→1)させる。なお、コマンド「CCF」によってはゼロフラグは変化しない。こうして、デクリメント前にHLレジスタで示されるアドレスに格納された値が1であれば、ゼロフラグ=0、キャリーフラグ=1とし、0であれば、ゼロフラグ=1、キャリーフラグ=0とすることができる。そして、5行目のコマンド「RET」によって、1段上のルーチンに戻る。こうして、HLレジスタで示されるアドレスに格納された値を1だけデクリメントし、かつ、ゼロフラグおよびキャリーフラグを設定することが可能となる。
ここで、図144(a)に示したRAM_DECモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LD A,(HL)」1バイト+3行目のコマンド「RT Z,A」1バイト+4行目のコマンド「CP A,2」2バイト+5行目のコマンド「DEC A」1バイト+6行目のコマンド「LD (HL),A」1バイト+7行目のコマンド「RET」1バイト=7バイトとなり、総実行サイクルは、2行目2サイクル+3行目4サイクル(または2サイクル)+4行目2サイクル+5行目1サイクル+6行目2サイクル+7行目3サイクル=14サイクル(または12サイクル)となる。なお、括弧内のサイクル数は、コマンド「RT Z,A」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。一方、図144(b)に示したRAM_DECモジュールのコマンドの総コマンドサイズは、2行目のコマンド「DECM (HL)」2バイト+3行目のコマンド「RET NZ」1バイト+4行目のコマンド「CCF」2バイト+5行目のコマンド「RET」1バイト=6バイトとなり、総実行サイクルは、2行目5サイクル+3行目3サイクル(1サイクル)+4行目2サイクル+6行目3サイクル=13サイクル(11サイクル)となる。なお、括弧内のサイクル数は、コマンド「RET NZ」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。したがって、図144(a)のコマンド群を図144(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減され、総実行サイクルが少なくとも1サイクル削減される。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、WORDDECモジュールは、ワードカウンタ減算処理、すなわち、メインRAM300cの2バイト変数を1だけデクリメントするための汎用モジュールである。なお、WORDDECモジュールでは、デクリメントのみならず、デクリメントした結果、ゼロフラグおよびキャリーフラグを設定している。
メインCPU300aは、メインROM300bからプログラムを読み出し、読み出したプログラムを遂行し、任意の処理において、サブルーチンとしてWORDDECモジュールを呼び出し、WORDDECモジュールを遂行する。WORDDECモジュールでは、メインRAM300cに保持された2バイトデータをデクリメントする。
図145は、WORDDECモジュールの具体的な処理を示したフローチャートである。ここでは、任意の処理として、図26のステップS400-21で示した状態管理処理(エラー管理処理)のサブルーチンである入賞頻度異常エラー判定処理を実行するNHI_CHKモジュールの一部を挙げて説明する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。また、当該WORDDECモジュールの説明中、所定のレジスタはHLレジスタである。
メインCPU300aは、図145(a)のように、任意の処理を実行する。メインCPU300aは、まず、HLレジスタに、デクリメントの対象となる変数のアドレスを設定する(S1)。そして、サブルーチンとしてWORDDECモジュールを呼び出す(S2)。
メインCPU300aは、図145(b)のように、WORDDECモジュールにおいて、HLレジスタで示されるアドレスに格納された2バイト値を1だけデクリメントし、かつ、ゼロフラグおよびキャリーフラグを設定する(S3)。そして、当該WORDDECモジュールを終了して1段上のサブルーチンに戻る(S4)。なお、デクリメント態様とフラグの設定については、BYTEDECモジュール同様、図141で説明されている。
WORDDECモジュールによって、ゼロフラグおよびキャリーフラグが設定されると、メインCPU300aは、そのHLレジスタの値を用いて様々な処理を遂行する。例えば、ここでは、デクリメント結果が0ではないことを判定し(S5)、その結果、0でなければ(S5におけるYES)、当該サブルーチンから戻り(S6)、0であれば(S5におけるNO)、移動することなく次の処理を遂行する。
図146は、WORDDECモジュールを実現するためのコマンドの一例を説明するための説明図である。このうち、図146(a)は、任意の処理のコマンド群を示し、図146(b)は、WORDDECモジュールのコマンド群を示す。図145で示したフローチャートは、例えば、図146に示したプログラムによって実現される。
図146(a)の1行目のコマンド「POP HL」によって、スタック領域に退避されていた入賞頻度異常エラー監視タイマのアドレス値をHLレジスタに復帰させる。かかる1行目のコマンドが、図145(a)のステップS1に対応する。そして、2行目のコマンド「CALLF WORDDEC」によって、サブルーチンとしてWORDDECモジュールが呼び出される。かかる2行目のコマンドが、図145(a)のステップS2に対応する。
図146(b)の1行目の指標「WORDDEC:」は、当該WORDDECモジュールの先頭アドレスを示す。2行目のコマンド「JTW Z,(HL),WORDDEC_99」によって、HLレジスタで示されるアドレスに格納された2バイト値が0かどうか判断され、0であれば、指標「WORDDEC_99:」に移動する。かかるコマンド「JTW Z,(HL),WORDDEC_99」では、その実行によりゼロフラグが変化する。例えば、HLレジスタで示されるアドレスに格納された値が0であれば、ゼロフラグが1となり、キャリーフラグは0となる。また、HLレジスタで示されるアドレスに格納された値が0であれば、指標「WORDDEC_99:」に移動し、7行目のコマンド「RET」によって、1段上のサブルーチンに戻る。こうして、HLレジスタで示されるアドレスに格納された値が0であれば、デクリメントを行うことなく、ゼロフラグ=1、キャリーフラグ=0とすることができる。
図146(b)の3行目のコマンド「DECW (HL)」によって、HLレジスタで示されるアドレスに格納された2バイト値を1だけデクリメントして、HLレジスタで示されるアドレスに格納された値を更新する。ここで、HLレジスタで示されるアドレスに格納された値が2以上であれば、デクリメントした値は1以上なので、ゼロフラグは立たず0となり、1であれば、デクリメントした値が0となるので、ゼロフラグ(第2ゼロフラグ)が立って1となる。そして、4行目のコマンド「RET NTZ」によって、ゼロフラグが1でなければ、1段上のサブルーチンに戻る。ここで「NTZ」としているのは、コマンド「DECW (HL)」によって第2ゼロフラグは変化するが第1ゼロフラグは変化しないからである。なお、コマンド「RET NTZ」によっては、ゼロフラグもキャリーフラグも変化しない。このとき、ゼロフラグが1とならない(1段上のサブルーチンに戻る)のは、デクリメント前のHLレジスタで示されるアドレスに格納された値が2以上の場合である。したがって、デクリメント前が2以上であれば、ゼロフラグ=0、キャリーフラグ=0となっているので、1段上のサブルーチンに戻っても問題ない。
また、ゼロフラグが1であれば、デクリメント前のHLレジスタで示されるアドレスに格納された値が1であり、ゼロフラグ=1、キャリーフラグ=0となっている。すなわち、キャリーフラグについて、図141に示した仕様と逆になる。そこで、5行目のコマンド「SCF」によって、キャリーフラグを強制的に立てて1とする。こうして、デクリメント前にHLレジスタで示されるアドレスに格納された値が1であれば、ゼロフラグ=1、キャリーフラグ=1となる。なお、コマンド「SCF」によってはゼロフラグは変化しない。かかる2~6行目のコマンドが図145(b)のステップS3に対応する。そして、7行目のコマンド「RET」によって、1段上のサブルーチンに戻る。かかる7行目のコマンドが、図145(b)のステップS4に対応する。こうして、HLレジスタで示されるアドレスに格納された値を1だけデクリメントし、かつ、ゼロフラグおよびキャリーフラグを設定することが可能となる。
続いて、図146(a)の3行目のコマンド「RET NTZ」によって、ゼロフラグ(第2ゼロフラグ)が1でなければ(0であれば)、さらに1段上のサブルーチンに戻る。かかる3行目のコマンドが、図145(a)のステップS5、6に対応する。こうして、WORDDECモジュールの結果に基づいた処理が可能となる。
WORDDECモジュールは、複数のモジュールからサブルーチンとして呼び出される。例えば、図26のステップS400-15で示したタイマ更新処理を実行するTMR_NEWモジュール、図41のステップS620で示した特別図柄変動中処理を実行するTZ_SPNモジュール、図26のステップS400-21で示した状態管理処理(エラー管理処理)のサブルーチンである入賞頻度異常エラー判定処理を実行するNHI_CHKモジュール等から呼び出される。
このように、図146(b)に示したWORDDECモジュールのコマンドの総コマンドサイズは、2行目のコマンド「JTW Z,(HL),WORDDEC_99」3バイト+3行目のコマンド「DECW (HL)」2バイト+4行目のコマンド「RET NTZ」1バイト+5行目のコマンド「SCF」2バイト+7行目のコマンド「RET」1バイト=9バイトとなり、総実行サイクルは、2行目6サイクル(または5サイクル)+3行目7サイクル+4行目3サイクル(または1サイクル)+5行目2サイクル+7行目3サイクル=21サイクル(または18サイクル)となる。なお、括弧内のサイクル数は、コマンド「JTW Z,(HL),WORDDEC_99」やコマンド「RET NTZ」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。かかるWORDDECモジュールを設けることによって、上述した各モジュール内でワードカウンタ減算処理を行うことなく、コマンドサイズ2バイトのコマンド「CALLF WORDDEC」で賄うことができるので、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図147は、WORDDECモジュールを実現するためのコマンドの他の例を説明するための説明図である。ここでは、図146(b)のWORDDECモジュールのコマンド群を図147(b)のWORDDECモジュールのコマンド群に置き換えており、他の、図146(a)のWORDDECモジュールを呼び出す任意の処理のコマンド群は、図147(a)として、そのまま用いている。ここでは、図147(a)のように、図146(a)と実質的に等しい処理についてはその説明を省略し、図147(b)の異なる処理のみを説明する。
図147(b)の1行目の指標「WORDDEC:」は、当該WORDDECモジュールの先頭アドレスを示す。2行目のコマンド「DECWM (HL)」によって、HLレジスタで示されるアドレスに格納された値が1以上であれば1だけデクリメントし、0であれば0を維持する。
ここで、コマンド「DECWM (HL)」は、HLレジスタで示されるアドレスに格納された2バイト値をデクリメントし、キャリーフラグが立っていれば(-1となれば)、HLレジスタで示されるアドレスに格納された2バイト値に強制的に0を格納するコマンドである。そうすると、HLレジスタで示されるアドレスに格納された値が1以上であれば1だけデクリメントし、0であれば0を維持することとなる。かかるコマンド「DECWM (HL)」を実行することで、デクリメント後の値がゼロであれば(デクリメント前の値が1または0であれば)、ゼロフラグ(第1ゼロフラグおよび第2ゼロフラグ)を立てて1とし、デクリメント前の値がゼロであれば、キャリーフラグを立てて1とする。かかるコマンドのコマンドサイズは「2」であり、実行サイクルは「7」である。
図147(b)の3行目のコマンド「RET NZ」によって、ゼロフラグが1でなければ(デクリメント後の値がゼロでなければ)、1段上のサブルーチンに戻る。ここでは、コマンド「DECWM (HL)」によって既にデクリメントが行われているので、ゼロフラグが1ではないということは、デクリメント前が2以上であることを示す。その場合、ゼロフラグは立たず0となり、キャリーフラグも立たずに0となるので、1段上のサブルーチンに戻ってもよい。
なお、コマンド「DECWM (HL)」では、デクリメント前のHLレジスタで示されるアドレスに格納された値が1であれば、デクリメント後に0となるとともに、ゼロフラグ=1、キャリーフラグ=0となり、0であれば、デクリメントはされず0を維持するとともに、ゼロフラグ=1、キャリーフラグ=1となる。すなわち、キャリーフラグについて、図141に示した仕様と逆になる。そこで、図147(b)の4行目のコマンド「CCF」によって、キャリーフラグを反転(1→0、0→1)させる。なお、コマンド「CCF」によってはゼロフラグは変化しない。こうして、デクリメント前にHLレジスタで示されるアドレスに格納された値が1であれば、ゼロフラグ=1、キャリーフラグ=1とし、0であれば、ゼロフラグ=1、キャリーフラグ=0とすることができる。かかる2~4行目のコマンドが図145(b)のステップS3に対応する。そして、5行目のコマンド「RET」によって、1段上のサブルーチンに戻る。かかる5行目のコマンドが、図145(b)のステップS4に対応する。こうして、HLレジスタで示されるアドレスに格納された値を1だけデクリメントし、かつ、ゼロフラグおよびキャリーフラグを設定することが可能となる。
続いて、図147(a)の3行目のコマンド「RET NTZ」によって、ゼロフラグ(第2ゼロフラグ)が1でなければ(0であれば)、さらに1段上のサブルーチンに戻る。かかる3行目のコマンドが、図145(a)のステップS5、6に対応する。こうして、WORDDECモジュールの結果に基づいた処理が可能となる。
図147(b)のWORDDECモジュールのコマンドの総コマンドサイズは、2行目2バイト+3行目1バイト+4行目2バイト+5行目1バイト=6バイトとなり、総実行サイクルは、2行目7サイクル+3行目3サイクル(1サイクル)+4行目2サイクル+6行目3サイクル=15サイクル(13サイクル)となる。なお、括弧内のサイクル数は、コマンド「RET NZ」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。したがって、図146(b)の場合と比べ、総コマンドサイズが3バイト削減され、総実行サイクルが少なくとも6サイクル削減される。かかるWORDDECモジュールによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図146(b)と図147(b)とを比較して理解できるように、図146(b)において5行(2行目~6行目)を占有していたコマンド群を、図147(b)においては3行(2行目~4行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
<コマンド「RCP」>
図148は、サブルーチンから戻る処理の一例を説明するための説明図である。図148(a)におけるコマンド「CP A,n」は、Aレジスタの値と、所定の値nとを比較するコマンドであり、A=nの場合、ゼロフラグが立って1となり、A<nの場合、キャリーフラグが立って1となる。かかるコマンド「CP A,n」のコマンドサイズは「2」であり、実行サイクルは「2」である。
図148(a)におけるコマンド「RET cc」は、ゼロフラグまたはキャリーフラグを参照し、対象となるフラグが1となっていれば、サブルーチンから1段上のルーチンに戻るコマンドである。かかるコマンド「RET cc」のコマンドサイズは「1」であり、実行サイクルは「3」(または「1」)である。なお、括弧内のサイクル数は、コマンド「RET cc」によって1つ上のルーチンに移動しなかった(サブルーチンから戻らなかった)場合の実行サイクルを示している。
ここでは、図148(a)のように、1行目のコマンド「CP A,n」によって、Aレジスタの値と、所定の値nとを比較し、2行目のコマンド「RET cc」によって、その比較結果に応じてサブルーチンから戻るか否かが決定する。ここで、かかる2つのコマンドを、図148(b)のように、1つのコマンド「RCP cc,A,n」に纏める(置き換える)ことができる。
図148(b)におけるコマンド「RCP cc,A,n」は、Aレジスタの値と、所定の値nとを比較し、その比較結果に応じてサブルーチンから1段上のルーチンに戻るコマンドである。かかるコマンド「RCP cc,A,n」のコマンドサイズは「2」であり、実行サイクルは「5」(または「3」)である。なお、括弧内のサイクル数は、コマンド「RCP cc,A,n」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。
ここで、図148(a)に示したコマンド群の総コマンドサイズは、1行目のコマンド「CP A,n」2バイト+2行目の「RET cc」1バイト=3バイトとなり、総実行サイクルは、1行目2サイクル+2行目3サイクル(1サイクル)=5サイクル(3サイクル)となる。一方、図148(b)に示したコマンド「RCP cc,A,n」のコマンドサイズは、2バイトとなり、実行サイクルは、5サイクル(3サイクル)となる。したがって、図148(a)のコマンド群を図148(b)のコマンドに置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。以下、このような置き換えが可能な複数のモジュールをそれぞれ説明する。
図149は、PY_CMDAモジュールを説明するための説明図である。図149に示したPY_CMDAモジュールは、図23におけるステップS100-63に示した主コマンド解析処理、すなわち、主コマンドを解析し、主コマンドの異常を検出する処理を実行する。
図149(a)の1行目の指標「PY_CMDA:」は、当該PY_CMDAモジュールの先頭アドレスを示す。2行目のコマンド「LDQ A,(LOW R_BCR_BUF)」によって、Qレジスタの値をアドレスの上位1バイトとし、主コマンドのバッファ値を格納するアドレス「R_BCR_BUF」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(主コマンド)をAレジスタに読み出す。
そして、バッファをクリアし、払出起動指定コマンド確認処理を実行すると、受信データ確認処理として、図149(a)の3行目のコマンド「SUB A,@BCR_PAY_CLR」によって、Aレジスタの値から「@BCR_PAY_CLR」で示される固定値、ここでは、20Hを減算する。そして、4行目のコマンド「CP A,00CH」によって、減算されたAレジスタの値と0CHとを比較する。ここでは、主コマンドが20H~2BHの範囲に含まれることを確認している。すなわち、Aレジスタの値が20H未満であれば、コマンド「SUB A,@BCR_PAY_CLR」によってAレジスタの値は負の値になり、1バイト値としてみると0CHより大きくなる。したがって、減算されたAレジスタの値が0CH未満であれば、コマンド「CP A,00CH」によってキャリーフラグが立って1となる。そして、5行目の「RET NC」によって、キャリーフラグが1でなければ、1段上のルーチンに戻る。なお、キャリーフラグが1であれば(20H~2BHの範囲に含まれれば)、払出エラー指定コマンドセット処理および払出電波エラーフラグ設定処理を実行して、1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図149(a)のコマンド群を図149(b)のように変更することができる。図149(b)の1行目の指標「PY_CMDA:」は、当該PY_CMDAモジュールの先頭アドレスを示す。1行目のコマンド「LDQ A,(LOW R_BCR_BUF)」によって、Qレジスタの値をアドレスの上位1バイトとし、主コマンドのバッファ値を格納するアドレス「R_BCR_BUF」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(主コマンド)をAレジスタに読み出す。
そして、バッファをクリアし、払出起動指定コマンドに対する所定の処理を実行すると、図149(b)の3行目のコマンド「SUB A,@BCR_PAY_CLR」によって、Aレジスタの値から「@BCR_PAY_CLR」で示される固定値、ここでは、20Hを減算する。4行目のコマンド「RCP NC,A,00CH」によって、減算されたAレジスタの値と0CHとを比較し、キャリーフラグが1でなければ、1段上のルーチンに戻る。ここでは、主コマンドが20H~2BHの範囲に含まれることを確認し、その範囲に入っていなければ、それ以降の処理を行わず1段上のルーチンに戻っている。なお、キャリーフラグが1であれば、払出エラー指定コマンドセット処理および払出電波エラーフラグ設定処理を実行して、1段上のルーチンに戻る。
ここで、図149(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_BCR_BUF)」2バイト+3行目のコマンド「SUB A,@BCR_PAY_CLR」2バイト+4行目のコマンド「CP A,00CH」2バイト+5行目の「RET NC」1バイト=7バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+4行目2サイクル+5行目3サイクル(1サイクル)=10サイクル(8サイクル)となる。一方、図149(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_BCR_BUF)」2バイト+3行目のコマンド「SUB A,@BCR_PAY_CLR」2バイト+4行目のコマンド「RCP NC,A,00CH」2バイト=6バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+4行目5サイクル(3サイクル)=10サイクル(8サイクル)となる。したがって、図149(a)のコマンド群を図149(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図150は、GAT_PASモジュールを説明するための説明図である。図150に示したGAT_PASモジュールは、図29のステップS510で示したゲートスイッチ通過処理(ゲート通過処理)、すなわち、ゲート検出スイッチ124sでの入賞球の通過に応じて普通図柄保留球数を加算し、普通図柄に関する処理を実行する。
記憶カウントチェック処理として、図150(a)の1行目の指標「GAT_PAS:」は、当該GAT_PASモジュールの先頭アドレスを示す。2行目のコマンド「LDQ DE,LOW R_FZ_MEM」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FZ_MEM」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された2バイト値(普通図柄保留球数カウンタのアドレス)をDEレジスタに読み出す。3行目のコマンド「LD A、(DE)」によって、DEレジスタで示されるアドレス(すなわちR_FZ_MEM)に格納された値(普通図柄保留球数カウンタのカウンタ値)をAレジスタに読み出す。
そして、図150(a)の4行目のコマンド「CP A,@FZ_MEM_MAX」によって、Aレジスタの値と固定値「@FZ_MEM_MAX」、ここでは、「4」とを比較する。すなわち、Aレジスタの値が4未満であれば、キャリーフラグが立って1となる。そして、5行目の「RET NC」によって、キャリーフラグが1でなければ、1段上のルーチンに戻る。すなわち、普通図柄保留球数カウンタのカウンタ値が4以上であれば、それ以上、普通図柄保留球数カウンタを計数することはないので、当該GAT_PASモジュールを終了する。なお、キャリーフラグが1であれば、乱数値取得処理、記憶数加算処理、当たり決定乱数取得処理、転送先アドレス算定処理、および、記憶エリア格納処理を実行して、1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図150(a)のコマンド群を図150(b)のように変更することができる。図150(b)の1行目の指標「GAT_PAS:」は、当該GAT_PASモジュールの先頭アドレスを示す。1行目のコマンド「LDQ DE,LOW R_FZ_MEM」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FZ_MEM」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された2バイト値(普通図柄保留球数カウンタのアドレス)をDEレジスタに読み出す。3行目のコマンド「LD A、(DE)」によって、DEレジスタで示されるアドレス(すなわちR_FZ_MEM)に格納された値(普通図柄保留球数カウンタのカウンタ値)をAレジスタに読み出す。
そして、図150(b)の4行目のコマンド「RCP NC,A,@FZ_MEM_MAX」によって、Aレジスタの値と@FZ_MEM_MAXとを比較し、Aレジスタの値が@FZ_MEM_MAX以上であれば、1段上のルーチンに戻る。すなわち、普通図柄保留球数カウンタのカウンタ値が4以上であれば、それ以上、普通図柄保留球数カウンタを計数することはないので、当該GAT_PASモジュールを終了する。なお、キャリーフラグが1であれば、記憶数加算処理、当たり決定乱数取得処理、転送先アドレス算定処理、および、記憶エリア格納処理を実行して、1段上のルーチンに戻る。
ここで、図150(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ DE,LOW R_FZ_MEM」2バイト+3行目のコマンド「LD A、(DE)」1バイト+4行目のコマンド「CP A,@FZ_MEM_MAX」2バイト+5行目の「RET NC」1バイト=6バイトとなり、総実行サイクルは、2行目2サイクル+3行目2サイクル+4行目2サイクル+5行目3サイクル(1サイクル)=9サイクル(7サイクル)となる。一方、図150(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ DE,LOW R_FZ_MEM」2バイト+3行目のコマンド「LD A、(DE)」1バイト+4行目のコマンド「RCP NC,A,@FZ_MEM_MAX」2バイト=5バイトとなり、総実行サイクルは、2行目2サイクル+3行目2サイクル+4行目5サイクル(3サイクル)=9サイクル(7サイクル)となる。したがって、図150(a)のコマンド群を図150(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図151は、TDN_PASモジュールを説明するための説明図である。図151に示したTDN_PASモジュールは、図34のステップS540で示したカウントスイッチ通過処理(大入賞口通過処理)、すなわち、カウントスイッチ判定値に基づいて大入賞口の入賞を管理する処理を実行する。
図151(a)の1行目の指標「TDN_PAS:」は、当該TDN_PASモジュールの先頭アドレスを示す。そして、カウントスイッチ判定値確認処理、特別電動役物連続作動回数判定処理、大入賞口入賞指定コマンドセット処理、大入賞口過剰入賞監視処理を実行すると、特別電動役物作動チェック処理として、2行目のコマンド「LDQ A,(LOW R_TDN_PHS)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_TDN_PHS」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(特別電動役物遊技管理フェーズ)をAレジスタに読み出す。
図151(a)の3行目のコマンド「JCP Z,A,@TD_OPN_BHT,TDN_PAS_10」によって、Aレジスタの値と固定値「@TD_OPN_BHT」、ここでは、2と比較し、その結果が等しければ、アドレス「TDN_PAS_10」に移動する。こうして、Aレジスタの値が大当たり大入賞口開放制御状態指定値(特別電動役物遊技管理フェーズが02H)であれば、以降の処理を省略して6行目の指標「TDN_PAS_10:」に移動することができる。4行目のコマンド「CP A,@TD_OPN_SHT」によって、Aレジスタの値と、小当たり大入賞口開放制御状態指定値を示す固定値「@TD_OPN_SHT」、ここでは、6とを比較し、等しければ(特別電動役物遊技管理フェーズが06H)、ゼロフラグが立って1となる。そして、5行目の「RET NZ」によって、ゼロフラグが1でなければ、1段上のルーチンに戻る。すなわち、Aレジスタの値が大当たり大入賞口開放制御状態指定値および小当たり大入賞口開放制御状態指定値でなければ、当該TDN_PASモジュールを終了する。なお、ゼロフラグが1であれば、特別電動役物入賞球数カウント処理、特電不正入賞検出条件確認処理、および、特電不正入賞エラー時処理を実行して、1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図151(a)のコマンド群を図151(b)のように変更することができる。図151(b)の1行目の指標「TDN_PAS:」は、当該TDN_PASモジュールの先頭アドレスを示す。そして、カウントスイッチ判定値確認処理、特別電動役物連続作動回数判定処理、大入賞口入賞指定コマンドセット処理、大入賞口過剰入賞監視処理を実行すると、2行目のコマンド「LDQ A,(LOW R_TDN_PHS)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_TDN_PHS」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(特別電動役物遊技管理フェーズ)をAレジスタに読み出す。
図151(b)の3行目のコマンド「JCP Z,A,@TD_OPN_BHT,TDN_PAS_10」によって、Aレジスタの値と固定値「@TD_OPN_BHT」、ここでは、2と比較し、その結果が等しければ、アドレス「TDN_PAS_10」に移動する。こうして、Aレジスタの値が大当たり大入賞口開放制御状態指定値であれば、以降の処理を省略して5行目の指標「TDN_PAS_10:」に移動することができる。4行目のコマンド「RCP NZ,A,@TD_OPN_SHT」によって、Aレジスタの値と、小当たり大入賞口開放制御状態指定値を示す固定値「@TD_OPN_SHT」、ここでは、6とを比較し、等しければ、1段上のルーチンに戻る。すなわち、Aレジスタの値が大当たり大入賞口開放制御状態指定値および小当たり大入賞口開放制御状態指定値でなければ、当該TDN_PASモジュールを終了する。なお、ゼロフラグが0であれば、特別電動役物入賞球数カウント処理、特電不正入賞検出条件確認処理、および、特電不正入賞エラー時処理を実行して、1段上のルーチンに戻る。
ここで、図151(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_TDN_PHS)」2バイト+3行目のコマンド「JCP Z,A,@TD_OPN_BHT,TDN_PAS_10」3バイト+4行目のコマンド「CP A,@TD_OPN_SHT」2バイト+5行目の「RET NZ」1バイト=8バイトとなり、総実行サイクルは、2行目3サイクル+3行目4サイクル(または3サイクル)+4行目2サイクル+5行目3サイクル(1サイクル)=12サイクル(9サイクル)となる。一方、図151(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_TDN_PHS)」2バイト+3行目のコマンド「JCP Z,A,@TD_OPN_BHT,TDN_PAS_10」3バイト+4行目のコマンド「RCP NZ,A,@TD_OPN_SHT」2バイト=7バイトとなり、総実行サイクルは、2行目3サイクル+3行目4サイクル(または3サイクル)+4行目5サイクル(3サイクル)=12サイクル(9サイクル)となる。したがって、図151(a)のコマンド群を図151(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図152は、FD_OPNモジュールを説明するための説明図である。図152に示したFD_OPNモジュールは、図57のステップ850で示した普通電動役物入賞口開放制御処理、すなわち、普通電動役物に関する入賞数および作動時間に対する第1可変始動口120Bの開閉御処理を実行する。
図152(a)の1行目の指標「FD_OPN:」は、当該FD_OPNモジュールの先頭アドレスを示す。そして、普通電動役物入賞口開閉動作切替処理を実行すると、規定入賞数確認処理として、2行目のコマンド「LDQ A,(LOW R_FDN_CNT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FDN_CNT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(普通電動役物入賞球数カウンタのカウンタ値)をAレジスタに読み出す。
図152(a)の3行目のコマンド「CP A,@FDN_CNT」によって、Aレジスタの値と、普通電動役物に係る入賞口入賞球数の最大値を示す固定値「@FDN_CNT」、ここでは、8とを比較し、8未満であれば、キャリーフラグが立って1となる。そして、4行目の「RET C」によって、キャリーフラグが1であれば、1段上のルーチンに戻る。すなわち、Aレジスタの値が普通電動役物に係る入賞口入賞球数未満であれば、当該FD_OPNモジュールを終了する。なお、キャリーフラグが0であれば、普通電動役物作動終了時設定処理を実行して、1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図152(a)のコマンド群を図152(b)のように変更することができる。図152(b)の1行目の指標「FD_OPN:」は、当該FD_OPNモジュールの先頭アドレスを示す。そして、普通電動役物入賞口開閉動作切替処理を実行すると、規定入賞数確認処理として、2行目のコマンド「LDQ A,(LOW R_FDN_CNT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FDN_CNT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(普通電動役物入賞球数カウンタのカウンタ値)をAレジスタに読み出す。
図152(b)の3行目のコマンド「RCP C,A,@FDN_CNT」によって、Aレジスタの値と、普通電動役物に係る入賞口入賞球数の最大値を示す固定値「@FDN_CNT」、ここでは、8とを比較し、8未満であれば、1段上のルーチンに戻る。すなわち、Aレジスタの値が普通電動役物に係る入賞口入賞球数未満であれば、当該FD_OPNモジュールを終了する。なお、キャリーフラグが0であれば、普通電動役物作動終了時設定処理を実行して、1段上のルーチンに戻る。
ここで、図152(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_FDN_CNT)」2バイト+3行目のコマンド「CP A,@FDN_CNT」2バイト+4行目の「RET C」1バイト=5バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+4行目3サイクル(1サイクル)=8サイクル(6サイクル)となる。一方、図152(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_FDN_CNT)」2バイト+3行目のコマンド「RCP C,A,@FDN_CNT」2バイト=4バイトとなり、総実行サイクルは、2行目3サイクル+3行目5サイクル(3サイクル)=8サイクル(6サイクル)となる。したがって、図152(a)のコマンド群を図152(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図153は、TZ_STAモジュールを説明するための説明図である。図153に示したTZ_STAモジュールは、図37のステップS610で示した特別図柄変動待ち処理、すなわち、特別図柄保留球数に基づいて特別図柄変動の準備処理を実行する。
図153(a)の1行目の指標「TZ_STA:」は、当該TZ_STAモジュールの先頭アドレスを示す。そして、特別図柄保留球数確認処理を実行すると、処理非対象特図状態確認処理として、2行目のコマンド「RST DATSEL」によって、汎用モジュールであるDATSELモジュールが呼び出され、制御データの選択結果がAレジスタに格納される。
図153(a)の3行目のコマンド「CP A,@TZ_BHT」によって、Aレジスタの値と、特別図柄大当たり情報を示す固定値「@TZ_BHT」、ここでは、01Hとを比較し、01Hと等しければ、ゼロフラグが立って1となる。そして、4行目の「RET Z」によって、ゼロフラグが1であれば、1段上のルーチンに戻る。すなわち、大当たり確定中であれば、当該TZ_STAモジュールを終了する。5行目のコマンド「CP A,@TZ_SHT」によって、Aレジスタの値と、特別図柄小当たり情報を示す固定値「@TZ_SHT」、ここでは、02Hとを比較し、02Hと等しければ、ゼロフラグが立って1となる。そして、6行目の「RET Z」によって、ゼロフラグが1であれば、1段上のルーチンに戻る。すなわち、小当たり確定中であれば、当該TZ_STAモジュールを終了する。なお、ゼロフラグが1でなければ、特別図柄変動開始時設定処理、回数コマンドセット処理、および、特別図柄変動準備処理を実行して、1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図153(a)のコマンド群を図153(b)のように変更することができる。図153(b)の1行目の指標「TZ_STA:」は、当該TZ_STAモジュールの先頭アドレスを示す。そして、特別図柄保留球数確認処理を実行すると、処理非対象特図状態確認処理として、2行目のコマンド「RST DATSEL」によって、DATSELモジュールが呼び出され、制御データの選択結果がAレジスタに格納される。
図153(b)の3行目のコマンド「RCP Z,A,@TZ_BHT」によって、Aレジスタの値と、特別図柄大当たり情報を示す固定値「@TZ_BHT」、ここでは、01Hとが比較され、01Hと等しければ、1段上のルーチンに戻る。すなわち、大当たり確定中であれば、当該TZ_STAモジュールを終了する。4行目のコマンド「RCP Z,A,@TZ_SHT」によって、Aレジスタの値と、特別図柄小当たり情報を示す固定値「@TZ_SHT」、ここでは、02Hとが比較され、02Hと等しければ、1段上のルーチンに戻る。すなわち、小当たり確定中であれば、当該TZ_STAモジュールを終了する。なお、ゼロフラグが1でなければ、特別図柄変動開始時設定処理、回数コマンドセット処理、および、特別図柄変動準備処理を実行して、1段上のルーチンに戻る。
ここで、図153(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「RST DATSEL」1バイト+3行目のコマンド「CP A,@TZ_BHT」2バイト+4行目の「RET Z」1バイト+5行目のコマンド「CP A,@TZ_SHT」2バイト+6行目の「RET Z」1バイト=7バイトとなり、総実行サイクルは、2行目4サイクル+3行目2サイクル+4行目3サイクル(1サイクル)+5行目2サイクル+6行目3サイクル(1サイクル)=14サイクル(10サイクル)となる。一方、図153(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「RST DATSEL」1バイト+3行目のコマンド「RCP Z,A,@TZ_BHT」2バイト+4行目のコマンド「RCP Z,A,@TZ_SHT」2バイト=5バイトとなり、総実行サイクルは、2行目4サイクル+3行目5サイクル(3サイクル)+4行目5サイクル(3サイクル)=14サイクル(10サイクル)となる。したがって、図153(a)のコマンド群を図153(b)のコマンド群に置き換えることで、総コマンドサイズが2バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図154は、TZ_RGETモジュールを説明するための説明図である。図154に示したTZ_RGETモジュールは、図32のステップS535で示した特別図柄乱数取得処理、すなわち、乱数値をレジスタに入力し、保留球数が上限数ではない場合のみ転送用バッファにレジスタの乱数値を格納する処理を実行する。
図154(a)の1行目の指標「TZ_RGET:」は、当該TZ_RGETモジュールの先頭アドレスを示す。大当たり決定乱数取得処理を実行し、特別図柄保留球数更新処理として、2行目のコマンド「LD A、(DE)」によって、DEレジスタで示されるアドレスに格納された値(対象特別図柄保留球数カウンタのカウンタ値)をAレジスタに読み出す。なお、当該TZ_RGETモジュールが呼び出されるときにDEレジスタには予め対象特別図柄保留球数カウンタのカウンタ値を示すアドレスが格納されているとする。
そして、図154(a)の3行目のコマンド「CP A,@TZ_MEM_MAX」によって、Aレジスタの値と、特別図柄保留球数上限値を示す固定値「@TZ_MEM_MAX」、ここでは、「4」とを比較する。すなわち、Aレジスタの値が4未満であれば、キャリーフラグが立って1となる。そして、4行目の「RET NC」によって、キャリーフラグが1でなければ、1段上のルーチンに戻る。すなわち、対象特別図柄保留球数カウンタのカウンタ値が4以上であれば、それ以上、対象特別図柄保留球数カウンタを計数することはないので、当該TZ_RGETモジュールを終了する。なお、キャリーフラグが1であれば、変動パターン乱数取得処理、リーチグループ決定乱数取得処理、リーチモード決定乱数取得処理、転送先アドレス算定処理、記憶エリア格納処理、取得時演出判定処理、および、特図保留指定コマンドセット処理を実行して、1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図154(a)のコマンド群を図154(b)のように変更することができる。図154(b)の1行目の指標「TZ_RGET:」は、当該TZ_RGETモジュールの先頭アドレスを示す。大当たり決定乱数取得処理を実行し、特別図柄保留球数更新処理として、2行目のコマンド「LD A、(DE)」によって、DEレジスタで示されるアドレス(すなわちR_FZ_MEM)に格納された値(対象特別図柄保留球数カウンタのカウンタ値)をAレジスタに読み出す。
そして、図154(b)の3行目のコマンド「RCP NC,A,@TZ_MEM_MAX」によって、Aレジスタの値と、特別図柄保留球数上限値を示す固定値「@TZ_MEM_MAX」、ここでは、「4」とを比較し、Aレジスタの値が4以上であれば、1段上のルーチンに戻る。すなわち、対象特別図柄保留球数カウンタのカウンタ値が4以上であれば、それ以上、対象特別図柄保留球数カウンタを計数することはないので、当該TZ_RGETモジュールを終了する。なお、Aレジスタの値が4未満であれば、変動パターン乱数取得処理、リーチグループ決定乱数取得処理、リーチモード決定乱数取得処理、転送先アドレス算定処理、記憶エリア格納処理、取得時演出判定処理、および、特図保留指定コマンドセット処理を実行して、1段上のルーチンに戻る。
ここで、図154(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LD A、(DE)」1バイト+3行目のコマンド「CP A,@TZ_MEM_MAX」2バイト+4行目の「RET NC」1バイト=4バイトとなり、総実行サイクルは、2行目2サイクル+3行目2サイクル+4行目3サイクル(1サイクル)=7サイクル(5サイクル)となる。一方、図154(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LD A、(DE)」1バイト+3行目のコマンド「RCP NC,A,@TZ_MEM_MAX」2バイト=3バイトとなり、総実行サイクルは、2行目2サイクル+3行目5サイクル(3サイクル)=7サイクル(5サイクル)となる。したがって、図154(a)のコマンド群を図154(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図155は、TRSVSELモジュールを説明するための説明図である。図155に示したTRSVSELモジュールは、図37のステップS610-17で示される予備領域設定処理、すなわち、特別図柄当たりを確認し、特別図柄確率状態や特別図柄状態の予備設定処理を実行する。
図155(a)の1行目の指標「TRSVSEL:」は、当該TRSVSELモジュールの先頭アドレスを示す。そして、状態オフセットチェックフラグ設定処理を実行すると、特別図柄当たり確認処理として、2行目のコマンド「RST DATSEL」によって、汎用モジュールであるDATSELモジュールが呼び出され、制御データの選択結果がAレジスタに格納される。
図155(a)の3行目のコマンド「CP A,@TZ_BHT」によって、Aレジスタの値と、特別図柄大当たり情報を示す固定値「@TZ_BHT」、ここでは、01Hとを比較し、01Hと等しければ、ゼロフラグが立って1となる。そして、4行目の「RET NZ」によって、ゼロフラグが1でなければ、1段上のルーチンに戻る。すなわち、大当たり確定中でなければ、当該TRSVSELモジュールを終了する。なお、ゼロフラグが1であれば、特別図柄確率状態予備設定処理、および、特別図柄状態予備設定処理を実行して、1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図155(a)のコマンド群を図155(b)のように変更することができる。図155(b)の1行目の指標「TRSVSEL:」は、当該TRSVSELモジュールの先頭アドレスを示す。そして、状態オフセットチェックフラグ設定処理を実行すると、特別図柄当たり確認処理として、2行目のコマンド「RST DATSEL」によって、DATSELモジュールが呼び出され、制御データの選択結果がAレジスタに格納される。
図155(b)の3行目のコマンド「RCP NZ,A,@TZ_BHT」によって、Aレジスタの値と、特別図柄大当たり情報を示す固定値「@TZ_BHT」、ここでは、01Hとを比較し、01Hと等しくなければ、1段上のルーチンに戻る。すなわち、大当たり確定中でなければ、当該TRSVSELモジュールを終了する。なお、01Hと等しければ、特別図柄確率状態予備設定処理、および、特別図柄状態予備設定処理を実行して、1段上のルーチンに戻る。
ここで、図155(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「RST DATSEL」1バイト+3行目のコマンド「CP A,@TZ_BHT」2バイト+4行目の「RET NZ」1バイト=4バイトとなり、総実行サイクルは、2行目4サイクル+3行目2サイクル+4行目3サイクル(1サイクル)=9サイクル(7サイクル)となる。一方、図155(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「RST DATSEL」1バイト+3行目のコマンド「RCP NZ,A,@TZ_BHT」2バイト=3バイトとなり、総実行サイクルは、2行目4サイクル+3行目5サイクル(3サイクル)=9サイクル(7サイクル)となる。したがって、図155(a)のコマンド群を図155(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図156は、TDOVCHKモジュールを説明するための説明図である。図156に示したTDOVCHKモジュールは、図34のステップS540で示したカウントスイッチ通過処理(大入賞口通過処理)において大入賞口入球コマンドをセット(S540-5)した後に実行する大入賞口過剰入賞監視処理、すなわち、大入賞口入賞球数カウンタや大入賞口過剰入賞回数カウンタの更新処理を実行する。
図156(a)の1行目の指標「TDOVCHK:」は、当該TDOVCHKモジュールの先頭アドレスを示す。そして、特別電動役物遊技管理フェーズ確認処理として、2行目のコマンド「LDQ A,(LOW R_TDN_PHS)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_TDN_PHS」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(特別電動役物遊技管理フェーズ)をAレジスタに読み出す。
図156(a)の3行目のコマンド「JCP NC,A,@TD_PRE_SHT,TDOVCHK_10」によって、Aレジスタの値と固定値「@TD_PRE_SHT」、ここでは、05Hと比較し、その結果、05H以上であれば、アドレス「TDOVCHK_10」に移動する。こうして、Aレジスタの値が小当たり大入賞口開放前状態指定値より後の指定値であれば、以降の処理を省略して6行目の指標「TDOVCHK_10」に移動することができる。4行目のコマンド「CP A,@TD_OPN_BHT」によって、Aレジスタの値と、大当たり大入賞口開放制御状態指定値を示す固定値「@TD_OPN_BHT」、ここでは、2とを比較し、等しければ、ゼロフラグが立って1となる。そして、5行目の「RET Z」によって、ゼロフラグが1であれば、1段上のルーチンに戻る。すなわち、Aレジスタの値が大当たり大入賞口開放制御状態指定値であれば、当該TDOVCHKモジュールを終了する。なお、ゼロフラグが1でなければ、大入賞口入賞球数カウンタ更新処理、大入賞口過剰入賞回数カウンタ更新処理、および、大入賞口過剰入賞エラー時処理を実行して、1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図156(a)のコマンド群を図156(b)のように変更することができる。図156(b)の1行目の指標「TDOVCHK:」は、当該TDOVCHKモジュールの先頭アドレスを示す。そして、特別電動役物遊技管理フェーズ確認処理として、2行目のコマンド「LDQ A,(LOW R_TDN_PHS)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_TDN_PHS」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(特別電動役物遊技管理フェーズ)をAレジスタに読み出す。
図156(b)の3行目のコマンド「JCP NC,A,@TD_PRE_SHT,TDOVCHK_10」によって、Aレジスタの値と固定値「@TD_PRE_SHT」、ここでは、05Hと比較し、その結果、05H以上であれば、アドレス「TDOVCHK_10」に移動する。こうして、Aレジスタの値が小当たり大入賞口開放前状態指定値より後の指定値であれば、以降の処理を省略して5行目の指標「TDOVCHK_10」に移動することができる。4行目のコマンド「RCP Z,A,@TD_OPN_BHT」によって、Aレジスタの値と、大当たり大入賞口開放制御状態指定値を示す固定値「@TD_OPN_BHT」、ここでは、2とを比較し、等しければ、1段上のルーチンに戻る。すなわち、Aレジスタの値が大当たり大入賞口開放制御状態指定値であれば、当該TDOVCHKモジュールを終了する。なお、ゼロフラグが1でなければ、大入賞口入賞球数カウンタ更新処理、大入賞口過剰入賞回数カウンタ更新処理、および、大入賞口過剰入賞エラー時処理を実行して、1段上のルーチンに戻る。
ここで、図156(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_TDN_PHS)」2バイト+3行目のコマンド「JCP NC,A,@TD_PRE_SHT,TDOVCHK_10」3バイト+4行目のコマンド「CP A,@TD_OPN_BHT」2バイト+5行目の「RET Z」1バイト=8バイトとなり、総実行サイクルは、2行目3サイクル+3行目4サイクル(または3サイクル)+4行目2サイクル+5行目3サイクル(1サイクル)=12サイクル(9サイクル)となる。一方、図156(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_TDN_PHS)」2バイト+3行目のコマンド「JCP NC,A,@TD_PRE_SHT,TDOVCHK_10」3バイト+4行目のコマンド「RCP Z,A,@TD_OPN_BHT」2バイト=7バイトとなり、総実行サイクルは、2行目3サイクル+3行目4サイクル(または3サイクル)+4行目5サイクル(3サイクル)=12サイクル(9サイクル)となる。したがって、図156(a)のコマンド群を図156(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図157は、BER_CHKモジュールを説明するための説明図である。図157に示したBER_CHKモジュールは、図26のステップS400-21で示した状態管理処理(エラー管理処理)のサブルーチンであるベース異常エラー監視処理、すなわち、ベース異常確認カウンタのカウンタ値を監視する処理を実行する。
アウトスイッチ確認処理として、図157(a)の1行目の指標「BER_CHK:」は、当該BER_CHKモジュールの先頭アドレスを示す。2行目のコマンド「LDQ HL,LOW R_BAS_CNT」によって、Qレジスタの値をHレジスタに読み出し、アドレス「R_BAS_CNT」の下位1バイトの値をLレジスタに読み出す。3行目のコマンド「LD A,(HL)」によって、HLレジスタで示されるアドレス(すなわちR_BAS_CNT)に格納された値(ベース異常確認カウンタのカウンタ値)をAレジスタに読み出す。
そして、図157(a)の4行目のコマンド「CP A,@BAS_CHK_CNT」によって、Aレジスタの値と、ベース異常検出球数を示す固定値「@BAS_CHK_CNT」ここでは、20とを比較する。すなわち、Aレジスタの値が20未満であれば、キャリーフラグが立って1となる。そして、5行目の「RET C」によって、キャリーフラグが1であれば、1段上のルーチンに戻る。すなわち、ベース異常確認カウンタのカウンタ値が20未満であれば、当該BER_CHKモジュールを終了する。なお、キャリーフラグが1でなければ、セキュリティ設定処理を実行して、1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図157(a)のコマンド群を図157(b)のように変更することができる。図157(b)の1行目の指標「BER_CHK:」は、当該BER_CHKモジュールの先頭アドレスを示す。2行目のコマンド「LDQ HL,LOW R_BAS_CNT」によって、Qレジスタの値をHレジスタに読み出し、アドレス「R_BAS_CNT」(ベース異常確認カウンタを格納するアドレス)の下位1バイトの値をLレジスタに読み出す。3行目のコマンド「LD A,(HL)」によって、HLレジスタで示されるアドレス(すなわちR_BAS_CNT)に格納された値(ベース異常確認カウンタのカウンタ値)をAレジスタに読み出す。
そして、図157(b)の4行目のコマンド「RCP C,A,@BAS_CHK_CNT」によって、Aレジスタの値と、ベース異常検出球数を示す固定値「@BAS_CHK_CNT」ここでは、20とを比較し、Aレジスタの値が20未満であれば、1段上のルーチンに戻る。なお、Aレジスタの値が20以上であれば、セキュリティ設定処理を実行して、1段上のルーチンに戻る。
ここで、図157(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ HL,LOW R_BAS_CNT」2バイト+3行目のコマンド「LD A,(HL)」1バイト+4行目のコマンド「CP A,@BAS_CHK_CNT」2バイト+5行目の「RET C」1バイト=6バイトとなり、総実行サイクルは、2行目の2サイクル+3行目2サイクル+4行目2サイクル+5行目3サイクル(1サイクル)=9サイクル(7サイクル)となる。一方、図157(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ HL,LOW R_BAS_CNT」2バイト+3行目のコマンド「LD A,(HL)」1バイト+4行目のコマンド「RCP C,A,@BAS_CHK_CNT」2バイト=5バイトとなり、総実行サイクルは、2行目2サイクル+3行目2サイクル+4行目5サイクル(3サイクル)=9サイクル(7サイクル)となる。したがって、図157(a)のコマンド群を図157(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図158は、TEF_SELモジュールを説明するための説明図である。図158に示したTEF_SELモジュールは、図47のステップS720-9で示した大入賞口閉鎖有効時間設定処理のサブルーチンである大入賞口閉鎖有効時間選択処理、すなわち、大入賞口を閉鎖するまでの有効時間をテーブルから選択する処理を実行する。
図158(a)の1行目の指標「TEF_SEL:」は、当該TEF_SELモジュールの先頭アドレスを示す。そして、大入賞口閉鎖有効時間データ選択処理として、2行目のコマンド「LDQ A,(LOW R_ZUG_CHK_FIX)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_ZUG_CHK_FIX」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(特別図柄判定フラグ)をAレジスタに読み出す。
図158(a)の3行目のコマンド「CP A,@ZUG_SML1」によって、Aレジスタの値と、小当たり図柄1指定データを示す固定値「@ZUG_SML1」、ここでは、07Hとを比較し、07H未満であれば、キャリーフラグが立って1となる。そして、4行目の「RET NC」によって、キャリーフラグが1でなければ、1段上のルーチンに戻る。すなわち、Aレジスタの値が小当たり図柄1指定データ以上であれば、当該TEF_SELモジュールを終了する。なお、キャリーフラグが1であれば、ワードデータ選択処理を実行して、1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図158(a)のコマンド群を図158(b)のように変更することができる。図158(b)の1行目の指標「TEF_SEL:」は、当該TEF_SELモジュールの先頭アドレスを示す。そして、大入賞口閉鎖有効時間データ選択処理として、2行目のコマンド「LDQ A,(LOW R_ZUG_CHK_FIX)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_ZUG_CHK_FIX」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(特別図柄判定フラグ)をAレジスタに読み出す。
図158(b)の3行目のコマンド「RCP NC,A,@ZUG_SML1」によって、Aレジスタの値と、小当たり図柄1指定データを示す固定値「@ZUG_SML1」、ここでは、07Hとを比較し、07H以上であれば、1段上のルーチンに戻る。すなわち、Aレジスタの値が小当たり図柄1指定データ以上であれば、当該TEF_SELモジュールを終了する。なお、Aレジスタの値が小当たり図柄1指定データ未満であれば、ワードデータ選択処理を実行して、1段上のルーチンに戻る。
ここで、図158(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_ZUG_CHK_FIX)」2バイト+3行目のコマンド「CP A,@ZUG_SML1」2バイト+4行目の「RET NC」1バイト=5バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+4行目3サイクル(1サイクル)=8サイクル(6サイクル)となる。一方、図158(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_ZUG_CHK_FIX)」2バイト+3行目のコマンド「RCP NC,A,@ZUG_SML1」2バイト=4バイトとなり、総実行サイクルは、2行目3サイクル+3行目5サイクル(3サイクル)=8サイクル(6サイクル)となる。したがって、図158(a)のコマンド群を図158(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
なお、かかる図148で示した置き換えは、パチンコ機のみならず、スロットマシンにおいても、複数のモジュールからサブルーチンとして呼び出される。例えば、図92のステップS2500-35の滑りコマ数取得処理における逆押しデータ設定処理を実行するSET_RIGモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、準備中処理(AT状態=「5」)を実行するPRE_LOTモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、REG中処理(AT状態=「6」)を実行するREG_LOTモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、BIG中処理(AT状態=「7」)を実行するBIT_LOTモジュールにおけるBIGストック数抽せん処理を実行するBIG_SLTモジュール、図91のステップS2400-11で示した実行フラグ設定処理において指示情報設定処理を実行するNAV_SETモジュール等から呼び出される。
図159は、SET_RIGモジュールを説明するための説明図である。図159に示したSET_RIGモジュールは、逆押しデータ設定処理、すなわち、停止制御に必要なデータを設定する処理を実行する。
図159(a)の1行目の指標「SET_RIG:」は、当該SET_RIGモジュールの先頭アドレスを示す。2行目のコマンド「LDQ A,(LOW _HIT_NUM)」によって、Qレジスタの値をアドレスの上位1バイトとし、停止制御番号を格納するアドレス「_HIT_NUM」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(停止制御番号)をAレジスタに読み出す。
そして、第2停止操作時使用ビットデータ更新処理として、図159(a)の3行目のコマンド「SUB A,10」によって、Aレジスタの値から固定値「10」を減算する。そして、4行目のコマンド「CP A,57-10+1」によって、減算されたAレジスタの値と48(57-10+1)とを比較する。ここでは、停止制御番号が10~57の範囲に含まれることを確認している。すなわち、Aレジスタの値が10未満であれば、コマンド「SUB A,10」によってAレジスタの値は負の値になり、1バイト値としてみると48より大きくなる。したがって、減算されたAレジスタの値が10未満であれば、コマンド「CP A,57-10+1」によってキャリーフラグが立って1となる。そして、5行目の「RET NC」によって、キャリーフラグが1でなければ、1段上のルーチンに戻る。なお、キャリーフラグが1であれば(停止制御番号が10~57の範囲に含まれれば)、次の処理を実行する。
続いて、図159(a)の6行目のコマンド「LDQ A,(LOW _HIT_NUM)」によって、Qレジスタの値をアドレスの上位1バイトとし、停止制御番号を格納するアドレス「_HIT_NUM」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(停止制御番号)をAレジスタに読み出す。7行目のコマンド「CP A,34」によって、Aレジスタの値と固定値「34」を比較している。ここでは、停止制御番号が34未満であることを確認している。Aレジスタの値が34未満であれば、コマンド「CP A,34」によってキャリーフラグが立って1となる。そして、8行目の「RET NC」によって、キャリーフラグが1でなければ、1段上のルーチンに戻る。なお、キャリーフラグが1であれば(停止制御番号が34未満であれば)、残りの処理を実行して1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図159(a)のコマンド群を図159(b)のように変更することができる。図159(b)の1行目の指標「SET_RIG:」は、当該SET_RIGモジュールの先頭アドレスを示す。2行目のコマンド「LDQ A,(LOW _HIT_NUM)」によって、Qレジスタの値をアドレスの上位1バイトとし、停止制御番号を格納するアドレス「_HIT_NUM」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(停止制御番号)をAレジスタに読み出す。
そして、第2停止操作時使用ビットデータ更新処理として、図159(b)の3行目のコマンド「SUB A,10」によって、Aレジスタの値から固定値「10」を減算する。4行目のコマンド「RCP NC,A,57-10+1」によって、減算されたAレジスタの値と48(57-10+1)とを比較し、キャリーフラグが1でなければ、1段上のルーチンに戻る。ここでは、停止制御番号が10~57の範囲に含まれることを確認し、その範囲に入っていなければ、それ以降の処理を行わず1段上のルーチンに戻っている。なお、キャリーフラグが1であれば(停止制御番号が10~57の範囲に含まれれば)、次の処理を実行する。
続いて、図159(b)の5行目のコマンド「LDQ A,(LOW _HIT_NUM)」によって、Qレジスタの値をアドレスの上位1バイトとし、停止制御番号を格納するアドレス「_HIT_NUM」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(停止制御番号)をAレジスタに読み出す。6行目のコマンド「RCP NC,A,34」によって、Aレジスタの値と固定値「34」を比較し、キャリーフラグが1でなければ、1段上のルーチンに戻る。ここでは、停止制御番号が34未満であることを確認し、34以上であれば、それ以降の処理を行わず1段上のルーチンに戻っている。なお、キャリーフラグが1であれば(停止制御番号が34未満であれば)、残りの処理を実行して1段上のルーチンに戻る。
ここで、図159(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW _HIT_NUM)」2バイト+3行目のコマンド「SUB A,10」2バイト+4行目のコマンド「CP A,57-10+1」2バイト+5行目の「RET NC」1バイト+6行目のコマンド「LDQ A,(LOW _HIT_NUM)」2バイト+7行目のコマンド「CP A,34」2バイト+8行目の「RET NC」1バイト=12バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+4行目2サイクル+5行目3サイクル(1サイクル)+6行目3サイクル+7行目2サイクル+8行目3サイクル(1サイクル)=18サイクル(14サイクル)となる。一方、図159(b)に示したコマンド群の総コマンドサイズは、2行目のコマンドコマンド「LDQ A,(LOW _HIT_NUM)」2バイト+3行目のコマンド「SUB A,10」2バイト+4行目のコマンド「RCP NC,A,57-10+1」2バイト+5行目のコマンドコマンド「LDQ A,(LOW _HIT_NUM)」2バイト+6行目のコマンド「RCP NC,A,34」2バイト=10バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+4行目5サイクル(3サイクル)+5行目3サイクル+6行目5サイクル(3サイクル)=18サイクル(14サイクル)となる。したがって、図159(a)のコマンド群を図159(b)のコマンド群に置き換えることで、総コマンドサイズが2バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図160は、PRE_LOTモジュールを説明するための説明図である。図160に示したPRE_LOTモジュールは、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、準備中処理、すなわち、AT状態が所定の値(例えば5)の場合の抽せん処理を実行する。
図160(a)の1行目の指標「PRE_LOT:」は、当該PRE_LOTモジュールの先頭アドレスを示す。2行目のコマンド「LDQ A,(LOW _TRG_KND)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_TRG_KND」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(トリガー役種別)をAレジスタに読み出す。
図160(a)の3行目のコマンド「CP A,@LOT_OFS_1FK」によって、Aレジスタの値と、トリガー役種別として「フェイク1枚」を示す固定値「@LOT_OFS_1FK」、ここでは、3とを比較し、3未満であれば、キャリーフラグが立って1となる。そして、4行目の「RET C」によって、キャリーフラグが1であれば、1段上のルーチンに戻る。すなわち、Aレジスタの値が「フェイク1枚」を示す固定値未満であれば、当該PRE_LOTモジュールを終了する。なお、キャリーフラグが0であれば、REG開始時設定処理、BIG開始時BIGストック抽せん処理、BIG開始時設定処理を実行して、1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図160(a)のコマンド群を図160(b)のように変更することができる。図160(b)の1行目の指標「PRE_LOT:」は、当該PRE_LOTモジュールの先頭アドレスを示す。2行目のコマンド「LDQ A,(LOW _TRG_KND)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_TRG_KND」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(トリガー役種別)をAレジスタに読み出す。
図160(b)の3行目のコマンド「RCP C,A,@LOT_OFS_1FK」によって、Aレジスタの値と、トリガー役種別として「フェイク1枚」を示す固定値「@LOT_OFS_1FK」、ここでは、3とを比較し、3未満であれば、1段上のルーチンに戻る。すなわち、Aレジスタの値が「フェイク1枚」を示す固定値未満であれば、当該PRE_LOTモジュールを終了する。
ここで、図160(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW _TRG_KND)」2バイト+3行目のコマンド「CP A,@LOT_OFS_1FK」2バイト+3行目の「RET C」1バイト=5バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+4行目3サイクル(1サイクル)=8サイクル(6サイクル)となる。一方、図160(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW _TRG_KND)」2バイト+3行目のコマンド「RCP C,A,@LOT_OFS_1FK」2バイト=4バイトとなり、総実行サイクルは、2行目3サイクル+3行目5サイクル(3サイクル)=8サイクル(6サイクル)となる。したがって、図160(a)のコマンド群を図160(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図161は、REG_LOTモジュールを説明するための説明図である。図161に示したREG_LOTモジュールは、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、REG中処理、すなわち、AT状態が所定の値(例えば6)の場合の抽せん処理を実行する。
図161(a)の1行目の指標「REG_LOT:」は、当該REG_LOTモジュールの先頭アドレスを示す。2行目のコマンド「LDQ A,(LOW _TRG_KND)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_TRG_KND」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(トリガー役種別)をAレジスタに読み出す。
図161(a)の3行目のコマンド「CP A,@LOT_OFS_PDJ」によって、Aレジスタの値と、トリガー役種別として「打順ベル」を示す固定値「@LOT_OFS_PDJ」、ここでは、5とを比較し、5であれば、ゼロフラグが立って1となる。そして、4行目の「RET NZ」によって、ゼロフラグが1でなければ、1段上のルーチンに戻る。すなわち、Aレジスタの値が「打順ベル」を示す固定値でなければ、当該REG_LOTモジュールを終了する。なお、ゼロフラグが0であれば、REG残りナビ回数減算処理、REG終了時設定処理を実行して、1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図161(a)のコマンド群を図161(b)のように変更することができる。図161(b)の1行目の指標「REG_LOT:」は、当該REG_LOTモジュールの先頭アドレスを示す。2行目のコマンド「LDQ A,(LOW _TRG_KND)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_TRG_KND」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(トリガー役種別)をAレジスタに読み出す。
図161(b)の3行目のコマンド「RCP NZ,A,@LOT_OFS_PDJ」によって、Aレジスタの値と、トリガー役種別として「打順ベル」を示す固定値「@LOT_OFS_PDJ」、ここでは、5とを比較し、5でなければ、1段上のルーチンに戻る。すなわち、Aレジスタの値が「打順ベル」を示す固定値でなければ、当該REG_LOTモジュールを終了する。
ここで、図161(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW _TRG_KND)」2バイト+3行目のコマンド「CP A,@LOT_OFS_PDJ」2バイト+4行目の「RET NZ」1バイト=5バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+4行目3サイクル(1サイクル)=8サイクル(6サイクル)となる。一方、図161(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW _TRG_KND)」2バイト+3行目のコマンド「RCP NZ,A,@LOT_OFS_PDJ」2バイト=4バイトとなり、総実行サイクルは、2行目3サイクル+3行目5サイクル(3サイクル)=8サイクル(6サイクル)となる。したがって、図161(a)のコマンド群を図161(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図162は、BIG_SLTモジュールを説明するための説明図である。図162に示したBIG_SLTモジュールは、BIGストック数抽せん処理を実行する。
図162(a)の1行目の指標「BIG_SLT:」は、当該BIG_SLTモジュールの先頭アドレスを示す。2行目のコマンド「LDQ A,(LOW _TRG_KND)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_TRG_KND」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(トリガー役種別)をAレジスタに読み出す。
図162(a)の3行目のコマンド「CP A,@LOT_OFS_LCY」によって、Aレジスタの値と、トリガー役種別として「弱チェリー」を示す固定値「@LOT_OFS_LCY」、ここでは、6とを比較し、6未満であれば、キャリーフラグが立って1となる。そして、4行目の「RET C」によって、キャリーフラグが1であれば、1段上のルーチンに戻る。すなわち、Aレジスタの値が「弱チェリー」を示す固定値未満であれば、当該BIG_SLTモジュールを終了する。なお、キャリーフラグが0であれば、BIG中ストック抽せん処理を実行して、1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図162(a)のコマンド群を図162(b)のように変更することができる。図162(b)の1行目の指標「BIG_SLT:」は、当該BIG_SLTモジュールの先頭アドレスを示す。2行目のコマンド「LDQ A,(LOW _TRG_KND)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_TRG_KND」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(トリガー役種別)をAレジスタに読み出す。
図162(b)の3行目のコマンド「RCP C,A,@LOT_OFS_LCY」によって、Aレジスタの値と、トリガー役種別として「弱チェリー」を示す固定値「@LOT_OFS_LCY」、ここでは、6とを比較し、6未満であれば、1段上のルーチンに戻る。すなわち、Aレジスタの値が「弱チェリー」を示す固定値未満であれば、当該BIG_SLTモジュールを終了する。
ここで、図162(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW _TRG_KND)」2バイト+3行目のコマンド「CP A,@LOT_OFS_LCY」2バイト+4行目の「RET C」1バイト=5バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+4行目3サイクル(1サイクル)=8サイクル(6サイクル)となる。一方、図162(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW _TRG_KND)」2バイト+3行目のコマンド「RCP C,A,@LOT_OFS_LCY」2バイト=4バイトとなり、総実行サイクルは、2行目3サイクル+3行目5サイクル(3サイクル)=8サイクル(6サイクル)となる。したがって、図162(a)のコマンド群を図162(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図163は、NAV_SETモジュールを説明するための説明図である。図163に示したNAV_SETモジュールは、指示情報設定処理、すなわち、指示情報種別の設定処理を実行する。
図163(a)の1行目の指標「NAV_SET:」は、当該NAV_SETモジュールの先頭アドレスを示す。2行目のコマンド「LDQ A,(LOW _YRI_LMP)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_YRI_LMP」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(有効ランプフラグ)をAレジスタに読み出す。
図163(a)の3行目のコマンド「CP A,@AT_MOD_PRE」によって、Aレジスタの値と、AT状態定義が「準備中」を示す固定値「@AT_MOD_PRE」、ここでは、5とを比較し、5未満であれば、キャリーフラグが立って1となる。そして、4行目の「RET C」によって、キャリーフラグが1であれば、1段上のルーチンに戻る。すなわち、Aレジスタの値が「準備中」を示す固定値未満であれば、当該NAV_SETモジュールを終了する。なお、キャリーフラグが0であれば、残りの処理を実行して、1段上のルーチンに戻る。
ここで、図148の置き換えを行うと、図163(a)のコマンド群を図163(b)のように変更することができる。図163(b)の1行目の指標「NAV_SET:」は、当該NAV_SETモジュールの先頭アドレスを示す。2行目のコマンド「LDQ A,(LOW _YRI_LMP)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_YRI_LMP」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(有効ランプフラグ)をAレジスタに読み出す。
図163(b)の3行目のコマンド「RCP C,A,@AT_MOD_PRE」によって、Aレジスタの値と、AT状態定義が「準備中」を示す固定値「@AT_MOD_PRE」、ここでは、5とを比較し、5未満であれば、1段上のルーチンに戻る。すなわち、Aレジスタの値が「準備中」を示す固定値未満であれば、当該NAV_SETモジュールを終了する。
ここで、図163(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW _YRI_LMP)」2バイト+3行目のコマンド「CP A,@AT_MOD_PRE」2バイト+4行目の「RET C」1バイト=5バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+4行目3サイクル(1サイクル)=8サイクル(6サイクル)となる。一方、図163(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW _YRI_LMP」2バイト+3行目のコマンド「RCP C,A,@AT_MOD_PRE」2バイト=4バイトとなり、総実行サイクルは、2行目3サイクル+3行目5サイクル(3サイクル)=8サイクル(6サイクル)となる。したがって、図163(a)のコマンド群を図163(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
<XORQ>
図164は、TOK_PRCモジュールの具体的な処理を示したフローチャートである。TOK_PRCモジュールは、上記ステップS600の特別遊技管理処理(図36参照)を実行する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。
メインCPU300aは、図164のように、特別遊技特別図柄判定フラグをロードし(S1)、ロードした特別遊技特別図柄判定フラグを反転し(S2)、反転した特別遊技特別図柄判定フラグをセーブする(S3)。なお、ステップS1は、図36におけるステップS600-5に相当し、ステップS2は、図36におけるステップS600-7に相当し、ステップS3は、図36におけるステップS600-9に相当する。
図165は、TOK_PRCモジュールを実現するためのコマンドの一例を説明するための説明図である。図164で示したフローチャートは、例えば、図165に示したプログラムによって実現される。
図165(a)の1行目の指標「TOK_PRC:」は、当該TOK_PRCモジュールの先頭アドレスを示す。そして、特別遊技管理処理として、図165(a)の2行目のコマンド「LDQ A,(LOW R_STA_TZ)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_STA_TZ」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(特別遊技特別図柄判定フラグ)をAレジスタに読み出す。かかる2行目のコマンドが、図164のステップS1に対応する。3行目のコマンド「XOR 001H」によって、読み出した値(特別遊技特別図柄判定フラグ)と固定値(ここでは001H)との排他的論理和を計算する。これにより、特別遊技特別図柄判定フラグが反転される。かかる2行目のコマンドが、図164のステップS2に対応する。そして、4行目のコマンド「LDQ (LOW R_STA_TZ),A」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_STA_TZ」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに、Aレジスタの値を格納する。かかる4行目のコマンドが、図164のステップS3に対応する。
ここで、図165(a)のコマンド群を図165(b)のように変更することができる。図165(b)の1行目の指標「TOK_PRC:」は、当該TOK_PRCモジュールの先頭アドレスを示す。そして、特別遊技管理処理を実行すると、2行目のコマンド「XORQ (LOW R_STA_TZ),001H」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_STA_TZ」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(特別遊技特別図柄判定フラグ)と固定値(ここでは001H)との排他的論理和を計算し、計算結果を同アドレスに格納する。
ここで、図165(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_STA_TZ)」2バイト+3行目コマンド「XOR 001H」2バイト+4行目のコマンド「LDQ (LOW R_STA_TZ),A」2バイト=6バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+4行目3サイクル=8サイクルとなる。一方、図165(b)に示したコマンド群の総コマンドサイズは、「XORQ (LOW R_STA_TZ),001H」4バイト=4バイトとなり、総実行サイクルは、2行目7サイクル=7サイクルとなる。したがって、図165(a)のコマンド群を図165(b)のコマンド群に置き換えることで、総コマンドサイズが2バイト削減され、総実行サイクルも少なくとも1サイクル削減される。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図165(a)と図165(b)とを比較して理解できるように、図165(a)において3行(2行目~4行目)を占有していたコマンド群を、図165(b)においては1行(2行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、ここでは、図165(b)の例では、Aレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図165(a)の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
<CPQ>
図166は、TEF_SELモジュールの具体的な処理を示したフローチャートである。TOK_PRCモジュールは、大入賞口開放制御処理(図47参照)において、大入賞口閉鎖有効時間を特別電動役物遊技タイマに設定する際(ステップS720-9)に実行される。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。
メインCPU300aは、図166のように、小当たり遊技の大入賞口閉鎖有効時間をセットし(S1)、特別図柄判定フラグをロードし(S2)、ロードした特別図柄判定フラグと、小当たり図柄であることを示す所定の値(ここでは、007H)とを比較する(S3)。なお、特別図柄判定フラグは、ハズレ図柄である場合に00H、大当たり図柄である場合に01H~06Hのいずれか、小当たり図柄である場合に07H~09Hのいずれかが設定される。
そして、比較結果として小当たり図柄であれば(S4におけるYES)、当該TEF_SELモジュールを終了し(S6)、比較結果として小当たり図柄でなければ(S4におけるNO)、すなわち、大当たり図柄であれば、大役遊技の大入賞口閉鎖有効時間テーブルをセットし(S5)、当該TEF_SELモジュールを終了する(S6)。
図167は、TEF_SELモジュールを実現するためのコマンドの一例を説明するための説明図である。図166で示したフローチャートは、例えば、図167に示したプログラムによって実現される。
図167(a)の1行目の指標「TEF_SEL:」は、当該TEF_SELモジュールの先頭アドレスを示す。そして、図167(a)の2行目のコマンド「LD HL,@TMR_TDN_EF3」によって、「@TMR_TDN_EF3」の値がHLレジスタに格納される。なお、「@TMR_TDN_EF3」には、小当たり遊技の大入賞口閉鎖有効時間が設定されている。かかる1行目のコマンドが、図166のステップS1に対応する。
図167(a)の3行目のコマンド「LDQ A,(LOW R_ZUG_CHK_FIX)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_ZUG_CHK_FIX」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(特別図柄判定フラグ)をAレジスタに読み出す。かかる3行目のコマンドが、図166のステップS2に対応する。
図167(a)の4行目のコマンド「CP A,@ZUG_SML1」によって、Aレジスタの値と、小当たり図柄1指定データ(小当たり図柄)を示す固定値「@ZUG_SML1」、ここでは、07Hとを比較し、Aレジスタの値が07H未満であれば、キャリーフラグが立たって1となる。かかる4行目のコマンドが、図166のステップS3に対応する。
そして、図167(a)の5行目のコマンド「RET NC」によって、キャリーフラグが1でなければ、1段上のルーチンに戻る。すなわち、Aレジスタの値が小当たり図柄1指定データ以上であれば、当該TEF_SELモジュールを終了する。かかる5行目のコマンドが、図166のステップS4におけるYES、および、ステップS6に対応する。
一方、キャリーフラグが1であれば、図167(a)の6行目のコマンド「LDQ A,(LOW R_TDN_FLG)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_TDN_FLG」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(特別電動役物指定フラグ)をAレジスタに読み出し、図167(a)の7行目のコマンド「LD HL,D_EFF_TMR-2」によって、転送元となる1バイトデータ群の先頭アドレス「D_EFF_TMR-2」をHLレジスタに設定する。
図167(a)の8行目のコマンド「RST WORDSEL」によって、サブルーチンとしてWORDSELモジュールが呼び出され、HLレジスタにAレジスタの値を2回加算し、HLレジスタに示されるアドレスのうち、下位バイトの値がAレジスタに読み出された後、図167(a)の9行目のコマンド「RET」によって、1段上のルーチンに戻る。なお、その後の1段上のルーチンにおいて(その後の処理において)、大役遊技の大入賞口閉鎖有効時間がタイマにセットされることになる。かかる6行目から8行目が図166のステップS5に対応する。
ここで、図167(a)のコマンド群を図167(b)のように変更することができる。ここでは、図167(a)と実質的に等しい処理についてはその説明を省略し、図167(b)の異なる処理のみを説明する。
図167(b)の3行目のコマンド「CPQ (LOW R_ZUG_CHK_FIX),@ZUG_SML1」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_ZUG_CHK_FIX」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(特別図柄判定フラグ)と、小当たり図柄1指定データ(小当たり図柄)を示す固定値「@ZUG_SML1」、ここでは、07Hとを比較し、07H未満であれば、キャリーフラグが立たって1となる。かかる3行目のコマンドが、図166のステップS2およびステップS3に対応する。かかるコマンドのコマンドサイズは「3」であり、実行サイクルは「4」である。
ここで、図167(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LD HL,@TMR_TDN_EF3」3バイト+3行目コマンド「LDQ A,(LOW R_ZUG_CHK_FIX)」2バイト+4行目のコマンド「CP A,@ZUG_SML1」2バイト+5行目の「RET NC」1バイト+6行目のコマンド「LDQ A,(LOW R_TDN_FLG)」2バイト+7行目のコマンド「LD HL,D_EFF_TMR-2」3バイト+8行目のコマンド「RST WORDSEL」1バイト+9行目「RET」1バイト=15バイトとなり、実行サイクルは、2行目3サイクル+3行目2サイクル+4行目2サイクル+5行目3サイクル(1サイクル)+6行目2サイクル+7行目3サイクル+8行目4サイクル+9行目3サイクル=22サイクル(20サイクル)となる。なお、括弧内のサイクル数は、コマンド「RET NC」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。
一方、図167(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LD HL,@TMR_TDN_EF3」3バイト+3行目コマンド「CPQ (LOW R_ZUG_CHK_FIX),@ZUG_SML1」3バイト+4行目の「RET NC」1バイト+5行目のコマンド「LDQ A,(LOW R_TDN_FLG)」2バイト+6行目のコマンド「LD HL,D_EFF_TMR-2」3バイト+7行目のコマンド「RST WORDSEL」1バイト+8行目「RET」1バイト=14バイトとなり、実行サイクルは、2行目3サイクル+3行目4サイクル+4行目3サイクル(1サイクル)+5行目2サイクル+6行目3サイクル+7行目4サイクル+8行目3サイクル=22サイクル(20サイクル)となる。なお、括弧内のサイクル数は、コマンド「RET NC」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。
したがって、図167(a)のコマンド群を図167(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図167(a)と図167(b)とを比較して理解できるように、図167(a)において2行(3行目、4行目)を占有していたコマンド群を、図167(b)においては1行(3行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、ここでは、図167(b)の例では、3行目のコマンドにおいてAレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図167(a)の例では、3行目のコマンドを実行する際にAレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
<JTANDQ>
図168は、SWI_PRCモジュールの具体的な処理を示したフローチャートである。SWI_PRCモジュールは、上記ステップS500のスイッチ管理処理(図28参照)を実行する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。
メインCPU300aは、図168のように、第1可変始動口検出スイッチ120Bsの検出時であるかを判定し(S1)、第1可変始動口検出スイッチ120Bsの検出時であれば(S1におけるYES)、第1始動口通過処理(S2)および普通電動役物入賞時確認処理(S3)を実行する。一方、第1可変始動口検出スイッチ120Bsの検出時でなければ(S1におけるNO)、第1始動口通過処理(S2)および普通電動役物入賞時確認処理(S3)がスキップされる。なお、ステップS1は、図28におけるステップS500-7に相当し、ステップS2は、図28におけるステップS520に相当し、ステップS3)は、図28におけるステップS500-9に相当する。
図169は、SWI_PRCモジュールを実現するためのコマンドの一例を説明するための説明図である。図168で示したフローチャートは、例えば、図169に示したプログラムによって実現される。
図169(a)の1行目の指標「SWI_PRC:」は、当該SWI_PRCモジュールの先頭アドレスを示す。そして、図169(a)の2行目のコマンド「LDQ A,(LOW R_IN3_PON)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_IN3_PON」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値をAレジスタに読み出す。なお、ここで、同アドレスに格納された値には、例えば、最下位ビットに、第1固定始動口検出スイッチ120As(入力部)の検出結果が保持され、下位2ビット目に、第2始動口検出スイッチ122s(入力部)の検出結果が保持され、下位3ビット目に、第1可変始動口検出スイッチ120Bs(入力部)の検出結果が保持される。これら各ビットは、検出スイッチによって遊技球が入球したことが検出された場合に「1」となり、検出スイッチによって遊技球が入球したことが検出されていない場合に「0」となる。
3行目のコマンド「AND A,@IN3_ST2_BIT」によって、読み出した値と固定値「@IN3_ST2_BIT(ここでは00000100b)との論理積を計算する。これにより、読み出した値の下位3ビット目以外が0にされ(マスクされ)、読み出した値の下位3ビット目が0であればゼロフラグ=1となり、読み出した値の下位3ビット目が1であればゼロフラグ=0となる。つまり、第1可変始動口検出スイッチ120Bsの検出結果が1であれば(遊技球の入球が検出されていれば)ゼロフラグ=0となり、第1可変始動口検出スイッチ120Bsの検出結果が0であれば(遊技球の入球が検出されていなければ)ゼロフラグ=0となる。
そして、4行目のコマンド「JR Z,SWI_PRC_20」によって、ゼロフラグが1(Z)であれば、SWI_PRC_20(7行目)に移動する。かかる2行目~4行目のコマンドが、図168のステップS1に対応する。
一方、4行目のコマンド「JR Z,SWI_PRC_20」によって、ゼロフラグが1でなければ、5行目のコマンド「CALLF STA_PAS」によって、サブルーチンとしてSTA_PASモジュールが呼び出され、STA_PASモジュールにより第1始動口通過処理が実行される。かかる5行目のコマンドが、図168のステップS2に対応する。また、6行目のコマンド「CALLF FDN_CHK」によって、サブルーチンとしてFDN_CHKモジュールが呼び出され、FDN_CHKモジュールにより普通電動役物入賞時確認処理が実行される。かかる6行目のコマンドが、図168のステップS3に対応する。
ここで、図169(a)のコマンド群を図169(b)のように変更することができる。ここでは、図169(a)と実質的に等しい処理についてはその説明を省略し、図169(b)の異なる処理のみを説明する。
図169(b)の2行目のコマンド「JTANDQ Z,(LOW R_IN3_PON),@IN3_ST2_BIT,SWI_PRC_20」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_IN3_PON」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値と、固定値「@IN3_ST2_BIT」との論理積を計算し、ゼロフラグが1であればSWI_PRC_20に移動する。かかる2行目のコマンドが、図168のステップS1に対応する。かかるコマンドのコマンドサイズは「4」であり、実行サイクルは「5(6)」である。なお、括弧内のサイクル数は、ゼロフラグが1でありSWI_PRC_20に移動した場合の実行サイクルを示している。
ここで、図169(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_IN3_PON)」2バイト+3行目コマンド「AND A,@IN3_ST2_BIT」2バイト+4行目のコマンド「JR Z,SWI_PRC_20」2バイト+5行目のコマンド「CALLF STA_PAS」2バイト+6行目のコマンド「CALLF FDN_CHK」2バイト=10バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+4行目2(3)サイクル+5行目4サイクル+6行目4サイクル=15(16)サイクルとなる。なお、括弧内のサイクル数は、ゼロフラグが1でありSWI_PRC_20に移動した場合の実行サイクルを示している。
一方、図169(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「JTANDQ Z,(LOW R_IN3_PON),@IN3_ST2_BIT,SWI_PRC_20」4バイト+3行目のコマンド「CALLF STA_PAS」2バイト+4行目のコマンド「CALLF FDN_CHK」2バイト=8バイトとなり、総実行サイクルは、2行目5(6)サイクル+3行目4サイクル+4行目4サイクル=13(14)サイクルとなる。
したがって、図169(a)のコマンド群を図169(b)のコマンド群に置き換えることで、総コマンドサイズが2バイト削減され、総実行サイクルも少なくとも2サイクル削減される。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図169(a)と図169(b)とを比較して理解できるように、図169(a)において3行(2行目~4行目)を占有していたコマンド群を、図169(b)においては1行(2行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、図169(b)の例では、Aレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図169(a)の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
<OUT>
図170は、CPUINITモジュールの具体的な処理を示したフローチャートである。CPUINITモジュールは、上記CPU初期化処理(図22参照)を実行する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。
メインCPU300aは、図170のように、RAM300cへのアクセスを許可するアクセス許可処理を実行する(S1)。なお、ステップS1は、図22におけるステップS100-9に相当する。
図171は、CPUINITモジュールを実現するためのコマンドの一例を説明するための説明図である。図170で示したフローチャートは、例えば、図171に示したプログラムによって実現される。
図171(a)の1行目の指標「CPUINIT:」は、当該CPUINITモジュールの先頭アドレスを示す。そして、図171(a)の2行目のコマンド「LD A,(@RAMENBL)」によって、アクセスを許可することを示す固定値「@RAMENBL」(ここでは、1)をAレジスタに読み出す。そして、図171(a)の3行目のコマンド「OUT (@RAP____),A」によって、Uレジスタの値をアドレスの上位1バイトとし、RAMアクセスプロテクトレジスタポート(内部レジスタI/Oポート)のアドレスの下位1バイトを示す固定値「@RAP____」を下位1バイトとし、そのアドレスに、Aレジスタの値(1)を出力する。なお、Uレジスタには、RAMアクセスプロテクトレジスタポート(内部レジスタI/Oポート)のアドレスの上位1バイト(例えば「FEH」)が予め設定されている。
ここで、図171(a)のコマンド群を図171(b)のように変更することができる。ここでは、図171(a)と実質的に等しい処理についてはその説明を省略し、図171(b)の異なる処理のみを説明する。
図171(b)の2行目のコマンド「OUT (@RAP____),@RAMENBL」によって、Uレジスタの値をアドレスの上位1バイトとし、RAMアクセスプロテクトレジスタポート(内部レジスタI/Oポート)のアドレスの下位1バイトを示す固定値「@RAP____」を下位1バイトとし、そのアドレスに、固定値「@RAMENBL」、すなわち、1を出力する。かかるコマンドのコマンドサイズは「3」であり、実行サイクルは「4」である。
ここで、図171(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LD A,(@RAMENBL)」2バイト+3行目コマンド「OUT (@RAP____),A」2バイト=4バイトとなり、総実行サイクルは、2行目2サイクル+3行目3サイクル=5サイクルとなる。
一方、図171(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「OUT (@RAP____),@RAMENBL」3バイト=3バイトとなり、総実行サイクルは、2行目4サイクル=4サイクルとなる。
したがって、図171(a)のコマンド群を図171(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減され、総実行サイクルも少なくとも1サイクル削減される。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図171(a)と図171(b)とを比較して理解できるように、図171(a)において2行(2行目~3行目)を占有していたコマンド群を、図171(b)においては1行(2行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、図171(b)の例では、Aレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図171(a)の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
図172は、TMR_IPTモジュールを説明するための説明図である。図172に示したTMR_IPTモジュールは、図98に示したタイマ割込み処理を実行する。
図172(a)の1行目の指標「TMR_IPT:」は、当該TMR_IPTモジュールの先頭アドレスを示す。そして、図172(a)の2行目のコマンド「LD A,@TOCRVAL」によって、アクセスを許可することを示す固定値「@TOCRVAL」(ここでは、1)をAレジスタに読み出す。そして、図172(a)の3行目のコマンド「OUT (@PTOCR__),A」によって、Uレジスタの値をアドレスの上位1バイトとし、RAMアクセスプロテクトレジスタポート(内部レジスタI/Oポート)のアドレスの下位1バイトを示す固定値「@PTOCR__」をアドレスの下位1バイトとし、そのアドレスに、Aレジスタの値(1)を出力する。なお、Uレジスタには、RAMアクセスプロテクトレジスタポート(内部レジスタI/Oポート)のアドレスの上位1バイト(例えば「FEH」)が予め設定されている。
ここで、図172(a)のコマンド群を図172(b)のように変更することができる。ここでは、図172(a)と実質的に等しい処理についてはその説明を省略し、図172(b)の異なる処理のみを説明する。
図172(b)の2行目のコマンド「OUT (@PTOCR__),@TOCRVAL」によって、Uレジスタの値をアドレスの上位1バイトとし、RAMアクセスプロテクトレジスタポート(内部レジスタI/Oポート)のアドレスの下位1バイトを示す固定値「@PTOCR__」をアドレスの下位1バイトとし、そのアドレスに、固定値「@TOCRVAL」、すなわち、1を出力する。かかるコマンドのコマンドサイズは「3」であり、実行サイクルは「4」である。
ここで、図172(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LD A,@TOCRVAL」2バイト+3行目のコマンド「OUT (@PTOCR__),A」2バイト=4バイトとなり、総実行サイクルは、2行目2サイクル+3行目3サイクル=5サイクルとなる。
一方、図172(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「OUT (@PTOCR__),@TOCRVAL」3バイト=3バイトとなり、総実行サイクルは、2行目4サイクル=4サイクルとなる。
したがって、図172(a)のコマンド群を図172(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減され、総実行サイクルも少なくとも1サイクル削減される。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図172(a)と図172(b)とを比較して理解できるように、図172(a)において2行(2行目~3行目)を占有していたコマンド群を、図172(b)においては1行(2行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、図172(b)の例では、Aレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図172(a)の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
<LDQ>
図173は、FZ_SPNモジュールの具体的な処理を示したフローチャートである。FZ_SPNモジュールは、上記普通図柄変動中処理(図53参照)を実行する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。
メインCPU300aは、図173のように、普通図柄表示図柄カウンタに、普通図柄停止図柄番号(カウンタ値)をセーブする。(S1)。なお、ステップS1は、図53におけるステップS820-9に相当する。
図174は、FZ_SPNモジュールを実現するためのコマンドの一例を説明するための説明図である。図173で示したフローチャートは、例えば、図174に示したプログラムによって実現される。
図174(a)の1行目の指標「FZ_SPN:」は、当該FZ_SPNモジュールの先頭アドレスを示す。そして、図174(a)の2行目のコマンド「LDQ A,(LOW R_FZ_STP)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FZ_STP」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(普通図柄停止図柄番号)をAレジスタに読み出す。
そして、図174(a)の2行目のコマンド「LDQ (LOW R_FZ_DSP),A」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FZ_DSP」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレス(普通図柄表示図柄カウンタのアドレス)にAレジスタの値を格納する。
ここで、図174(a)のコマンド群を図174(b)のように変更することができる。ここでは、図174(a)と実質的に等しい処理についてはその説明を省略し、図174(b)の異なる処理のみを説明する。
図174(b)の2行目のコマンド「LDQ (LOW R_FZ_DSP),(LOW R_FZ_STP)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FZ_STP」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値を、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FZ_DSP」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納する。
ここで、図174(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_FZ_STP)」2バイト+3行目コマンド「LDQ (LOW R_FZ_DSP),A」2バイト=4バイトとなり、総実行サイクルは、2行目3サイクル+3行目3サイクル=6サイクルとなる。
一方、図174(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ (LOW R_FZ_DSP),(LOW R_FZ_STP)」4バイト=4バイトとなり、総実行サイクルは、2行目6サイクル=6サイクルとなる。
したがって、図174(a)と図174(b)とを比較して理解できるように、図174(a)において2行(2行目~3行目)を占有していたコマンド群を、総コマンドサイズおよび総実行サイクルを変更することなく、図174(b)においては1行(2行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、図174(b)の例では、Aレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図174(a)の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
図175は、CPUINITモジュールを実現するためのコマンドの一例を説明するための説明図である。ここで、特別遊技は、低確率遊技状態および高確率遊技状態のいずれかの遊技状態にて遊技が進行する。そして、遊技機100には、遊技状態が高確率遊技状態であることを示す表示器が設けられており、遊技状態が高確率遊技状態である場合には、当該表示器が点灯する。そして、電断復帰時において高確率遊技状態であることを遊技者に報知しない場合(所謂潜伏中)には、当該表示器を非表示にすることができる。このとき、実際の遊技状態に基づいて当該表示器の点灯有無を判定してしまうと、電断復帰時の遊技状態が高確率遊技状態であれば、当該表示器を点灯させてしまう。そこで、電断復帰時から初めて大役遊技が開始されるまでの間、潜伏中であることを示すフラグを用意し、そのフラグに基づいて当該表示器の点灯有無を判定するようになされている。
図175(a)の1行目の指標「CPUINIT:」は、当該CPUINITモジュールの先頭アドレスを示す。そして、図175(a)の2行目のコマンド「LDQ A,(LOW R_KAK_FLG)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_KAK_FLG」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレス(高確率遊技状態であるか否かを示すフラグのアドレス)に格納された値(高確率遊技状態であれば1、高確率遊技状態でなければ0)をAレジスタに読み出す。
そして、図175(a)の3行目のコマンド「LDQ (LOW R_KAK_HOT),A」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_KAK_HOT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレス(潜伏中であることを示すフラグのアドレス)にAレジスタの値を格納する。
ここで、図175(a)のコマンド群を図175(b)のように変更することができる。ここでは、図175(a)と実質的に等しい処理についてはその説明を省略し、図175(b)の異なる処理のみを説明する。
図175(b)の2行目のコマンド「LDQ (LOW R_KAK_HOT),(LOW R_KAK_FLG)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_KAK_FLG」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値を、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_KAK_HOT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納する。
ここで、図175(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_KAK_FLG)」2バイト+3行目コマンド「LDQ (LOW R_KAK_HOT),A」2バイト=4バイトとなり、総実行サイクルは、2行目3サイクル+3行目3サイクル=6サイクルとなる。
一方、図175(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ (LOW R_KAK_HOT),(LOW R_KAK_FLG)」4バイト=4バイトとなり、総実行サイクルは、2行目6サイクル=6サイクルとなる。
したがって、図175(a)と図175(b)とを比較して理解できるように、図175(a)において2行(2行目~3行目)を占有していたコマンド群を、図175(b)においては1行(2行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、図175(b)の例では、Aレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図175(a)の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
図176は、EXE_SETモジュールを実現するためのコマンドの一例を説明するための説明図である。図176に示したEXE_SETモジュールは、図91におけるステップS2400-11に示した実行フラグ設定処理を実行する。
図176(a)の1行目の指標「EXE_SET:」は、当該EXE_SETモジュールの先頭アドレスを示す。そして、図176(a)の2行目のコマンド「LDQ A,(LOW AT_NXT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「AT_NXT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレス(次遊技の演出状態を示す値のアドレス)に格納された値(次遊技の演出状態を示す値)をAレジスタに読み出す。
そして、図176(a)の3行目のコマンド「LDQ (LOW AT_MOD),A」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「AT_MOD」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレス(当該遊技の演出状態を示す値のアドレス)にAレジスタの値を格納する。
ここで、図176(a)のコマンド群を図176(b)のように変更することができる。ここでは、図176(a)と実質的に等しい処理についてはその説明を省略し、図176(b)の異なる処理のみを説明する。
図176(b)の2行目のコマンド「LDQ (LOW AT_MOD),(LOW AT_NXT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「AT_NXT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値を、Qレジスタの値をアドレスの上位1バイトとし、アドレス「AT_MOD」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納する。
ここで、図176(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW AT_NXT)」2バイト+3行目コマンド「LDQ (LOW AT_MOD),A」2バイト=4バイトとなり、総実行サイクルは、2行目3サイクル+3行目3サイクル=6サイクルとなる。
一方、図176(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ (LOW AT_MOD),(LOW AT_NXT)」4バイト=4バイトとなり、総実行サイクルは、2行目6サイクル=6サイクルとなる。
したがって、図176(a)と図176(b)とを比較して理解できるように、図176(a)において2行(2行目~3行目)を占有していたコマンド群を、図176(b)においては1行(2行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、図176(b)の例では、Aレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図176(a)の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
<LDIN>
図177は、HPT_GRPモジュールの具体的な処理を示したフローチャートである。HPT_GRPモジュールは、上記特別図柄変動番号決定処理(図39参照)におけるステップS612-7のリーチグループ決定処理を実行する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。また、当該HPT_GRPモジュールの説明中、第1レジスタはHLレジスタであり、他のレジスタはBCレジスタまたはAレジスタである。
リーチグループ決定処理では、保留種別、保留数、遊技状態等に応じて、予め決定されたリーチグループ決定乱数判定テーブルのアドレスが、HLレジスタに事前に格納されている。
メインCPU300aは、図177のように、HLレジスタに示されるアドレス(テーブルアドレス)に格納された比較値をBCレジスタにロードし、HLレジスタの値を2加算する(S1)。なお、詳しくは後述するように、リーチグループ決定乱数判定テーブルは、2バイト長の比較値と、1バイト長のグループ番号とが1セットとして、これら1セットが複数順に連続して格納されている。したがって、ここでは、比較値をロードした後にHLレジスタの値を2加算することで、HLレジスタは、ロードした比較値の次に格納されたグループ番号が格納されたアドレス値となる。
その後、メインCPU300aは、BCレジスタにロードした比較値と、DEレジスタに事前にロードされたリーチグループ決定乱数(乱数値)とを比較し(S2)、HLレジスタに示されるアドレスに格納されたリーチグループ番号をロードする(S3)。
その後、メインCPU300aは、HLレジスタの値(テーブルアドレス)を1加算する(S4)。ここでは、グループ番号をロードした後にHLレジスタの値を1加算することで、HLレジスタは、ロードしたグループ番号の次に格納された比較値が格納されたアドレス値となる。
そして、メインCPU300aは、上記ステップS2の比較結果として、比較値がリーチグループ決定乱数(乱数値)以下であれば(S5におけるYES)、上記ステップS1に処理を戻し、比較値がリーチグループ決定乱数以下でなければ(S5におけるNO)、当該HPT_GRPモジュールを終了する(S6)。
図178(a)、(b)は、HPT_GRPモジュールを実現するためのコマンドの一例を説明するための説明図である。図178(c)は、リーチグループ決定乱数判定テーブルの一例を説明するための説明図である。図177で示したフローチャートは、例えば、図178(a)、(b)に示したプログラムによって実現される。まず、図178(c)のリーチグループ決定乱数判定テーブルを説明した後に、図178(a)、(b)に示すHPT_GRPモジュールを実現するためのコマンドを説明する。
図178(c)における指標「D_GRP_SEL_00:」を起点としたテーブルは、いずれかのリーチグループ決定乱数判定テーブルの先頭アドレスを示す。そして、2行目の固定値「8999」、4行目の固定値「9099」、6行目の固定値「9299」は、それぞれ2バイト長の比較値であり、3行目の固定値「@D_MOD_SEL_00」、5行目の固定値「@D_MOD_SEL_01」、7行目の固定値「@D_MOD_SEL_02」は、それぞれ1バイト長のグループ番号である。そして、リーチグループ決定乱数判定テーブルでは、2バイト長の比較値、当該比較値に対応する1バイト長のグループ番号が1セットとなって連続して順に格納されている。
図178(a)の1行目の指標「HPT_GRP:」は、当該HPT_GRPモジュールの先頭アドレスを示す。そして、図178(a)の2行目のコマンド「LDIN BC,(HL)」によって、HLレジスタで示されるアドレスに格納された2バイト長の値(比較値)をBCレジスタに読み出し(ロードし)、HLレジスタの値を2加算する。かかる2行目のコマンドが、図177のステップS1に対応する。なお、HLレジスタには、事前に、予め決定されたリーチグループ決定乱数判定テーブルのアドレスがロードされている。
そして、図178(a)の3行目のコマンド「CP BC,DE」によって、BCレジスタに格納された値(比較値)と、DEレジスタに格納された値(リーチグループ決定乱数)とを比較する。ここで、BCレジスタに格納された値が、DEレジスタに格納された値以下であれば、ゼロフラグ(等しい場合)またはキャリーフラグ(未満の場合)に1が立つことになる。なお、DEレジスタには、事前に、リーチグループ決定乱数が格納されている。かかる3行目のコマンドが、図177のステップS2に対応する。
その後、図178(a)の4行目のコマンド「LD A,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト長の値(グループ番号)をAレジスタに読み出す。かかる4行目のコマンドが、図177のステップS3に対応する。そして、図178(a)の5行目のコマンド「INC HL」によって、HLレジスタの値を1加算する。かかる5行目のコマンドが、図177のステップS4に対応する。
続いて、図178(a)の6行目のコマンド「JLS HPT_GRP」によって、3行目のコマンド「CP BC,DE」によってゼロフラグまたはキャリーフラグに1が立っていた場合、「HPT_GRP」が示すアドレスに移動し、ゼロフラグおよびキャリーフラグに1が立っていなかった場合、図178(a)の7行目のコマンド「RET」によって、当該HPT_GRPモジュールが終了する。かかる6行目、7行目のコマンドが、図177のステップS5、S6に対応する。そして、HPT_GRPモジュールが終了した際には、図9に示す範囲に応じたグループ番号がAレジスタに格納されることになる。
ここで、図178(a)のコマンド群を図178(b)のように変更することができる。ここでは、図178(a)と実質的に等しい処理についてはその説明を省略し、図178(b)の異なる処理のみを説明する。
図178(b)の4行目のコマンド「LDIN A,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト長の値(グループ番号)をAレジスタに読み出し、HLレジスタの値を1加算する。かかる4行目のコマンドが、図177のステップS3、S4に対応する。かかるコマンドのコマンドサイズは「1」であり、実行サイクルは「2」である。
ここで、図178(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDIN BC,(HL)」2バイト+3行目コマンド「CP BC,DE」2バイト+4行目のコマンド「LD A,(HL)」1バイト+5行目のコマンド「INC HL」1バイト+6行目のコマンド「JLS HPT_GRP」3バイト+7行目のコマンド「RET」1バイト=10バイトとなり、総実行サイクルは、2行目4サイクル+3行目2サイクル+4行目2サイクル+5行目1サイクル+6行目4(3)サイクル+7行目3サイクル=16(15)サイクルとなる。なお、括弧内のサイクル数は、コマンド「JLS HPT_GRP」によって移動しなかった場合の実行サイクルを示している。
一方、図178(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDIN BC,(HL)」2バイト+3行目コマンド「CP BC,DE」2バイト+4行目のコマンド「LDIN A,(HL)」1バイト+5行目のコマンド「JLS HPT_GRP」3バイト+6行目のコマンド「RET」1バイト=9バイトとなり、総実行サイクルは、2行目4サイクル+3行目2サイクル+4行目2サイクル+5行目4(3)サイクル+6行目3サイクル=15(14)サイクルとなる。なお、括弧内のサイクル数は、コマンド「JLS HPT_GRP」によって移動しなかった場合の実行サイクルを示している。
したがって、図178(a)のコマンド群を図178(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減され、総実行サイクルも少なくとも1サイクル削減される。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図178(a)と図178(b)とを比較して理解できるように、図178(a)において2行(4行目~5行目)を占有していたコマンド群を、図178(b)においては1行(4行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、図178(b)の例では、バイト長が異なる複数の値が交互に並置したテーブル中の所望する2バイト長の値または1バイト長の値を取得する際に、HLレジスタの値に2加算および1加算を同一のコマンド「LDIN」で実行することができ、設計負荷の軽減を図ることが可能となる。
図179は、E_ILGERモジュールを説明するための説明図である。図179に示したE_ILGERモジュールは、図98におけるステップS3100-19に示した不正監視処理を実行する。
図179(a)の1行目の指標「E_ILGER:」は、当該E_ILGERモジュールの先頭アドレスを示す。2行目のコマンド「LD HL,_EX_ILTM」によって、不正投入監視タイマを格納するアドレス「EX_ILTM」をHLレジスタに読み出す。
その後、図179(a)の3行目のコマンド「LD A,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト長の値(不正投入監視タイマ)をAレジスタに読み出す。そして、図179(a)の4行目のコマンド「INC HL」によって、HLレジスタの値を1加算する。続いて、図179(a)の5行目のコマンド「JT Z,A,E_ILGER01」によって、Aレジスタの値が0である場合(不正投入監視タイマが0である場合)、以降の処理を省略して6行目の指標「E_ILGER01:」に移動し、Aレジスタの値が0でない場合、当該コマンドの次のコマンドに処理を移す。
ここで、図179(a)のコマンド群を図179(b)のように変更することができる。ここでは、図179(a)と実質的に等しい処理についてはその説明を省略し、図179(b)の異なる処理のみを説明する。
図179(b)の3行目のコマンド「LDIN A,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト長の値(不正投入監視タイマ)をAレジスタに読み出し、HLレジスタの値を1加算する。かかるコマンドのコマンドサイズは「1」であり、実行サイクルは「2」である。
ここで、図179(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LD HL,_EX_ILTM」3バイト+3行目のコマンド「LD A,(HL)」1バイト+4行目のコマンド「INC HL」1バイト+5行目のコマンド「JT Z,A,E_ILGER01」2バイト=7バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+4行目1サイクル+5行目3(2)サイクル=9(8)サイクルとなる。なお、括弧内のサイクル数は、コマンド「JT Z,A,E_ILGER01」によって移動しなかった場合の実行サイクルを示している。
一方、図179(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LD HL,_EX_ILTM」3バイト+3行目のコマンド「LDIN A,(HL)」1バイト+4行目のコマンド「JT Z,A,E_ILGER01」2バイト=6バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+4行目3(2)サイクル=8(7)サイクルとなる。なお、括弧内のサイクル数は、コマンド「JT Z,A,E_ILGER01」によって移動しなかった場合の実行サイクルを示している。
したがって、図179(a)のコマンド群を図179(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減され、総実行サイクルも少なくとも1サイクル削減される。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図179(a)と図179(b)とを比較して理解できるように、図179(a)において2行(3行目~4行目)を占有していたコマンド群を、図179(b)においては1行(3行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
図180は、E_LEVOTモジュールを説明するための説明図である。図180に示したE_LEVOTモジュールは、図91におけるステップS2400-11に示した実行フラグ設定処理において呼び出されるサブルーチンであり、レバー押下時試験信号送信処理を実行する。
図180(a)の1行目の指標「E_LEVOT:」は、当該E_LEVOTモジュールの先頭アドレスを示す。2行目のコマンド「LD HL,T_EXM_STP」によって、試験用停止情報送信テーブルを格納するアドレス「T_EXM_STP」をHLレジスタに読み出す。この試験用停止情報送信テーブルには、1バイト長の6つの試験信号の値が1セットとして連続して格納されているとともに、複数セットが連続して格納されている。
その後、図180(a)の3行目のコマンド「ADDWB HL,A」によって、HLレジスタの値にAレジスタの値が加算され、HLレジスタの値が更新される。なお、Aレジスタには、指示情報種別に6を乗算した値が格納されている。したがって、ここでは、HLレジスタの値が、試験用停止情報送信テーブルにおいて、指示情報種別に対応する1セットの先頭アドレスを示すこととなる。
そして、4行目のコマンド「LD B,6」によって、固定値「6」がBレジスタに読み出される。図180(a)の5行目の指標「E_LEVOT01:」は、指標「E_LEVOT01」のアドレスを示す。
図180(a)の6行目のコマンド「LD A,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト長の値(試験信号の値)をAレジスタに読み出す。そして、図180(a)の7行目のコマンドコマンド「OUT (@S2DT__),A」によって、Uレジスタの値をアドレスの上位1バイトとし、RAMアクセスプロテクトレジスタポート(内部レジスタI/Oポート)のアドレスの下位1バイトを示す固定値「@S2DT__」を下位1バイトとし、そのアドレスに、Aレジスタの値を出力する。
図180(a)の8行目のコマンド「INC HL」によって、HLレジスタの値を1加算する。続いて、図180(a)の9行目のコマンド「DJNZ E_LEVOT01」によって、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0でなければ、アドレス「E_LEVOT01」に移動し、デクリメントした結果が0であれば、当該コマンドの次のコマンドに処理を移す。
ここで、図180(a)のコマンド群を図180(b)のように変更することができる。ここでは、図180(a)と実質的に等しい処理についてはその説明を省略し、図180(b)の異なる処理のみを説明する。
図180(b)の6行目のコマンド「LDIN A,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト長の値(試験信号の値)をAレジスタに読み出し、HLレジスタの値を1加算する。かかるコマンドのコマンドサイズは「1」であり、実行サイクルは「2」である。
ここで、図180(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LD HL,T_EXM_STP」3バイト+3行目のコマンド「ADDWB HL,A」1バイト+4行目のコマンド「LD B,6」2バイト+6行目のコマンド「LD A,(HL)」1バイト+7行目のコマンド「OUT (@S2DT__),A」2バイト+8行目のコマンド「INC HL」1バイト+9行目のコマンド「DJNZ E_LEVOT01」2バイト=12バイトとなり、総実行サイクルは、2行目3サイクル+3行目1サイクル+4行目2サイクル+6行目2サイクル+7行目3サイクル+8行目1サイクル+9行目3(2)サイクル=15(14)サイクルとなる。なお、括弧内のサイクル数は、コマンド「DJNZ E_LEVOT01」によって移動しなかった場合の実行サイクルを示している。
一方、図180(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LD HL,T_EXM_STP」3バイト+3行目のコマンド「ADDWB HL,A」1バイト+4行目のコマンド「LD B,6」2バイト+6行目のコマンド「LDIN A,(HL)」1バイト+7行目のコマンド「OUT (@S2DT__),A」2バイト+5行目のコマンド「DJNZ E_LEVOT01」2バイト=11バイトとなり、総実行サイクルは、2行目3サイクル+3行目1サイクル+4行目2サイクル+6行目2サイクル+7行目3サイクル+9行目3(2)サイクル=14(13)サイクルとなる。なお、括弧内のサイクル数は、コマンド「DJNZ E_LEVOT01」によって移動しなかった場合の実行サイクルを示している。
したがって、図180(a)のコマンド群を図180(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減され、総実行サイクルも少なくとも1サイクル削減される。特に、図180(a)の例では、コマンド「DJNZ E_LEVOT01」におけるBレジスタの値が2以上であれば、その値に1サイクルを乗じた分だけ総実行サイクルの差分が増えるので、図180(b)の総実行サイクルの削減量も多くなる。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図180(a)と図180(b)とを比較して理解できるように、図180(a)において2行(6行目、8行目)を占有していたコマンド群を、図180(b)においては1行(6行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
<LDQP>
図181は、SBC_OUTモジュールの具体的な処理を示したフローチャートである。SBC_OUTモジュールは、上記ステップS100-65のサブコマンド送信処理(図23参照)を実行する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。
ここで、サブコマンドは、割込み処理における複数の処理において送信バッファにセットされ、サブコマンド送信処理で送信される。ここで、送信バッファは、例えば96バイトのリングバッファであり、複数の処理においてサブコマンドが順にセットされ、サブコマンド送信処理において、先にセットされたサブコマンドから順に副制御基板330に送信されるFIFOである。
メインCPU300aは、図181のように、サブコマンドライトポインタの値をAレジスタに読み出し(S1)、サブコマンドライトポインタの値と、サブコマンドリードポインタの値とを比較する(S2)。ここで、サブコマンドライトポインタの値と、サブコマンドリードポインタの値とが同じ場合、すなわち、未送信のサブコマンドがない場合にはゼロフラグに1が立ち、異なる場合、すなわち、未送信のサブコマンドがある場合にはゼロフラグに1が立たない。
メインCPU300aは、ゼロフラグが1であれば(S3におけるYES)、当該SBC_OUTモジュールを終了し、ゼロフラグが1でなければ(S3におけるNO)、サブコマンドポインタ上限値、および、サブコマンドリードポインタのアドレスの下位バイトをDEレジスタにそれぞれ読み出し(S4)、汎用モジュールであるカウントアップ処理によって、サブコマンドリードポインタの値を、サブコマンドポインタ上限値未満なら1加算し、サブコマンドポインタ上限値以上ならゼロクリアする(S5)。
その後、メインCPU300aは、サブコマンドバッファ(送信バッファ)のアドレスをHLレジスタに読み出し(S6)、上記のワードデータ選択処理を実行した後(S7)、サブコマンドを送信するためのSCU1データレジスタに先行コマンドを出力し(S8)、後続コマンドをAレジスタに読み出し(S9)、SCU1データレジスタに後続コマンドを出力し(S10)、当該SBC_OUTモジュールを終了する(S11)。
図182は、SBC_OUTモジュールを実現するためのコマンドの一例を説明するための説明図である。
図182(a)の1行目の指標「SBC_OUT:」は、当該SBC_OUTモジュールの先頭アドレスを示す。そして、図182(a)の2行目のコマンド「LDQ A,(LOW R_SBC_WPT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_SBC_WPT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(サブコマンドライトポインタの値)をAレジスタに読み出す。かかる2行目のコマンドが、図181のステップS1に対応する。
図182(a)の3行目のコマンド「CPQ A,(LOW R_SBC_RPT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_SBC_RPT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(サブコマンドリードポインタの値)と、Aレジスタの値(サブコマンドライトポインタの値)とを比較する。ここで、同アドレスに格納された値と、Aレジスタの値とが一致していれば、ゼロフラグに1が立つ。かかる3行目のコマンドが、図181のステップS2に対応する。
図182(a)の4行目のコマンド「RET Z」によって、ゼロフラグに1が立っていれば、当該SBC_OUTモジュールを終了する。かかる4行目のコマンドが、図181のステップS3に対応する。
図182(a)の5行目のコマンド「LD DE,@LMT_CMD_BFP*256+LOW R_SBC_RPT」によって、サブコマンドポインタ上限値を示す固定値「@LMT_CMD_BFP」がDレジスタに読み出され、サブコマンドリードポインタのアドレスの下位バイトを示す「R_SBC_RPT」がEレジスタに読み出される。かかる5行目のコマンドが、図181のステップS4に対応する。
図182(a)の6行目のコマンド「RST COUNTUP」によって、汎用モジュールであるCOUNTUPモジュールが読み出されて実行される。これにより、サブコマンドリードポインタの値は、サブコマンドポインタ上限値未満なら1加算され、サブコマンドポインタ上限値以上ならゼロクリアされる。かかる6行目のコマンドが、図181のステップS5に対応する。
図182(a)の7行目のコマンド「LD HL,R_SBC_SBF」によって、サブコマンドバッファ(送信バッファ)のアドレスを示す「R_SBC_SBF」がHLレジスタに読み出される。かかる7行目のコマンドが、図181のステップS6に対応する。ここで、「R_SBC_SBF」は、2バイト長のデータである。サブコマンドバッファのアドレスの上位1バイトが「F0H」であれば、コマンド「LDQ」によって読み出すことが可能であるが、サブコマンドバッファの上位1バイトが「F1H」になっていることもあるため、ここでは、コマンド「LDQ」を使用せずに2バイト長のデータを読み出している。
図182(a)の8行目のコマンド「RST WORDSEL」によって、汎用モジュールであるWORDSELモジュールが読み出され、HLレジスタにAレジスタの値を2回加算し、HLレジスタに示されるアドレスのうち、下位バイトの値(Lレジスタの値、すなわち、先行コマンド)がAレジスタに読み出される。かかる8行目のコマンドが、図181のステップS7に対応する。
図182(a)の9行目のコマンド「OUT (@S1DT__),A」によって、Aレジスタの値(先行コマンド)が、固定値「@S1DT__」で示されるアドレスに出力される。かかる9行目のコマンドが、図181のステップS8に対応する。
図182(a)の10行目のコマンド「LD A,H」によって、Hレジスタの値(後続コマンド)がAレジスタに読み出される。かかる10行目のコマンドが、図181のS9に対応する。
図182(a)の11行目のコマンド「OUT (@S1DT__),A」によって、Aレジスタの値(後続コマンド)が、固定値「@S1DT__」で示されるアドレスに出力され、当該SBC_OUTモジュールが終了する。かかる11行目のコマンドが、図181のステップS10に対応し、12行目のコマンドが、図181のステップS11に対応する。
ここで、図182(a)のコマンド群を図182(b)のように変更することができる。ここでは、サブコマンドバッファ(送信バッファ)の上位1バイトが「F1H」である場合について説明し、図182(a)と実質的に等しい処理についてはその説明を省略し、図182(b)の異なる処理のみを説明する。
図182(b)の7行目のコマンド「LDQP HL,LOW R_SBC_SBF」によって、Qレジスタの値に1加算された値(すなわち、「F1H」)が上位に、「R_SBC_SBF」が下位となる値(サブコマンドバッファのアドレス)がHLレジスタに読み出される。かかる7行目のコマンドが、図181のステップS6に対応する。かかるコマンドのコマンドサイズは「3」であり、実行サイクルは「7(5)」である。
ここで、図182(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_SBC_WPT)」2バイト+3行目コマンド「CPQ A,(LOW R_SBC_RPT)」3バイト+4行目のコマンド「RET Z」1バイト+5行目のコマンド「LD DE,@LMT_CMD_BFP*256+LOW R_SBC_RPT」2バイト+6行目のコマンド「RST COUNTUP」1バイト+7行目のコマンド「LD HL,R_SBC_SBF」3バイト+8行目のコマンド「RST WORDSEL」1バイト+9行目のコマンド「OUT (@S1DT__),A」2バイト+10行目のコマンド「LD A,H」1バイト+11行目のコマンド「OUT (@S1DT__),A」2バイト+12行目のコマンド「RET」1バイト=19バイトとなり、総実行サイクルは、2行目2サイクル+3行目4サイクル+4行目3(1)サイクル+5行目2サイクル+6行目4サイクル+7行目3サイクル+8行目4サイクル+9行目3サイクル+10行目1サイクル+11行目3サイクル+12行目3サイクル=32(30)サイクルとなる。なお、括弧内のサイクル数は、コマンド「RET Z」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。
一方、図182(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_SBC_WPT)」2バイト+3行目コマンド「CPQ A,(LOW R_SBC_RPT)」3バイト+4行目のコマンド「RET Z」1バイト+5行目のコマンド「LD DE,@LMT_CMD_BFP*256+LOW R_SBC_RPT」2バイト+6行目のコマンド「RST COUNTUP」1バイト+7行目のコマンド「LDQP HL,LOW R_SBC_SBF」3バイト+8行目のコマンド「RST WORDSEL」1バイト+9行目のコマンド「OUT (@S1DT__),A」2バイト+10行目のコマンド「LD A,H」1バイト+11行目のコマンド「OUT (@S1DT__),A」2バイト+12行目のコマンド「RET」1バイト=19バイトとなり、総実行サイクルは、2行目2サイクル+3行目4サイクル+4行目3(1)サイクル+5行目2サイクル+6行目4サイクル+7行目5サイクル+8行目4サイクル+9行目3サイクル+10行目1サイクル+11行目3サイクル+12行目3サイクル=34(32)サイクルとなる。なお、括弧内のサイクル数は、コマンド「RET Z」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。
したがって、図182(a)のコマンド群を図182(b)のコマンド群に置き換えることで、Qレジスタに「F0」が設定されている状態で、F100H以降のアドレスにアクセスする場合(上位の1バイトが「F1H」である場合)に、設計負荷の軽減を図ることが可能となる。なお、図37のステップS610-9で示した特別図柄記憶エリアシフト処理において、特別遊技特別図柄判別フラグを読み出す場合、特別遊技特別図柄判別フラグが格納されたアドレスの上位1バイトを「F1H」とし、コマンド「LDQP」を用いるようにしてもよい。さらに、図26のステップS400-29で示した外部情報管理処理において、出力ポート2バッファに合成ビットデータをセーブする場合に、出力ポート2バッファの上位1バイトを「F1H」とし、コマンド「LDQP」を用いるようにしてもよい。さらに、図25の電源断時退避処理において、バックアップ有効判定フラグにバックアップ有効判定値をセーブする場合に、バックアップ有効判定フラグが格納されたアドレスの上位1バイトを「F1H」とし、コマンド「LDQP」を用いるようにしてもよい。
<RCPQ>
図183は、SBC_OUTモジュールを実現するための他のコマンドの一例を説明するための説明図である。なお、図183(a)は、図182(a)と同一であるため、説明は省略する。また、図183(b)について、図183(a)と実質的に等しい処理についてはその説明を省略し、図183(b)の異なる処理のみを説明する。
図183(b)の3行目のコマンド「RCPQ Z,A,(LOW R_SBC_RPT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_SBC_RPT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(サブコマンドリードポインタの値)と、Aレジスタの値(サブコマンドライトポインタの値)とを比較し、ゼロフラグに1が立っていれば、コマンド「RET」を実行するように、当該SBC_OUTモジュールを終了する。かかる3行目のコマンドが、図181のステップS2~S4に対応する。かかるコマンドのコマンドサイズは「3」であり、実行サイクルは「7(5)」である。なお、括弧内のサイクル数は、かかるコマンドによって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。
ここで、図183(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_SBC_WPT)」2バイト+3行目コマンド「RCPQ Z,A,(LOW R_SBC_RPT)」3バイト+4行目のコマンド「LD DE,@LMT_CMD_BFP*256+LOW R_SBC_RPT」2バイト+5行目のコマンド「RST COUNTUP」1バイト+6行目のコマンド「LD HL,R_SBC_SBF」3バイト+7行目のコマンド「RST WORDSEL」1バイト+8行目のコマンド「OUT (@S1DT__),A」2バイト+9行目のコマンド「LD A,H」1バイト+10行目のコマンド「OUT (@S1DT__),A」2バイト+11行目のコマンド「RET」1バイト=18バイトとなり、総実行サイクルは、2行目2サイクル+3行目7(5)サイクル+4行目2サイクル+5行目4サイクル+6行目3サイクル+7行目4サイクル+8行目3サイクル+9行目1サイクル+10行目3サイクル+11行目3サイクル=32(30)サイクルとなる。なお、括弧内のサイクル数は、コマンド「RCPQ Z,A,(LOW R_SBC_RPT)」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。
したがって、図183(a)のコマンド群を図183(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図183(a)と図183(b)とを比較して理解できるように、図183(a)において2行(3行目~4行目)を占有していたコマンド群を、図183(b)においては1行(3行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
図184は、FZ_OPNモジュールを実現するためのコマンドの一例を説明するための説明図である。図184に示したFZ_OPNモジュールは、普通電動役物入賞口開放制御処理(図57参照)を実行する。
普通電動役物入賞口開放制御処理では、上記ステップS850-5において、普通電動役物入賞球数カウンタのカウンタ値が規定数に到達していないか、すなわち、第1可変始動口120Bに、1回の開閉制御中の最大入賞可能数と同数の遊技球が入球していないかを判定する。その結果、規定数に到達していないと判定した場合には当該普通電動役物入賞口開放制御処理を終了し、規定数に到達したと判定した場合にはステップS850-7に処理を移す。
この普通電動役物入賞口開放制御処理として、図184(a)の1行目の指標「FZ_OPN:」は、当該FZ_OPNモジュールの先頭アドレスを示す。そして、ステップS850-5として、2行目のコマンド「LDQ A,(LOW R_FDN_CNT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FDN_CNT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(普通電動役物入賞球数カウンタのカウンタ値)をAレジスタに読み出す。3行目のコマンド「CP A、@FDN_CNT」によって、Aレジスタの値と、規定数を示す固定値「@FDN_CNT」、ここでは、8とを比較する。すなわち、Aレジスタの値が8未満であれば、キャリーフラグが立って1となる。そして、4行目の「RET C」によって、キャリーフラグが1であれば、当該FZ_OPNモジュールを終了する。すなわち、普通電動役物入賞球数カウンタのカウンタ値が8未満であれば、当該FZ_OPNモジュールを終了する。なお、キャリーフラグが1でなければ、以降の処理を実行する。
ここで、図184(a)のコマンド群を図184(b)のように変更することができる。ここでは、図184(a)と実質的に等しい処理についてはその説明を省略し、図184(b)の異なる処理のみを説明する。
図184(b)の2行目のコマンド「RCPQ C,(LOW R_FDN_CNT),@FDN_CNT」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FDN_CNT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(普通電動役物入賞球数カウンタのカウンタ値)と、規定数を示す固定値「@FDN_CNT」、ここでは、8とを比較し、キャリーフラグが1であれば、コマンド「RET」を実行するように、当該FZ_OPNモジュールを終了する。かかるコマンドのコマンドサイズは「4」であり、実行サイクルは「8(6)」である。なお、括弧内のサイクル数は、かかるコマンドによって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。
ここで、図184(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_FDN_CNT)」2バイト+3行目コマンド「CP A、@FDN_CNT」3バイト+4行目のコマンド「RET C」1バイト=6バイトとなり、総実行サイクルは、2行目2サイクル+3行目4サイクル+4行目3(1)サイクル=9(7)サイクルとなる。なお、括弧内のサイクル数は、コマンド「RET C」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。
一方、図184(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「RCPQ C,(LOW R_FDN_CNT),@FDN_CNT」4バイト=4バイトとなり、総実行サイクルは、2行目8(6)サイクル=8(6)サイクルとなる。なお、括弧内のサイクル数は、コマンド「RCPQ C,(LOW R_FDN_CNT),@FDN_CNT」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。
したがって、図184(a)のコマンド群を図184(b)のコマンド群に置き換えることで、総コマンドサイズが2バイト削減され、総実行サイクルも少なくとも1サイクル削減される。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図184(a)と図184(b)とを比較して理解できるように、図184(a)において3行(2行目~4行目)を占有していたコマンド群を、図184(b)においては1行(2行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、図184(b)の例では、Aレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図184(a)の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
図185は、TD_OPNモジュールを実現するためのコマンドの一例を説明するための説明図である。図185に示したTD_OPNモジュールは、大入賞口開放制御処理(図47参照)を実行する。
大入賞口開放制御処理では、上記ステップS720-5において、大入賞口入賞球数カウンタのカウンタ値が規定数に到達していないか、すなわち、大入賞口に、1ラウンド中の最大入賞可能数と同数の遊技球が入球していないかを判定する。その結果、規定数に到達していないと判定した場合には当該大入賞口開放制御処理を終了し、規定数に到達したと判定した場合にはステップS720-7に処理を移す。
この大入賞口開放制御処理として、図185(a)の1行目の指標「TD_OPN:」は、当該TD_OPNモジュールの先頭アドレスを示す。そして、ステップS720-5として、2行目のコマンド「LDQ A,(LOW R_TDN_FLG)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_TDN_FLG」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(特別電動役物指定フラグ)をAレジスタに読み出す。なお、特別電動役物指定フラグは、どの大入賞口が当該大入賞口開放制御処理の対象となっているかを示すものである。
3行目のコマンド「LD HL、D_TDC_MAX-1」によって、大入賞口規定入賞数データテーブル(図14における特別電動役物作動ラムセットテーブルの規定数が示されるテーブル)のアドレスから1減算した値をHLレジスタに読み出す。
図185(a)の4行目のコマンド「RST BYTESEL」によって、汎用モジュールであるBYTESELモジュールが読み出され、HLレジスタにAレジスタの値を加算し、HLレジスタに示されるアドレスに格納された値(規定数)がAレジスタに読み出される。
図185(a)の5行目のコマンド「CPQ A、(LOW R_TDN_CNT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_TDN_CNT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(大入賞口入賞球数カウンタのカウンタ値)と、Aレジスタの値、ここでは、10とを比較する。すなわち、同アドレスに格納された値が10未満であれば、キャリーフラグが立たずに0となる。そして、6行目の「RET NC」によって、キャリーフラグが0であれば、当該TD_OPNモジュールを終了する。すなわち、大入賞口入賞球数カウンタのカウンタ値が10未満であれば、当該TD_OPNモジュールを終了する。なお、キャリーフラグが1であれば、以降の処理を実行する。
ここで、図185(a)のコマンド群を図185(b)のように変更することができる。ここでは、図185(a)と実質的に等しい処理についてはその説明を省略し、図185(b)の異なる処理のみを説明する。
図185(b)の5行目のコマンド「RCPQ NC,A, (LOW R_TDN_CNT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_TDN_CNT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(大入賞口入賞球数カウンタのカウンタ値)と、Aレジスタの値(既定値)、ここでは、10とを比較し、キャリーフラグが0であれば、コマンド「RET」を実行するように、当該TD_OPNモジュールを終了する。かかるコマンドのコマンドサイズは「3」であり、実行サイクルは「7(5)」である。なお、括弧内のサイクル数は、かかるコマンドによって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。
ここで、図185(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_TDN_FLG)」2バイト+3行目コマンド「LD HL、D_TDC_MAX-1」3バイト+4行目のコマンド「RST BYTESEL」1バイト+5行目コマンド「CPQ A、(LOW R_TDN_CNT)」3バイト+4行目のコマンド「RET NC」1バイト=10バイトとなり、総実行サイクルは、2行目2サイクル+3行目3サイクル+4行目3サイクル+5行目4サイクル+4行目3(1)サイクル=15(13)サイクルとなる。なお、括弧内のサイクル数は、コマンド「RET NC」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。
一方、図185(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_TDN_FLG)」2バイト+3行目コマンド「LD HL,D_TDC_MAX-1」3バイト+4行目のコマンド「RST BYTESEL」1バイト+5行目コマンド「RCPQ NC,A, (LOW R_TDN_CNT)」3バイト=9バイトとなり、総実行サイクルは、2行目2サイクル+3行目3サイクル+4行目3サイクル+5行目7(5)サイクル=15(13)サイクルとなる。なお、括弧内のサイクル数は、コマンド「RCPQ NC,A, (LOW R_TDN_CNT)」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。
したがって、図185(a)のコマンド群を図185(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図185(a)と図185(b)とを比較して理解できるように、図185(a)において2行(5行目~6行目)を占有していたコマンド群を、図185(b)においては1行(5行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
<JCPQ>
図186は、HSY_PRCモジュールを実現するためのコマンドの一例を説明するための説明図である。図186に示したHSY_PRCモジュールは、発射位置指定管理処理(図26のステップS400-27参照)を実行する。
この発射位置指定管理処理として、図186(a)の1行目の指標「HSY_PRC:」は、当該HSY_PRCモジュールの先頭アドレスを示す。2行目のコマンド「XOR A,A」によって、Aレジスタの値と、Aレジスタの値との排他的論理和を計算し、Aレジスタを初期化する。
そして、3行目のコマンド「LDQ HL,LOW R_TDN_FLG」によって、Qレジスタの値をHレジスタに読み出し、アドレス「R_TDN_FLG」の下位1バイトの値をLレジスタに読み出す。
4行目のコマンド「JCP NZ,(HL),@TDK_AT2,HSY_PRC_10」によって、HLレジスタに示される値(特別電動役物指定フラグ)と、第2大入賞口を示す固定値「@TDK_AT2」とを比較し、ゼロフラグに1が立っていなければ、7行目の指標「HSY_PRC_10」に示されるアドレスに移動する(処理を分岐させる)。
一方、ゼロフラグに1が立っていれば、5行目のコマンド「LDQ HL,LOW R_ZUG_CHK_FIX」によって、Qレジスタの値をHレジスタに読み出し、アドレス「R_ZUG_CHK_FIX」の下位1バイトの値をLレジスタに読み出す。
6行目のコマンド「JCP NZ,(HL),@ZUG_SML1,HSY_PRC_20」によって、HLレジスタに示される値(特別図柄判定フラグ)と、小当たり図柄1指定データを示す固定値「@ZUG_SML1」、ここでは、07Hとを比較し、ゼロフラグに1が立っていなければ、8行目の指標「HSY_PRC_20」に示されるアドレスに移動する(処理を分岐させる)。
ここで、図186(a)のコマンド群を図186(b)のように変更することができる。ここでは、図186(a)と実質的に等しい処理についてはその説明を省略し、図186(b)の異なる処理のみを説明する。
図186(b)の3行目のコマンド「JCPQ NZ,(LOW R_TDN_FLG),@TDK_AT2,HSY_PRC_10」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_TDN_FLG」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに示される値(特別電動役物指定フラグ)と、第2大入賞口を示す固定値「@TDK_AT2」とを比較し、ゼロフラグに1が立っていなければ、5行目の指標「HSY_PRC_10」に示されるアドレスに移動する(処理を分岐させる)。
図186(b)の4行目のコマンド「JCPQ NZ,(LOW R_ZUF_CHK_FIX,@ZUG_SML1,HSY_PRC_20」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_ZUF_CHK_FIX」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに示される値(特別図柄判定フラグ)と、第2大入賞口を示す固定値「@TDK_AT2」とを比較し、小当たり図柄1指定データを示す固定値「@ZUG_SML1」、ここでは、07Hとを比較し、ゼロフラグに1が立っていなければ、6行目の指標「HSY_PRC_20」に示されるアドレスに移動する(処理を分岐させる)。
ここで、図186(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「XOR A,A」1バイト+3行目のコマンド「LDQ HL,LOW R_TDN_FLG」2バイト+4行目のコマンド「JCP NZ,(HL),@TDK_AT2,HSY_PRC_10」4バイト+5行目のコマンド「LDQ HL,LOW R_ZUG_CHK_FIX」2バイト+6行目のコマンド「JCP NZ,(HL),@ZUG_SML1,HSY_PRC_20」4バイト=13バイトとなり、総実行サイクルは、2行目1サイクル+3行目2サイクル+4行目6(5)サイクル+5行目2サイクル+6行目2サイクル6(5)=17(15)サイクルとなる。なお、括弧内のサイクル数は、コマンド「JCP NZ,・・・」によって移動しなかった場合の実行サイクルを示している。
一方、図186(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「XOR A,A」1バイト+3行目のコマンド「JCPQ NZ,(LOW R_TDN_FLG),@TDK_AT2,HSY_PRC_10」4バイト+4行目のコマンド「JCPQ NZ,(LOW R_ZUG_CHK_FIX,@ZUG_SML1,HSY_PRC_20」4バイト=9バイトとなり、総実行サイクルは、2行目1サイクル+3行目6(5)サイクル+4行目6(5)=13(11)サイクルとなる。なお、括弧内のサイクル数は、コマンド「JCP NZ,・・・」によって移動しなかった場合の実行サイクルを示している。
したがって、図186(a)のコマンド群を図186(b)のコマンド群に置き換えることで、総コマンドサイズが4バイト削減され、総実行サイクルも少なくとも4サイクル削減される。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図186(a)と図186(b)とを比較して理解できるように、図186(a)において4行(3行目~6行目)を占有していたコマンド群を、図186(b)においては2行(3行目~4行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、図186(b)の例では、Aレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図186(a)の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
図187は、FDN_CHKモジュールを実現するためのコマンドの一例を説明するための説明図である。図187に示したFDN_CHKモジュールは、普通電動役物入賞時確認処理(図28のステップS500-9参照)を実行する。
この普通電動役物入賞時確認処理として、図187(a)の1行目の指標「FDN_CHK:」は、当該FDN_CHKモジュールの先頭アドレスを示す。
そして、2行目のコマンド「LDQ HL,(LOW R_FDN_EFF)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FDN_EFF」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスの値(普通電動役物閉鎖有効タイマの値)をHLレジスタに読み出す。
3行目のコマンド「RET NTZ」によって、ゼロフラグが1でなければ、当該FDN_CHKモジュールを終了する。ここで「NTZ」としているのは、コマンド「LDQ HL,(LOW R_FDN_EFF)」によって第2ゼロフラグは変化するが第1ゼロフラグは変化しないからである。
4行目のコマンド「LDQ A,(LOW R_FUT_PHS)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FUT_PHS」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスの値(普通遊技管理フェーズ)をAレジスタに読み出す。
5行目のコマンド「JCP NZ,A,@FD_OPN,FDN_CHK_10」によって、Aレジスタに示される値(普通遊技管理フェーズ)と、普通電動役物入賞口開放制御処理を示す固定値「@FD_OPN」、ここでは04Hとを比較し、ゼロフラグに1が立っていなければ、8行目の指標「FDN_CHK_10」に示されるアドレスに移動する(処理を分岐させる)。
一方、ゼロフラグに1が立っていれば、6行目のコマンド「INCQ (LOW R_FDN_CNT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FDN_CNT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(普通電動役物入賞球数カウンタのカウンタ値)に1加算し、同アドレスに、加算した値を格納し、7行目のコマンド「RET」によって、当該FDN_CHKモジュールを終了する。
ここで、図187(a)のコマンド群を図187(b)のように変更することができる。ここでは、図187(a)と実質的に等しい処理についてはその説明を省略し、図187(b)の異なる処理のみを説明する。
図187(b)の4行目のコマンド「JCPQ NZ,(LOW R_FUT_PHS),@FD_OPN,FDN_CHK_10」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FUT_PHS」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスの値(普通遊技管理フェーズ)と、普通電動役物入賞口開放制御処理を示す固定値「@FD_OPN」、ここでは04Hとを比較し、ゼロフラグに1が立っていなければ、7行目の指標「FDN_CHK_10」に示されるアドレスに移動する(処理を分岐させる)。
ここで、図187(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ HL,(LOW R_FDN_EFF)」2バイト+3行目のコマンド「RET NTZ」1バイト+4行目のコマンド「LDQ A,(LOW R_FUT_PHS)」2バイト+5行目のコマンド「JCP NZ,A,@FD_OPN,FDN_CHK_10」3バイト+6行目のコマンド「INCQ (LOW R_FDN_CNT)」2バイト+7行目のコマンド「RET」1バイト=11バイトとなり、総実行サイクルは、2行目4サイクル+3行目3(1)サイクル+4行目2サイクル+5行目4(3)サイクル+6行目5サイクル+7行目3サイクル=21(18)サイクルとなる。なお、括弧内のサイクル数は、コマンド「RET NTZ」「JCP NZ,・・・」によって移動しなかった場合の実行サイクルを示している。
一方、図187(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ HL,(LOW R_FDN_EFF)」2バイト+3行目のコマンド「RET NTZ」1バイト+4行目のコマンド「JCPQ NZ,(LOW R_FUT_PHS),@FD_OPN,FDN_CHK_10」4バイト+5行目のコマンド「INCQ (LOW R_FDN_CNT)」2バイト+6行目のコマンド「RET」1バイト=10バイトとなり、総実行サイクルは、2行目4サイクル+3行目3(1)サイクル+4行目6(5)サイクル+5行目5サイクル+6行目3サイクル=19(16)サイクルとなる。なお、括弧内のサイクル数は、コマンド「RET NZ」「JCPQ NTZ,・・・」によって移動しなかった場合の実行サイクルを示している。
したがって、図187(a)のコマンド群を図187(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減され、総実行サイクルも少なくとも2サイクル削減される。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図187(a)と図187(b)とを比較して理解できるように、図187(a)において2行(4行目~5行目)を占有していたコマンド群を、図187(b)においては1行(4行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、図187(b)の例では、Aレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図187(a)の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
図188は、FZ_STPモジュールを実現するためのコマンドの一例を説明するための説明図である。図188に示したFZ_STPモジュールは、普通図柄停止図柄表示処理(図54参照)を実行する。
この普通図柄停止図柄表示処理として、図188(a)の1行目の指標「FZ_STP:」は、当該FZ_STPモジュールの先頭アドレスを示す。
そして、2行目のコマンド「RET NTZ」によって、第2ゼロフラグに1が立っていなければ、当該FZ_STPモジュールを終了する。
3行目のコマンド「LDQ A,(LOW R_FZ_ATA)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FZ_ATA」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスの値(普通図柄当たりフラグ)をAレジスタに読み出す。なお、普通図柄当たりフラグは、普図抽選で当たりが決定されると01Hになり、ハズレが決定されると00Hとなる。
4行目のコマンド「JCP Z,A,@FZ_ATA,FZ_STP_10」によって、Aレジスタに示される値(普通図柄当たりフラグ)と、当たりを示す固定値「@FZ_ATA」、ここでは01Hとを比較し、ゼロフラグに1が立っていれば、8行目の指標「FZ_STP_10」に示されるアドレスに移動する(処理を分岐させる)。
一方、ゼロフラグに1が立っていなければ、5行目のコマンド「CLRQ (LOW R_FUT_PHS)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FUT_PHS」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(普通遊技管理フェーズ)に0を代入する(クリアする)。
6行目のコマンド「CLRQ (LOW R_FZ_STP)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FZ_STP」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(普通図柄停止図柄番号)に0を代入し(クリアし)、7行目のコマンド「RET」によって、当該FZ_STPモジュールを終了する。
ここで、図188(a)のコマンド群を図188(b)のように変更することができる。ここでは、図188(a)と実質的に等しい処理についてはその説明を省略し、図188(b)の異なる処理のみを説明する。
図188(b)の3行目のコマンド「JCPQ Z,(LOW R_FZ_ATA),@FZ_ATA,FZ_STP_10」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_FZ_ATA」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスの値(普通図柄当たりフラグ)と、当たりを示す固定値「@FZ_ATA」、ここでは01Hとを比較し、ゼロフラグに1が立っていれば、7行目の指標「FZ_STP_10」に示されるアドレスに移動する(処理を分岐させる)。
ここで、図188(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「RET NTZ」1バイト+3行目のコマンド「LDQ A,(LOW R_FZ_ATA)」2バイト+4行目のコマンド「JCP Z,A,@FZ_ATA,FZ_STP_10」3バイト+5行目のコマンド「CLRQ (LOW R_FUT_PHS)」2バイト+6行目のコマンド「CLRQ (LOW R_FZ_STP)」2バイト+7行目のコマンド「RET」1バイト=11バイトとなり、総実行サイクルは、2行目3(1)サイクル+3行目2サイクル+4行目4(3)サイクル+5行目2サイクル+6行目2サイクル+7行目3サイクル=16(13)サイクルとなる。なお、括弧内のサイクル数は、コマンド「RET NTZ」「JCP Z,・・・」によって1つ上のルーチンに移動しなかった場合の実行サイクルを示している。
一方、図188(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「RET NTZ」1バイト+3行目のコマンド「JCPQ Z,(LOW R_FZ_ATA),@FZ_ATA,FZ_STP_10」4バイト+4行目のコマンド「CLRQ (LOW R_FUT_PHS)」2バイト+5行目のコマンド「CLRQ (LOW R_FZ_STP)」2バイト+6行目のコマンド「RET」1バイト=10バイトとなり、総実行サイクルは、2行目3(1)サイクル+3行目6(5)サイクル+4行目2サイクル+5行目2サイクル+6行目3サイクル=16(13)サイクルとなる。なお、括弧内のサイクル数は、コマンド「RET NTZ」、「JCPQ Z,・・・」によって移動しなかった場合の実行サイクルを示している。
したがって、図188(a)のコマンド群を図188(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減される。かかる置き換えによって、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図188(a)と図188(b)とを比較して理解できるように、図188(a)において2行(3行目~4行目)を占有していたコマンド群を、図188(b)においては1行(3行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、図188(b)の例では、Aレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図188(a)の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
<乱数発生器>
図189は、乱数発生器740~746の構成を説明するためのブロック図である。上記したように、メインCPU300a、500aには、複数の乱数発生器が設けられている。
メインCPU300a、500aには、例えば、図189に示すように、16ビットの最大値を設定可能な乱数発生器である最大値設定乱数発生器740が4チャンネル、16ビットの最大値が65536に固定された乱数発生器である最大値固定乱数発生器742が4チャンネル、8ビットの最大値を設定可能な乱数発生器である最大値設定乱数発生器744が8チャンネル、8ビットの最大値が255に固定された乱数発生器である最大値固定乱数発生器746が8チャンネル設けられている。これらの乱数発生器740~746は、ハードウェア乱数発生器(ハードウェア乱数生成部)である。
最大値設定乱数発生器740は、乱数更新周期を32~47クロックのいずれかに設定可能であり、スタート値を、0001h、IDナンバーを基にした値、システムリセット毎に変更される値のいずれかに設定可能である。最大値固定乱数発生器742は、乱数更新周期が1クロックであり、スタート値がシステムリセット毎に変更される値である。なお、システムリセットは、ハード的に状態をリセットするものであり、電源投入時、所定の異常が発生したときに実行される。
最大値設定乱数発生器744は、乱数更新周期を16~31クロックのいずれかに設定可能であり、スタート値を、01h、IDナンバーを基にした値、システムリセット毎に変更される値のいずれかに設定可能である。最大値固定乱数発生器746は、乱数更新周期が1クロックであり、スタート値がシステムリセット毎に変更される値である。上記ステップS100-1の初期設定処理において、スタート値の設定および保存、最大値設定乱数発生器740、744の乱数更新周期の設定および保存が行われる。
また、これらの乱数発生器740~746は、システムリセット毎にスタート値が更新される。そして、最大値設定乱数発生器740は、ハードウェアにより、内部システムクロックの32クロック~47クロックのいずれかで1回、乱数(乱数カウンタ)を更新する。最大値設定乱数発生器744は、ハードウェアにより、内部システムクロックの16クロック~31クロックのいずれかで1回、乱数(乱数カウンタ)を更新する。最大値固定乱数発生器742、746は、ハードウェアにより、内部システムクロックの1クロックで1回、乱数(乱数カウンタ)を更新する。また、これらの乱数発生器740~746は、一定の規則に従って乱数を更新し、乱数列を一巡するごとに、自動的に乱数列が更新される。そして、ソフトウェアにより、遊技球が所定領域を通過したと判定されたときに、乱数値レジスタから乱数(ハードウェア乱数カウント値)が取得される。
また、メインCPU300a、500aでは、乱数発生器740~746から取得した乱数値に、プログラム内において所定の数値を乗じ、また、除算することでソフトウェア乱数を生成する(ソフトウェア乱数生成部)ことも可能である。ソフトウェア乱数生成部は、4ms毎に発生する割込み処理が実行されていない間に乱数を更新する。具体的には、ソフトウェア乱数生成部は、前回の乱数と最大値とを比較し、前回の乱数が最大値に達していた場合には乱数を0にし、前回の乱数が最大値に達していない場合には乱数を1加算する。そして、遊技球が所定領域を通過したと判定されたときに、乱数(ソフトウェア乱数カウント値)が取得される。
ここで、遊技機100では、乱数として、大当たり決定乱数、当たり図柄乱数、リーチグループ決定乱数、リーチモード決定乱数、変動パターン乱数、当たり決定乱数が設けられている。
大当たり決定乱数は0~65535の範囲であり、当たり図柄乱数は0~99の範囲であり、リーチグループ決定乱数は0~10006の範囲であり、リーチモード決定乱数は0~250の範囲であり、変動パターン乱数は0~238の範囲であり、当たり決定乱数は0~99の範囲である。
また、普通図柄の当たり図柄を複数設ける場合には、普図図柄乱数を設ける必要があり、例えば、0~99の範囲となる。さらに、普通図柄の変動パターン(変動時間)を複数設ける場合には、普図変動パターン乱数を設ける必要があり、例えば、0~99の範囲となる。
図190は、乱数生成部の組み合わせを説明する図である。例えば、大当たり決定乱数は、0~65535までの乱数を発生させる必要があるため、最大値を65535に設定した最大値設定乱数発生器740により生成された16ビットの乱数を用いる。当たり図柄乱数は、0~99までの乱数を発生させる必要があるため、最大値を99に設定したソフトウェア乱数生成部により生成された8ビットの乱数を用いる。
リーチグループ決定乱数は、0~10006までの乱数を発生させる必要があるため、最大値を10006に設定した最大値設定乱数発生器740により生成された16ビットの乱数を用いる。リーチモード決定乱数は、0~250までの乱数を発生させる必要があるため、最大値を250に設定したソフトウェア乱数生成部により生成された8ビットの乱数を用いる。変動パターン乱数は、0~238までの乱数を発生させる必要があるため、最大値を238に設定したソフトウェア乱数生成部により生成された8ビットの乱数を用いる。
当たり決定乱数は、0~99までの乱数を発生させる必要があるため、最大値を99に設定した最大値設定乱数発生器744により生成された8ビットの乱数を用いる。普図図柄乱数は、0~99までの乱数を発生させる必要があるため、最大値を99に設定したソフトウェア乱数生成部により生成された8ビットの乱数を用いる。普図変動パターン乱数は、0~99までの乱数を発生させる必要があるため、最大値を99に設定したソフトウェア乱数生成部により生成された8ビットの乱数を用いる。
ここで、ソフトウェア乱数生成部により生成された乱数を用いる場合、図23のステップS100-61、図26のステップS400-17、図23のステップS100-69において、乱数の初期値を決定したり、乱数を更新する処理を実行する必要がある。そうすると、遊技制御処理を行うための制御領域の容量が圧迫されるおそれがある。
そこで、図190(b)、(c)に示すように、例えば、大当たり決定乱数は0~65535の範囲とし、当たり図柄乱数は0~99の範囲とし、リーチグループ決定乱数は0~10006の範囲とし、リーチモード決定乱数は0~1000の範囲とし、変動パターン乱数は0~255の範囲とし、当たり決定乱数は0~65535の範囲とし、普図図柄乱数は0~99の範囲とし、普図変動パターン乱数は0~255の範囲とする。なお、これらの乱数の範囲は一例であり、最大値固定乱数発生器742の最大値である65535を最大値とした乱数、最大値固定乱数発生器746の最大値である255を最大値とした乱数をどの乱数に設定するようにしてもよい。
そして、図190(b)に示すように、大当たり決定乱数は、最大値を65535に設定した最大値設定乱数発生器740により生成された16ビットの乱数を用いる。当たり図柄決定乱数は、最大値が99に設定された最大値設定乱数発生器740により生成された8ビットの乱数を用いる。リーチグループ決定乱数は、最大値が10006に設定された最大値設定乱数発生器740により生成された16ビットの乱数を用いる。リーチモード決定乱数は、最大値を1000に設定した最大値設定乱数発生器により生成された16ビットの乱数を用いる。変動パターン乱数は、最大値が255に固定された最大値固定乱数発生器746により生成された8ビットの乱数を用いる。
当たり決定乱数は、最大値を65535に設定した最大値設定乱数発生器740により生成された16ビットの乱数を用いる。普図図柄乱数は、最大値を99に設定した最大値設定乱数発生器744により生成された8ビットの乱数を用いる。普図変動パターン乱数は、最大値が255に固定された最大値固定乱数発生器746により生成された8ビットの乱数を用いる。
また、図190(c)に示すように、大当たり決定乱数および当たり決定乱数は、最大値が65535に固定された最大値固定乱数発生器742により生成された16ビットの乱数を用いてもよい。最大値設定乱数発生器740は、スタート値、乱数更新周期、乱数の最大値等を適宜設定可能であるが、最大値固定乱数発生器742よりも乱数更新周期が遅い。そのため、遊技者の利益に直結する当否乱数(大当たり決定乱数および当たり決定乱数)については、乱数更新周期が早く、乱数の読み取りがされ辛い最大値固定乱数発生器742を用いるとよい。
このように、遊技の進行に用いられる複数の乱数に、乱数発生器740~746(ハードウェア乱数生成部)により生成された乱数を用いることにより、上記した図23のステップS100-61、図26のステップS400-17、図23のステップS100-69において、乱数の初期値を決定したり、乱数を更新する処理を実行する必要がなくなる。これにより、約35バイトのメインROM300bの容量を削減することができるとともに、約4バイトのメインRAM300cの容量を削減することができる。かくして、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
<コマンド「OR」>
図191は、SMC_ROTモジュールの具体的な処理を示したフローチャートである。ここでは、任意の処理として、定常回転中処理を実行するSMC_ROTモジュールの一部である、インデックスフラグに、リールの位置を示すフェーズフラグを合成する処理を挙げて説明する。ここで、インデックスフラグは、リール410a、410b、410cが定常回転の速度となった後、インデックス信号を取得したときにONされる1バイト値で表されるフラグである。例えば、左リール410aのインデックス信号を取得するとインデックスフラグのビット0が1となり、中リール410bのインデックス信号を取得するとインデックスフラグのビット1が1となり、右リール410cのインデックス信号を取得するとインデックスフラグのビット2が1となる。かかるインデックスフラグを参照することで、いずれのリール410a、410b、410cがインデックス信号を取得済みか確認することが可能となる。また、フェーズフラグは、処理中であるリール410a、410b、410cを特定する1バイトで示されるフラグである。例えば、左リール410aの処理中はフェーズフラグのビット0が1となり(00000001B)、中リール410bの処理中はフェーズフラグのビット1が1となり(00000010B)、右リール410cの処理中はフェーズフラグのビット2が1となる(00000100B)。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。また、当該SMC_ROTモジュールの説明中、第1レジスタはCレジスタであり、第2レジスタはHLレジスタであり、第1レジスタおよび第2レジスタと異なるレジスタはAレジスタである。
かかるSMC_ROTモジュールを実行する段階では、既に、所定のレジスタ(例えば、Cレジスタ)にフェーズフラグの値が保持されているとする。そして、メインCPU500aは、図191のように、任意の処理を実行する。メインCPU500aは、まず、HLレジスタに、論理和の対象となるインデックスフラグ(変数)のアドレスを設定する(S1)。そして、メインCPU500aは、インデックスフラグにフェーズフラグを合成するため、既に設定されているCレジスタの値(フェーズフラグ)と、HLレジスタで示されるアドレスに格納された1バイト値との論理和を計算し、論理和の結果を、インデックスフラグに反映するために、HLレジスタで示されるアドレスに格納されている値に上書きする(S2)。ここで、合成は、変数であるフェーズフラグのいずれかのビットが立っていると(1であれば)、インデックスフラグの同ビットも立たせる(1にする)ことを言う。したがって、処理中のリール410a、410b、410cについてはフェーズフラグが立っているので、インデックス信号の取得有無に拘わらず、合成により、インデックスフラグの該当ビットが立つこととなる。また、全てのインデックス信号が取得されると(全リール410a、410b、410cが定常回転速度となると)、フェーズフラグに拘わらず、インデックスフラグの各リールに相当するビットが全て立つ(00000111B)こととなる。そして、励磁パターン更新前処理を実行するPRE_PLSモジュールに移動することで当該SMC_ROTモジュールを終了する(S3)。こうして、インデックスフラグにフェーズフラグを合成することが可能となる。
図192は、SMC_ROTモジュールを実現するためのコマンドの一例を説明するための説明図である。図191で示したフローチャートは、例えば、図192に示したプログラムによって実現される。
図192の1行目の指標「SMC_ROT:」は、当該SMC_ROTモジュールの先頭アドレスを示す。2行目のコマンド「LDQ HL,LOW _IDX_FND」によって、Qレジスタの値をHレジスタに読み出し、アドレス「_IDX_FND」の下位1バイトの値をLレジスタに読み出す。かかる2行目のコマンドが、図191のステップS1に対応する。
図192の3行目のコマンド「LD A,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト値(インデックスフラグの値)がAレジスタに読み出される。4行目のコマンド「OR A,C」によって、Aレジスタの値とCレジスタの値の論理和が計算され、その計算結果によってAレジスタが更新される。そして、5行目のコマンド「LD (HL),A」によって、Aレジスタの値をHLレジスタで示されるアドレスに格納する。すなわち、Aレジスタの値を、HLレジスタで示されるアドレスに格納された1バイト値に上書きし、インデックスフラグの値を更新する。かかる3~5行目のコマンドが、図191のステップS2に対応する。
図192の6行目のコマンド「JP PRE_PLS」によって、PRE_PLSモジュールの先頭アドレスを示す指標「PRE_PLS:」に移動する。かかる6行目のコマンドが、図191のステップS3に対応する。
このように、図192に示したSMC_ROTモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LDQ HL,LOW _IDX_FND」2バイト+3行目のコマンド「LD A,(HL)」1バイト+4行目のコマンド「OR A,C」1バイト+5行目のコマンド「LD (HL),A」1バイト+6行目のコマンド「JP PRE_PLS」3バイト=8バイトとなり、総実行サイクルは、2行目2サイクル+3行目2サイクル+4行目1サイクル+5行目2サイクル+6行目3サイクル=10サイクルとなる。かかるSMC_ROTモジュールにおいて3~5行目の処理を設けることによって、変数として格納されているインデックスフラグとフェーズフラグとを容易に合成(論理和)することが可能となる。
図193は、SMC_ROTモジュールを実現するためのコマンドの他の例を説明するための説明図である。ここでは、図192のSMC_ROTモジュールのコマンド群を、図193のSMC_ROTモジュールのコマンド群に置き換えている。
図193の1行目の指標「SMC_ROT:」は、当該SMC_ROTモジュールの先頭アドレスを示す。2行目のコマンド「LDQ HL,LOW _IDX_FND」によって、Qレジスタの値をHレジスタに読み出し、アドレス「_IDX_FND」の下位1バイトの値をLレジスタに読み出す。
図193の3行目のコマンド「OR (HL),C」によって、HLレジスタで示されるアドレスに格納された1バイト値と、Cレジスタの値との論理和が計算され、その計算結果をHLレジスタで示されるアドレスに格納する。すなわち、計算結果を、HLレジスタで示されるアドレスに格納された1バイト値に上書きし、インデックスフラグの値を更新する。かかる3行目のコマンドが、図191のステップS2に対応する。
図193の4行目のコマンド「JP PRE_PLS」によって、PRE_PLSモジュールの先頭アドレスを示す指標「PRE_PLS:」に移動する。かかる4行目のコマンドが、図191のステップS3に対応する。
図193に示したSMC_ROTモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LDQ HL,LOW _IDX_FND」2バイト+3行目のコマンド「OR (HL),C」2バイト+4行目のコマンド「JP PRE_PLS」3バイト=7バイトとなり、総実行サイクルは、2行目2サイクル+3行目5サイクル+4行目3サイクル=10サイクルとなる。したがって、図192の場合と比べ、総コマンドサイズが1バイト削減される。かかるSMC_ROTモジュールによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図192と図193とを比較して理解できるように、図192において3行(3行目~5行目)を占有していたコマンド群を、図193においては1行(3行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
なお、ここでは、論理和を実行するコマンド「OR (HL),C」を挙げて説明したが、かかる場合に限らず、論理積を実行するコマンド「AND (HL),C」や排他的論理和「XOR (HL),C」であっても、論理和同様の置き換えができ、総コマンドサイズを1バイト削減することができる。また、変数のアドレスを格納するレジスタはHLレジスタに限らずDEレジスタでもよい。さらに、論理和の対象となるレジスタはCレジスタに限らず、Aレジスタ、Bレジスタ、Dレジスタ、Eレジスタ、Hレジスタ、Lレジスタを採用することもできる。
また、ここでは、図192の例と比較して、Aレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図192の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
<コマンド「LDF」>
図194は、INITIALモジュールの具体的な処理を示したフローチャートである。ここでは、任意の処理として、図82のステップS2000で示したCPU初期化処理を実行するINITIALモジュールの一部である内蔵レジスタエリア設定処理を挙げて説明する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。また、当該INITIALモジュールの説明中、第1レジスタはHLレジスタである。
メインCPU500aは、図194のように、任意の処理を実行する。メインCPU500aは、まず、HLレジスタに、CPU内蔵レジスタ設定データテーブル(データテーブル)の先頭アドレスを設定する(S1)。そして、メインCPU500aは設定データ数を設定する(S2)。
続いて、メインCPU500aは、入出力部を通じてアクセス可能な内蔵レジスタのアドレスおよび設定データをそれぞれCレジスタおよびAレジスタに設定する(S3)。次に、Cレジスタで示される内蔵レジスタに、Aレジスタの値(設定データ)を出力する(S4)。続いて、メインCPU500aは、Bレジスタの値(設定データ数)をデクリメント(「1」減算)し、デクリメントした結果が0であるか否か判定する(S5)。ここで、デクリメントした結果が0でなければ(S5におけるNO)、ステップS3からの処理を繰り返し、デクリメントした結果が0であれば(S5におけるYES)、次の処理に移行する。
図195は、INITIALモジュールを実現するためのコマンドの一例を説明するための説明図である。このうち、図195(a)は、INITIALモジュールのコマンド群を示し、図195(b)は、メインROM500bのプログラムデータにおける1バイトデータ群の配置を示す。図194で示したフローチャートは、例えば、図195に示したプログラムによって実現される。
図195(a)の1行目の指標「INITIAL:」は、当該INITIALモジュールの先頭アドレスを示す。2行目のコマンド「LD HL,T_CPU_REG」によって、CPU内蔵レジスタ設定データテーブルの先頭アドレス「T_CPU_REG」がHLレジスタに読み出される。かかる2行目のコマンドが、図194のステップS1に対応する。3行目のコマンド「LD B,@NUM_CPU_REG」によって、アドレス「@NUM_CPU_REG」に格納されている設定データ数がBレジスタに読み出される。かかる3行目のコマンドが、図194のステップS2に対応する。
なお、図195(b)の22行目を参照して理解できるように、アドレス「@NUM_CPU_REG」には、コマンド「EQU ($-T_CPU_REG)/2」が記載されている。ここで、「$」は、転送元となる1バイトデータ群の最終アドレスの次のアドレス、すなわち、アドレス「@NUM_CPU_REG」自体であり、「T_CPU_REG」は転送元となる1バイトデータ群の先頭アドレスなので、$-T_CPU_REGの値(データ数を示す1バイト値)の値が、1バイト値の総バイト数となり、その値を、アドレスと値との組み合わせ数である2で除算すると、設定データ数が導出される。例えば、図195(b)の例では、設定データ数は20/2=10となる。
図195(a)の4行目の指標「INITIAL01:」は繰り返し処理の先頭アドレスを示す。5行目のコマンド「LDIN AC,(HL)」によって、HLレジスタで示されるアドレスに格納された値がCレジスタに格納され、HLレジスタに「1」を加えた値で示されるアドレスに格納された値がAレジスタに格納される。かかる5行目のコマンドが、図194のステップS3に対応する。6行目のコマンド「OUT (C),A」によって、Cレジスタで示される値(内蔵レジスタ)に、Aレジスタの値(設定データ)が出力される。かかる6行目のコマンドが、図194のステップS4に対応する。
例えば、HLレジスタがアドレス「T_CPU_REG」の値であった場合、図195(b)の2行目における1バイト値「@PT0PR__」がCレジスタに格納され、図195(b)の3行目における「120」の値がAレジスタに格納される。そして、Cレジスタの値、すなわち「@PT0PR__」で示されるアドレスに、Aレジスタの値、すなわち、「120」の値を出力する。
続いて、図195(a)の7行目のコマンド「DJNZ INITIAL01」によって、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0でなければ、アドレス「INITIAL01」に移動し、デクリメントした結果が0であれば、当該コマンドの次のコマンドに処理を移す。ここでは、データ数が「10」なので、「INITIAL01」からの処理を10回繰り返すとBレジスタの値が0となる。かかる7行目のコマンドが、図194のステップS5に対応する。
このように、図195(a)に示したINITIALモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LD HL,T_CPU_REG」3バイト+3行目のコマンド「LD B,@NUM_CPU_REG」2バイト+5行目のコマンド「LDIN AC,(HL)」2バイト+6行目のコマンド「OUT (C),A」2バイト+7行目のコマンド「DJNZ INITIAL01」2バイト=11バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+5行目4サイクル+6行目3サイクル+7行目3サイクル(2サイクル)=15サイクル(14サイクル)となる。なお、括弧内のサイクル数は、コマンド「DJNZ INITIAL01」によって移動しなかった場合の実行サイクルを示している。なお、ここでは、設定データ数=10なので、5~7行目のコマンドが10回繰り返されることとなる。したがって、実際の総実行サイクルは、2行目3サイクル+3行目2サイクル+(5行目4サイクル+6行目3サイクル+7行目3サイクル)×9ループ+(5行目4サイクル+6行目3サイクル+7行目2サイクル)=104サイクルとなる。かかるINITIALモジュールによって、内部レジスタに設定データを設定することができる。
図196は、INITIALモジュールを実現するためのコマンドの他の例を説明するための説明図である。ここでは、図195(a)のINITIALモジュールのコマンド群を、図196(a)のINITIALモジュールのコマンド群に置き換えており、他の、図195(b)のメインROM500bのプログラムデータにおける1バイトデータ群は、図196(b)として、そのまま用いている。
図196(a)の1行目の指標「INITIAL:」は、当該INITIALモジュールの先頭アドレスを示す。2行目のコマンド「LDF HL,T_CPU_REG」によって、CPU内蔵レジスタ設定データテーブルの先頭アドレス「T_CPU_REG」がHLレジスタに読み出される。かかる2行目のコマンドが、図194のステップS1に対応する。
ここで、コマンド「LDF HL,mn」は、「mn」の値をHLレジスタに格納するコマンドである。かかるコマンドのコマンドサイズは「2」であり、実行サイクルは「2」である。一方、一般的に用いられるロードコマンド「LD HL,mn」も「mn」の値をHLレジスタに格納するコマンドであるが、そのコマンドのコマンドサイズは「3」であり、実行サイクルは「3」である。したがって、mnがメモリマップ上の1200H~1DFFHの範囲であり、かつ、HLレジスタにロードすることを条件に、「LD」を「LDF」に変更することで、コマンドサイズが1バイト削減され、実行サイクルも1サイクル削減される。
このように、コマンド「LDF HL,mn」におけるmnの値は、メモリマップにおける1200H~1DFFHのいずれかでなければならない。そこで、本実施形態では、メインROM500bの使用領域における1200H~1DFFHの範囲にプログラムデータを配置し、かかる範囲のデータを読み出す場合にのみコマンド「LDF HL,mn」を用いることとする。なお、「LDF HL,1200H」のアセンブルコードは、対象となるアドレス「1200H」に5800Hを加算した6A00Hと表される。したがって、「LDF HL,1200H」~「LDF HL,1DFFH」のアセンブルコードは、6A00H~75FFHとなる。
図196(a)の3行目のコマンド「LD B,@NUM_CPU_REG」によって、アドレス「@NUM_CPU_REG」に格納されている設定データ数がBレジスタに読み出される。かかる3行目のコマンドが、図194のステップS2に対応する。
図196(a)の4行目の指標「INITIAL01:」は繰り返し処理の先頭アドレスを示す。5行目のコマンド「LDIN AC,(HL)」によって、HLレジスタで示されるアドレスに格納された値がCレジスタに格納され、HLレジスタに「1」を加えた値で示されるアドレスに格納された値がAレジスタに格納される。かかる5行目のコマンドが、図194のステップS3に対応する。6行目のコマンド「OUT (C),A」によって、Cレジスタで示される値(内蔵レジスタ)に、Aレジスタの値(設定データ)が出力される。かかる6行目のコマンドが、図194のステップS4に対応する。
続いて、図196(a)の7行目のコマンド「DJNZ INITIAL01」によって、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0でなければ、アドレス「INITIAL01」に移動し、デクリメントした結果が0であれば、当該コマンドの次のコマンドに処理を移す。ここでは、データ数が「10」なので、「INITIAL01」からの処理を10回繰り返すとBレジスタの値が0となる。かかる7行目のコマンドが、図194のステップS5に対応する。
このように、図196(a)に示したINITIALモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LDF HL,T_CPU_REG」2バイト+3行目のコマンド「LD B,@NUM_CPU_REG」2バイト+5行目のコマンド「LDIN AC,(HL)」2バイト+6行目のコマンド「OUT (C),A」2バイト+7行目のコマンド「DJNZ INITIAL01」2バイト=10バイトとなり、総実行サイクルは、2行目2サイクル+3行目2サイクル+5行目4サイクル+6行目3サイクル+7行目3サイクル(2サイクル)=14サイクル(13サイクル)となる。なお、括弧内のサイクル数は、コマンド「DJNZ INITIAL01」によって移動しなかった場合の実行サイクルを示している。なお、ここでは、設定データ数=10なので、5~7行目のコマンドが10回繰り返されることとなる。したがって、実際の総実行サイクルは、2行目2サイクル+3行目2サイクル+(5行目4サイクル+6行目3サイクル+7行目3サイクル)×9ループ+(5行目4サイクル+6行目3サイクル+7行目2サイクル)=103サイクルとなる。したがって、図195(a)の場合と比べ、総コマンドサイズが1バイト削減され、総実行サイクルが1サイクル削減されていることが理解できる。かかるINITIALモジュールによって、コマンドの更なる短縮化、および、処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
なお、上述した実施形態では、INITIALモジュールを挙げ、内部レジスタに設定データを設定する処理において、コマンド「LD HL,T_CPU_REG」をコマンド「LDF HL,T_CPU_REG」に置き換え、コマンドの更なる短縮化、および、処理負荷の軽減を図る例を挙げて説明した。しかし、かかるコマンドは、INITIALモジュールに限らず、様々なモジュールにも適用できる。
例えば、表示データ変換処理を実行するDGEXTRNモジュールにおいても、コマンド「LD HL,T_SEG_PTN」が存在し、INITIALモジュール同様、メイン表示器表示パターンデータテーブルの先頭アドレス「T_SEG_PTN」がHLレジスタに読み出されている。また、先頭アドレス「T_SEG_PTN」は、1200H~1DFFHの範囲に含まれる。したがって、DGEXTRNモジュールにおいても、コマンド「LD HL,T_SEG_PTN」をコマンド「「LDF HL,T_SEG_PTN」に変更することで、コマンドの更なる短縮化、および、処理負荷の軽減を図ることができる。
また、図柄配列データ取得処理を実行するGET_ARYモジュールにおいても、コマンド「LD HL,T_FIG_LIN」が存在し、INITIALモジュール同様、有効ライン別図柄配列オフセットテーブルの先頭アドレス「T_FIG_LIN」がHLレジスタに読み出されている。また、先頭アドレス「T_FIG_LIN」は、1200H~1DFFHの範囲に含まれる。したがって、GET_ARYモジュールにおいても、コマンド「LD HL,T_FIG_LIN」をコマンド「LDF HL,T_FIG_LIN」に変更することで、コマンドの更なる短縮化、および、処理負荷の軽減を図ることができる。
このように、転送元のアドレスを1200H~1DFFHの範囲に収めることで、ほとんどのコマンド「LD HL,mn」をコマンド「LDF HL,mn」に置き換えることができる。かかる置き換えを本実施形態における全ての処理に適用することで、例えば、総コマンドサイズを80~90バイト短縮化することも可能となる。
かかるコマンド「LDF」は、上述したINITIALモジュールのみならず、様々なモジュール、例えば、RANKSETモジュール等に採用することができる。また、スロットマシンのみならず、パチンコ機における、例えば、PWRFAILモジュールやDYM_OUTモジュール等にも採用することができる。
図197は、RANKSETモジュールを説明するための説明図である。図85のステップS2020に示したRANKSETモジュールは、設定値切り替え処理、すなわち、設定値を切り替え、設定値データを更新する。なお、ここでは、RANKSETモジュール中のステップS2020-5の設定値切り替え時データテーブルセット処理を挙げて説明する。
図197(a)の1行目の指標「RANKSET:」は、当該RANKSETモジュールの先頭アドレスを示す。2行目のコマンド「LD HL,T_RNK_SET」によって、設定値切り替え時データテーブルの先頭アドレス「T_RNK_SET」がHLレジスタに読み出される。3行目のコマンド「RST TABLSET」によって、サブルーチンとして、図138を用いて説明したTABLSETモジュールが呼び出される。かかるTABLSETモジュールについては既に説明されているので、ここでは、その詳細な説明を省略する。ここでは、設定値切り替え時データテーブルにおける2つの変数(_WIN_DAT、_EXT_REQ)が所定値に設定される。
ここで、コマンド「LDF」への置き換えを行うと、図197(a)のコマンド群を図197(b)のように変更することができる。図197(b)の1行目の指標「RANKSET:」は、当該RANKSETモジュールの先頭アドレスを示す。2行目のコマンド「LDF HL,T_RNK_SET」によって、設定値切り替え時データテーブルの先頭アドレス「T_RNK_SET」がHLレジスタに読み出される。なお、設定値切り替え時データテーブルの先頭アドレス「T_RNK_SET」はメインROM500bの使用領域における1200H~1DFFHの範囲に配置される。3行目のコマンド「RST TABLSET」によって、サブルーチンとして、図138を用いて説明したTABLSETモジュールが呼び出される。こうして、図197(a)同様、設定値切り替え時データテーブルにおける2つの変数(_WIN_DAT、_EXT_REQ)が所定値に設定される。
ここで、図197(a)に示したRANKSETモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LD HL,T_RNK_SET」3バイト+3行目のコマンド「RST TABLSET」1バイト=4バイトとなり、総実行サイクルは、2行目3サイクル+3行目4サイクル=7サイクルとなる。一方、図197(b)に示したRANKSETモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LDF HL,T_RNK_SET」2バイト+3行目のコマンド「RST TABLSET」1バイト=3バイトとなり、総実行サイクルは、2行目2サイクル+3行目4サイクル=6サイクルとなる。したがって、図197(a)の場合と比べ、総コマンドサイズが1バイト削減され、総実行サイクルが1サイクル削減されていることが理解できる。かかるRANKSETモジュールによって、コマンドの更なる短縮化、および、処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図198は、PWRFAILモジュールを説明するための説明図である。図25のステップS300に示したPWRFAILモジュールは、電源断時退避処理、すなわち、設定値を切り替え、設定値データを更新する。なお、ここでは、PWRFAILモジュール中のステップS300-11の出力ポートクリア処理を挙げて説明する。
ここでは、出力ポートの初期値として予め00HがAレジスタに設定されているとする。図198(a)の1行目の指標「PWRFAIL:」は、当該PWRFAILモジュールの先頭アドレスを示す。2行目のコマンド「LD HL,D_OUT_PRT」によって、出力ポートアドレステーブルの先頭アドレス「D_OUT_PRT」がHLレジスタに読み出される。3行目のコマンド「LD B,@PRT_CLR_LOP」によって、アドレス「@PRT_CLR_LOP」に格納されている出力ポート初期化ループカウンタ値(ここでは13)がループ回数としてBレジスタに読み出される。
図198(a)の4行目の指標「PWRFAIL_20:」は繰り返し処理の先頭アドレスを示す。5行目のコマンド「LD C,(HL)」によって、HLレジスタで示されるアドレスに格納された値(出力ポートアドレス)がCレジスタに読み出される。6行目のコマンド「OUT (C),A」によって、Cレジスタで示される値(内蔵レジスタ)に、Aレジスタの値(ここでは00H)が出力され、出力ポートがクリアされる。
続いて、図198(a)の7行目のコマンド「INC HL」によってHLレジスタの値が1だけインクリメントされる。8行目のコマンド「DJNZ PWRFAIL_20」によって、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0でなければ、アドレス「PWRFAIL_20」に移動し、デクリメントした結果が0であれば、当該コマンドの次のコマンドに処理を移す。ここでは、データ数が「13」なので、「PWRFAIL_20」からの処理を13回繰り返すとBレジスタの値が0となる。こうして、出力ポートがクリアされる。
ここで、コマンド「LDF」への置き換えを行うと、図198(a)のコマンド群を図198(b)のように変更することができる。ここでも、出力ポートの初期値として予め00HがAレジスタに設定されているとする。図198(b)の1行目の指標「PWRFAIL:」は、当該PWRFAILモジュールの先頭アドレスを示す。2行目のコマンド「LDF HL,D_OUT_PRT」によって、出力ポートアドレステーブルの先頭アドレス「D_OUT_PRT」がHLレジスタに読み出される。なお、出力ポートアドレステーブルの先頭アドレス「D_OUT_PRT」はメインROM500bの使用領域における1200H~1DFFHの範囲に配置される。3行目のコマンド「LD B,@PRT_CLR_LOP」によって、アドレス「@PRT_CLR_LOP」に格納されている出力ポート初期化ループカウンタ値(ここでは13)がループ回数としてBレジスタに読み出される。
図198(b)の4行目の指標「PWRFAIL_20:」は繰り返し処理の先頭アドレスを示す。5行目のコマンド「LD C,(HL)」によって、HLレジスタで示されるアドレスに格納された値(出力ポートアドレス)がCレジスタに読み出される。6行目のコマンド「OUT (C),A」によって、Cレジスタで示される値(内蔵レジスタ)に、Aレジスタの値(ここでは00H)が出力され、出力ポートがクリアされる。
続いて、図198(b)の7行目のコマンド「INC HL」によってHLレジスタの値が1だけインクリメントされる。8行目のコマンド「DJNZ PWRFAIL_20」によって、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0でなければ、アドレス「PWRFAIL_20」に移動し、デクリメントした結果が0であれば、当該コマンドの次のコマンドに処理を移す。ここでは、データ数が「13」なので、「PWRFAIL_20」からの処理を13回繰り返すとBレジスタの値が0となる。こうして、出力ポートがクリアされる。
ここで、図198(a)に示したPWRFAILモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LD HL,D_OUT_PRT」3バイト+3行目のコマンド「LD B,@PRT_CLR_LOP」2バイト+5行目のコマンド「LD C,(HL)」1バイト+6行目のコマンド「OUT (C),A」2バイト+7行目のコマンド「INC HL」1バイト+8行目のコマンド「DJNZ PWRFAIL_20」2バイト=11バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+5行目2サイクル+6行目3サイクル+7行目1サイクル+8行目3サイクル(2サイクル)=14サイクル(13サイクル)となる。なお、ここでは、出力ポート初期化ループカウンタ値=13なので、5~8行目のコマンドが13回繰り返されることとなる。したがって、実際の総実行サイクルは、2行目3サイクル+3行目2サイクル+(5行目2サイクル+6行目3サイクル+7行目1サイクル+8行目3サイクル)×12ループ+(5行目2サイクル+6行目3サイクル+7行目1サイクル+8行目2サイクル)=121サイクルとなる。
一方、図198(b)に示したPWRFAILモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LDF HL,D_OUT_PRT」2バイト+3行目のコマンド「LD B,@PRT_CLR_LOP」2バイト+5行目のコマンド「LD C,(HL)」1バイト+6行目のコマンド「OUT (C),A」2バイト+7行目のコマンド「INC HL」1バイト+8行目のコマンド「DJNZ PWRFAIL_20」2バイト=10バイトとなり、総実行サイクルは、2行目2サイクル+3行目2サイクル+5行目2サイクル+6行目3サイクル+7行目1サイクル+8行目3サイクル(2サイクル)=13サイクル(12サイクル)となる。なお、ここでは、出力ポート初期化ループカウンタ値=13なので、5~8行目のコマンドが13回繰り返されることとなる。したがって、実際の総実行サイクルは、2行目2サイクル+3行目2サイクル+(5行目2サイクル+6行目3サイクル+7行目1サイクル+8行目3サイクル)×12ループ+(5行目2サイクル+6行目3サイクル+7行目1サイクル+8行目2サイクル)=120サイクルとなる。したがって、図198(a)の場合と比べ、総コマンドサイズが1バイト削減され、総実行サイクルが1サイクル削減されていることが理解できる。かかるPWRFAILモジュールによって、コマンドの更なる短縮化、および、処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図199は、DYM_OUTモジュールを説明するための説明図である。図26のステップS400-5で示したDYM_OUTモジュールは、第1特別図柄表示器160、第2特別図柄表示器162、第1特別図柄保留表示器164、第2特別図柄保留表示器166、普通図柄表示器168、普通図柄保留表示器170、右打ち報知表示器172、性能表示モニタ184を点灯制御するダイナミックポート出力処理を実行する。
図199(a)の1行目の指標「DYM_OUT:」は、当該DYM_OUTモジュールの先頭アドレスを示す。2行目のコマンド「LD HL,D_DYM_SEL」によって、ダイナミック表示選択テーブルの先頭アドレス「D_DYM_SEL」がHLレジスタに読み出される。3行目のコマンド「RST WORDSEL」によって、サブルーチンとして、図127~図130を用いて説明したWORDSELモジュールが呼び出される。かかるWORDSELモジュールについては既に説明されているので、ここでは、その詳細な説明を省略する。こうして、ダイナミック表示選択テーブルにおける4つの2バイトデータが選択される。
ここで、コマンド「LDF」への置き換えを行うと、図199(a)のコマンド群を図199(b)のように変更することができる。図199(b)の1行目の指標「DYM_OUT:」は、当該DYM_OUTモジュールの先頭アドレスを示す。2行目のコマンド「LDF HL,D_DYM_SEL」によって、ダイナミック表示選択テーブルの先頭アドレス「D_DYM_SEL」がHLレジスタに読み出される。なお、ダイナミック表示選択テーブルの先頭アドレス「D_DYM_SEL」はメインROM500bの使用領域における1200H~1DFFHの範囲に配置される。3行目のコマンド「RST WORDSEL」によって、サブルーチンとして、図127~図130を用いて説明したWORDSELモジュールが呼び出される。こうして、ダイナミック表示選択テーブルにおける4つの2バイトデータが選択される。
ここで、図199(a)に示したDYM_OUTモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LD HL,D_DYM_SEL」3バイト+3行目のコマンド「RST WORDSEL」1バイト=4バイトとなり、総実行サイクルは、2行目3サイクル+3行目4サイクル=7サイクルとなる。一方、図199(b)に示したDYM_OUTモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LDF HL,D_DYM_SEL」2バイト+3行目のコマンド「RST WORDSEL」1バイト=3バイトとなり、総実行サイクルは、2行目2サイクル+3行目4サイクル=6サイクルとなる。したがって、図199(a)の場合と比べ、総コマンドサイズが1バイト削減され、総実行サイクルが1サイクル削減されていることが理解できる。かかるDYM_OUTモジュールによって、コマンドの更なる短縮化、および、処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
<コマンド「SET」>
図200は、IPT_PDモジュールの具体的な処理を示したフローチャートである。ここでは、任意の処理として、図98のステップS3100-21で示した状態別モジュール実行処理を実行するためのCAL_MODモジュールにおいて、タイマ割込み処理用フェーズ(0~3)に応じて4回に1回(5.96msec毎に)選択的に移行し、外部信号出力制御処理を実行するIPT_PDモジュールの一部である外部信号4を設定する処理を挙げて説明する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。また、当該IPT_PDモジュールの説明中、所定のレジスタはHLレジスタである。
メインCPU500aは、図200のように、任意の処理を実行する。メインCPU500aは、まず、外部信号出力保持タイマに関するカウンタの減算処理を行う(S1)。そして、メインCPU500aは、HLレジスタに、出力ポート3イメージのアドレスを設定する(S2)。続いて、メインCPU500aは、ステップS1の減算処理によりセキュリティ信号ON条件を満たすか否か判定し、ON条件を満たしていれば、外部信号4、すなわち、HLレジスタで示されるアドレスの値の所定のビットを立たせる(1にする)(S3)。そして、当該IPT_PDモジュールを終了して1段上のルーチンに戻る(S4)。こうして、外部信号4を設定することが可能となる。
図201は、IPT_PDモジュールを実現するためのコマンドの一例を説明するための説明図である。図200で示したフローチャートは、例えば、図201に示したプログラムによって実現される。
図201の1行目の指標「IPT_PD:」は、当該IPT_PDモジュールの先頭アドレスを示す。2行目のコマンド「RST RAM_DEC」は、変数を1デクリメントする汎用モジュールを呼び出すコマンドであり、このコマンドによって外部信号出力保持タイマに関するカウンタが減算される。ここでは、コマンド「RST RAM_DEC」によって少なくともゼロフラグが更新される。かかる2行目のコマンドが、図200のステップS1に対応する。3行目のコマンド「LDQ HL,LOW _OUT_PT3」によって、Qレジスタの値をHレジスタに読み出し、アドレス「_OUT_PT3」の下位1バイトの値をLレジスタに読み出す。コマンド「LDQ HL,LOW _OUT_PT3」によってはゼロフラグが変化しない。かかる3行目のコマンドが、図200のステップS2に対応する。
図201の4行目のコマンド「JR Z,IPT_PD03」によって、2行目のコマンド「RST RAM_DEC」の減算結果がゼロであるか否か判定され、ゼロであれば(ゼロフラグが立っていれば)、すなわち、セキュリティ信号ON条件を満たしていなければ、6行目の指標「IPT_PD03:」に移動し、ゼロでなければ(ゼロフラグが立っていなければ)、次の処理を行う。5行目のコマンド「SET @EXT_SG4_POS,(HL)」は、出力ポート3イメージ、すなわち、HLレジスタが示すアドレスに格納されている値における、@EXT_SG4_POSで定義される値(ここでは、2)のビットを立たせる。6行目の指標「IPT_PD03:」は4行目のコマンド「JR Z,IPT_PD03」の移動先を示す。かかる4~6行目のコマンドが、図200のステップS3に対応する。そして、図201の7行目のコマンド「RET」によって、1段上のルーチンに戻る。かかる7行目のコマンドが、図200のステップS4に対応する。
このように、図201に示したIPT_PDモジュールのコマンドの総コマンドサイズは、2行目のコマンド「RST RAM_DEC」1バイト+3行目のコマンド「LDQ HL,LOW _OUT_PT3」2バイト+4行目のコマンド「JR Z,IPT_PD03」2バイト+5行目のコマンド「SET @EXT_SG4_POS,(HL)」2バイト+7行目のコマンド「RET」1バイト=8バイトとなり、総実行サイクルは、コマンド「JR Z,IPT_PD03」によって移動しなかった場合、2行目4サイクル+3行目2サイクル+4行目2サイクル+5行目5サイクル+7行目3サイクル=16サイクルとなり、コマンド「JR Z,IPT_PD03」によって移動した場合、2行目4サイクル+3行目2サイクル+4行目3サイクル+7行目3サイクル=12サイクルとなる。かかるIPT_PDモジュールにおいて4~6行目の処理を設けることによって、減算結果に応じた、出力ポート3イメージのビット操作が可能となる。
図202は、IPT_PDモジュールを実現するためのコマンドの他の例を説明するための説明図である。ここでは、図201のIPT_PDモジュールのコマンド群を、図202のIPT_PDモジュールのコマンド群に置き換えている。
図202の1行目の指標「IPT_PD:」は、当該IPT_PDモジュールの先頭アドレスを示す。2行目のコマンド「RST RAM_DEC」は、変数を1デクリメントする汎用モジュールを呼び出すコマンドであり、このコマンドによって外部信号出力保持タイマに関するカウンタが減算される。ここでは、コマンド「RST RAM_DEC」によって少なくともゼロフラグが更新される。かかる2行目のコマンドが、図200のステップS1に対応する。3行目のコマンド「LDQ HL,LOW _OUT_PT3」によって、Qレジスタの値をHレジスタに読み出し、アドレス「_OUT_PT3」の下位1バイトの値をLレジスタに読み出す。コマンド「LDQ HL,LOW _OUT_PT3」によってはゼロフラグが変化しない。かかる3行目のコマンドが、図200のステップS2に対応する。
図202の4行目のコマンド「SET NZ,@EXT_SG4_POS,(HL)」によって、2行目のコマンド「RST RAM_DEC」の減算結果がゼロでなければ(ゼロフラグが立っていなければ)、すなわち、セキュリティ信号ON条件を満たしていれば、出力ポート3イメージ、すなわち、HLレジスタが示すアドレスの値における、@EXT_SG4_POSで定義される値(ここでは、2)のビットを立たせる。かかる4行目のコマンドが、図200のステップS3に対応する。そして、図202の5行目のコマンド「RET」によって、1段上のルーチンに戻る。かかる5行目のコマンドが、図200のステップS4に対応する。
ここで、コマンド「SET cc,b,(HL)」は、ccに対応するフラグ(ゼロフラグやキャリーフラグ)が真であれば、HLレジスタで示されるアドレスの値(変数)のbビット目を立てるコマンドである。かかるコマンドのコマンドサイズは「2」であり、実行サイクルは「5」(「2」)である。なお、括弧内のサイクル数は、コマンド「SET cc,b,(HL)」においてフラグが真ではなかった場合の実行サイクルを示している。
このように、図202に示したIPT_PDモジュールのコマンドの総コマンドサイズは、2行目のコマンド「RST RAM_DEC」1バイト+3行目のコマンド「LDQ HL,LOW _OUT_PT3」2バイト+4行目のコマンド「SET NZ,@EXT_SG4_POS,(HL)」2バイト+5行目のコマンド「RET」1バイト=6バイトとなり、総実行サイクルは、2行目4サイクル+3行目2サイクル+4行目5サイクル(2サイクル)+5行目3サイクル=14サイクル(11サイクル)となる。したがって、図201の場合と比べ、総コマンドサイズが2バイト削減され、総実行サイクルが少なくとも1サイクル削減される。かかるIPT_PDモジュールによって、コマンドの更なる短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図201と図202とを比較して理解できるように、図201において3行(4行目~6行目)を占有していたコマンド群を、図202においては1行(4行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
なお、ここでは、ビットを設定するコマンド「SET cc,b,(HL)」を挙げて説明したが、かかる場合に限らず、ビットを設定するコマンド「SET cc,b,r」を用いることもできる。ここで、コマンド「SET cc,b,r」は、ccに対応するフラグ(ゼロフラグやキャリーフラグ)が真であれば、r(Aレジスタ,Bレジスタ,Dレジスタ,Eレジスタ,Hレジスタ,Lレジスタ)の値のbビット目を立てるコマンドである。かかるコマンドのコマンドサイズは「2」であり、実行サイクルは「2」である。
かかるコマンド「SET」は、上述したIPT_PDモジュールのみならず、様々なモジュール、例えば、DYNMOUTモジュール等に採用することができる。また、スロットマシンのみならず、パチンコ機における、例えば、EXT_PRCモジュール等にも採用することができる。
図203は、DYNMOUTモジュールを説明するための説明図である。図98のステップS3100-7で示したDYNMOUTモジュールでは、メインCPU500aが、セットされた出力イメージを出力ポートに出力し、メインクレジット表示部430、メイン払出表示部432、投入枚数表示器、スタート表示器、ストップスイッチ420a、420b、420cの表示器、リプレイ表示器、区間表示器460を点灯制御するダイナミックポート出力処理(ダイナミック点灯制御処理)が実行される。
図203(a)の1行目の指標「DYNMOUT:」は、当該DYNMOUTモジュールの先頭アドレスを示す。2行目のコマンド「RESQ @CHN_DSP_BIT,(LOW _WIN_DAT+1)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_WIN_DAT」の下位1バイトに1を加算した値をアドレスの下位1バイトとし、そのアドレスに格納された値(メイン表示器データバッファ2)における@CHN_DSP_BITが示すビット(ここではビット7)に0を設定する(リセットする)。3行目のコマンド「LDQ A,(LOW _OUT_PT2)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_OUT_PT2」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(出力ポート2イメージ)をAレジスタに読み出す。4行目のコマンド「JAND Z,A,00000011B,DYNMOUT02」によって、Aレジスタの値と00000011Bとの論理積がゼロであれば、アドレス「DYNMOUT02」に移動し、ゼロでなければ5行目のコマンドを処理する。5行目のコマンド「SETQ @CHN_DSP_BIT,(LOW _WIN_DAT+1)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_WIN_DAT」の下位1バイトに1を加算した値をアドレスの下位1バイトとし、そのアドレスに格納された値(メイン表示器データバッファ2)の@CHN_DSP_BITが示すビット(ここではビット7)に1を設定する(セットする)。6行目の指標「DYNMOUT02:」は、4行目のコマンド「JAND Z,A,00000011B,DYNMOUT02」の移動先を示す。こうして、出力ポート2イメージの下位2ビットの値に応じて、メイン表示器データバッファ2のビット7を設定することが可能となる。
ここで、コマンド「SET」への置き換えを行うと、図203(a)のコマンド群を図203(b)のように変更することができる。図203(b)の1行目の指標「DYNMOUT:」は、当該DYNMOUTモジュールの先頭アドレスを示す。2行目のコマンド「LDQ HL,LOW _WIN_DAT+1」によって、Qレジスタの値をHレジスタに読み出し、アドレス「_WIN_DAT」の下位1バイトの値に1を加算した値をLレジスタに読み出す。3行目のコマンド「RES @CHN_DSP_BIT,(HL)」によって、HLレジスタで示されるアドレスに格納された値における@CHN_DSP_BITが示すビット(ここではビット7)に0を設定する(リセットする)。4行目のコマンド「LDQ A,(LOW _OUT_PT2)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_OUT_PT2」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(出力ポート2イメージ)をAレジスタに読み出す。5行目のコマンド「AND A,00000011B」によって、Aレジスタの値と00000011Bとの論理積を演算し、Aレジスタをマスクする。6行目のコマンド「SET NZ,@CHN_DSP_BIT,(HL)」によって、5行目のコマンド「AND A,00000011B」の演算結果がゼロでなければ(ゼロフラグが立っていなければ)、HLレジスタが示すアドレスの値(メイン表示器データバッファ2)における@CHN_DSP_BITが示すビット(ここでは、ビット7)に1を設定する。こうして、図203(a)同様、出力ポート2イメージの下位2ビットの値に応じて、メイン表示器データバッファ2のビット7を設定することが可能となる。
ここで、図203(a)に示したDYNMOUTモジュールのコマンドの総コマンドサイズは、2行目のコマンド「RESQ @CHN_DSP_BIT,(LOW _WIN_DAT+1)」3バイト+3行目のコマンド「LDQ A,(LOW _OUT_PT2)」2バイト+4行目のコマンド「JAND Z,A,00000011B,DYNMOUT02」3バイト+5行目のコマンド「SETQ @CHN_DSP_BIT,(LOW _WIN_DAT+1)」3バイト=11バイトとなり、総実行サイクルは、出力ポート2イメージの下位2ビットが0でない場合、2行目6サイクル+3行目3サイクル+4行目3サイクル+5行目6サイクル=18サイクルとなり、出力ポート2イメージの下位2ビットがいずれも0であった場合、2行目6サイクル+3行目3サイクル+4行目4サイクル=13サイクルとなる。
一方、図203(b)に示したDYNMOUTモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LDQ HL,LOW _WIN_DAT+1」2バイト+3行目のコマンド「RES @CHN_DSP_BIT,(HL)」2バイト+4行目のコマンド「LDQ A,(LOW _OUT_PT2)」2バイト+5行目のコマンド「AND A,00000011B」2バイト+6行目のコマンド「SET NZ,@CHN_DSP_BIT,(HL)」2バイト=10バイトとなり、総実行サイクルは、出力ポート2イメージの下位2ビットが0でない場合、2行目2サイクル+3行目5サイクル+4行目3サイクル+5行目2サイクル+6行目5サイクル=17サイクルとなり、出力ポート2イメージの下位2ビットがいずれも0であった場合、2行目2サイクル+3行目5サイクル+4行目3サイクル+5行目2サイクル+6行目2サイクル=14サイクルとなる。したがって、図203(a)の場合と比べ、総コマンドサイズが1バイト削減されていることが理解できる。かかるDYNMOUTモジュールによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図204は、EXT_PRCモジュールを説明するための説明図である。図26のステップS400-29で示したEXT_PRCモジュールでは、メインCPU500aが、外部情報管理処理、すなわち、遊技情報出力端子板312から外部へ出力する外部情報用の出力データをセットする。
図204(a)の1行目の指標「EXT_PRC:」は、当該EXT_PRCモジュールの先頭アドレスを示す。2行目のコマンド「LD BC,@D_SEC_LOP*256+0」によって、Bレジスタにチェック対象ラム数(ループ回数)である@D_SEC_LOP(ここでは8)が設定され、Cレジスタに合成ビットデータの初期値として0が設定される。3行目のコマンド「JR Z,EXT_PRC_15」によって、そのコマンドを実行する以前に演算された対象ラムアドレスの論理積がゼロであるか否か判定され、ゼロであれば(ゼロフラグが立っていれば)、5行目の指標「EXT_PRC_15:」に移動し、ゼロでなければ(ゼロフラグが立っていなければ)、4行目の処理を行う。4行目のコマンド「SET @EXT_SEC_POS,C」によって、Cレジスタの値(合成ビットデータ)の@EXT_SEC_POSで定義される値(ここでは、ビット6)のビットを立たせる。5行目の指標「EXT_PRC_15:」は3行目のコマンド「JR Z,EXT_PRC_15」の移動先を示す。こうして、対象ラムアドレスの論理積の演算結果に応じて合成ビットデータのビット6を設定することが可能となる。
ここで、コマンド「SET」への置き換えを行うと、図204(a)のコマンド群を図204(b)のように変更することができる。図204(b)の1行目の指標「EXT_PRC:」は、当該EXT_PRCモジュールの先頭アドレスを示す。2行目のコマンド「LD BC,@D_SEC_LOP*256+0」によって、Bレジスタにチェック対象ラム数(ループ回数)である@D_SEC_LOP(ここでは8)が設定され、Cレジスタに合成ビットデータの初期値として0が設定される。3行目のコマンド「SET NZ,@EXT_SEC_POS,C」によって、そのコマンドが実行される以前に演算された対象ラムアドレスの論理積がゼロであるか否か判定され、ゼロでなければ(ゼロフラグが立っていなければ)、Cレジスタの値(合成ビットデータ)の@EXT_SEC_POSで定義される値(ここでは、ビット6)のビットを立たせる。こうして、図204(a)同様、対象ラムアドレスの論理積の演算結果に応じて合成ビットデータのビット6を設定することが可能となる。
ここで、図204(a)に示したEXT_PRCモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LD BC,@D_SEC_LOP*256+0」2バイト+3行目のコマンド「JR Z,EXT_PRC_15」2バイト+4行目のコマンド「SET @EXT_SEC_POS,C」2バイト=6バイトとなり、総実行サイクルは、論理積が0でない場合、2行目2サイクル+3行目2サイクル+4行目2サイクル=6サイクルとなり、論理積が0であった場合、2行目2サイクル+3行目3サイクル=5サイクルとなる。
一方、図204(b)に示したEXT_PRCモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LD BC,@D_SEC_LOP*256+0」2バイト+3行目のコマンド「SET NZ,@EXT_SEC_POS,C」2バイト=4バイトとなり、総実行サイクルは、論理積が0でない場合、2行目2サイクル+3行目5サイクル=7サイクルとなり、論理積が0であった場合、2行目2サイクル+3行目2サイクル=4サイクルとなる。したがって、図204(a)の場合と比べ、総コマンドサイズが2バイト削減されていることが理解できる。かかるEXT_PRCモジュールによって、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
<コマンド「JANDQ」>
図205は、STOPDCTモジュールの具体的な処理を示したフローチャートである。ここでは、任意の処理として、図92のステップS2500で示した回胴回転中処理を実行するSTOPDCTモジュールの一部である停止表示器を確認する処理S2500-23を挙げて説明する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。また、当該STOPDCTモジュールの説明中、所定のレジスタはHLレジスタである。
メインCPU500aは、図205のように、任意の処理を実行する。メインCPU500aは、まず、操作対象ビットの抽出処理を行う(S1)。かかる処理により、Aレジスタには、操作対象ビットが設定される。そして、メインCPU500aは、Aレジスタの操作対象ビットと、予めDレジスタに設定されている回動回転中フラグとの合成を行う(S2)。続いて、メインCPU500aは、停止表示器を示すアドレスの値と論理積をとることで停止表示器を確認し(S3)、停止表示器が赤色点灯中であれば(S4におけるYES)、当該STOPDCTモジュールの先頭から処理を繰り返し、停止表示器が赤色点灯中でなければ(S4におけるNO)、次の処理を実行する。そして、回転停止処理を実行するSTP_RELモジュールに移動することで、当該STOPDCTモジュールを終了する(S5)。こうして、停止表示器の状態に応じた押下処理が可能となる。
図206は、STOPDCTモジュールを実現するためのコマンドの一例を説明するための説明図である。図205で示したフローチャートは、例えば、図206に示したプログラムによって実現される。
図206の1行目の指標「STOPDCT:」は、当該STOPDCTモジュールの先頭アドレスを示す。2行目のコマンド「CALLF SMPLBIT」は、操作対象ビット抽出処理を実行するSMPLBITモジュールを呼び出すコマンドであり、このコマンドによって操作対象となった(実際に操作された)ストップスイッチに対応するビットがAレジスタに設定される。かかる2行目のコマンドが、図205のステップS1に対応する。3行目のコマンド「AND A,D」によって、操作対象ビットが設定されたAレジスタと、予め回動回転中フラグが設定されているDレジスタとの論理積を演算し、その結果をAレジスタに保持する。かかる3行目のコマンドが、図205のステップS2に対応する。
図206の4行目のコマンド「ANDQ A,(LOW _OUT_PT4)」によって、Qレジスタの値を上位1バイトとし、アドレス「_OUT_PT4」の値(第1所定値)を下位1バイトとした値(停止表示器の値)とAレジスタの値の論理積を演算し、その結果をAレジスタに保持する。かかる4行目のコマンドが、図205のステップS3に対応する。5行目のコマンド「JR Z,STOPDCT」によって、4行目のコマンド「ANDQ A,(LOW _OUT_PT4)」の演算結果がゼロであるか否か判定され、ゼロであれば(ゼロフラグが立っていれば)、1行目の指標「STOPDCT:」(第2所定値)に移動し、ゼロでなければ(ゼロフラグが立っていなければ)、次の処理を行う。かかる5行目のコマンドが、図205のステップS4に対応する。
このように、図206に示したSTOPDCTモジュールのコマンドの総コマンドサイズは、2行目のコマンド「CALLF SMPLBIT」2バイト+3行目のコマンド「AND A,D」1バイト+4行目のコマンド「ANDQ A,(LOW _OUT_PT4)」3バイト+5行目のコマンド「JR Z,STOPDCT」2バイト=8バイトとなり、総実行サイクルは、2行目4サイクル+3行目1サイクル+4行目4サイクル+5行目3サイクル(2サイクル)=12サイクル(11サイクル)となる。なお、括弧内のサイクル数は、コマンド「JR Z,STOPDCT」によって移動しなかった場合の実行サイクルを示している。かかるSTOPDCTモジュールにおいて4、5行目の処理を設けることによって、停止表示器の状態に応じた押下処理が可能となる。
図207は、STOPDCTモジュールを実現するためのコマンドの他の例を説明するための説明図である。ここでは、図206のSTOPDCTモジュールのコマンド群を、図207のSTOPDCTモジュールのコマンド群に置き換えている。
図207の1行目の指標「STOPDCT:」は、当該STOPDCTモジュールの先頭アドレスを示す。2行目のコマンド「CALLF SMPLBIT」は、操作対象ビット抽出処理を実行するSMPLBITモジュールを呼び出すコマンドであり、このコマンドによって操作対象となったストップスイッチに対応するビットがAレジスタに設定される。かかる2行目のコマンドが、図205のステップS1に対応する。3行目のコマンド「AND A,D」によって、操作対象ビットが設定されたAレジスタと、予め回動回転中フラグが設定されているDレジスタとの論理積を演算し、その結果をAレジスタに保持する。かかる3行目のコマンドが、図205のステップS2に対応する。
図207の4行目のコマンド「JANDQ Z,A,(LOW _OUT_PT4),STOPDCT」によって、Qレジスタの値を上位1バイトとし、アドレス「_OUT_PT4」の値(第1所定値)を下位1バイトとした値(停止表示器の値)とAレジスタの値の論理積を演算し、その演算結果がゼロであるか否か判定され、ゼロであれば(ゼロフラグが立っていれば)、1行目の指標「STOPDCT:」(第2所定値)に移動し、ゼロでなければ(ゼロフラグが立っていなければ)、次の処理を行う。かかる4行目のコマンドが、図205のステップS3、S4に対応する。
ここで、コマンド「JANDQ cc,A,(k),e」は、Qレジスタの値を上位1バイトとし、kで示されるアドレスの値を下位1バイトとした値(第1所定値)と、Aレジスタの値の論理積を演算し、その演算結果について、ccに対応するフラグ(ゼロフラグやキャリーフラグ)が真であれば、e(第2所定値)で示されるアドレスに移動し、ccに対応するフラグが真でなければ、次の処理に移るコマンドである。かかるコマンドのコマンドサイズは「4」であり、実行サイクルは「6」(「5」)である。なお、括弧内のサイクル数は、コマンド「JANDQ cc,A,(k),e」においてフラグが真ではなかった場合の実行サイクルを示している。
図207に示したSTOPDCTモジュールのコマンドの総コマンドサイズは、2行目のコマンド「CALLF SMPLBIT」2バイト+3行目のコマンド「AND A,D」1バイト+4行目のコマンド「JANDQ Z,A,(LOW _OUT_PT4),STOPDCT」4バイト=7バイトとなり、総実行サイクルは、2行目4サイクル+3行目1サイクル+4行目6サイクル(5サイクル)=11サイクル(10サイクル)となる。なお、括弧内のサイクル数は、コマンド「JANDQ Z,A,(LOW _OUT_PT4),STOPDCT」によって移動しなかった場合の実行サイクルを示している。したがって、図206の場合と比べ、総コマンドサイズが1バイト削減され、総実行サイクルが少なくとも1サイクル削減される。かかるSTOPDCTモジュールによって、コマンドの更なる短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図206と図207とを比較して理解できるように、図206において2行(4行目、5行目)を占有していたコマンド群を、図207においては1行(4行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
<コマンド「CALLEX」>
E_SETTMモジュールは、図89のステップS2200-11や図95のステップS2800-39で示したエラーウェイト処理を実行するERRWAITモジュールにおいて、投入異常非監視タイマ設定処理、すなわち、投入異常非監視タイマを設定するためのモジュールである。なお、E_SETTMモジュールは、メインROM500bの別領域(2000H~3FBFH)に配される。
メインCPU500aは、メインROM500bから使用領域のプログラムを読み出し、読み出したプログラムを遂行し、任意の処理において、サブルーチンとして別領域のE_SETTMモジュールを呼び出し、E_SETTMモジュールを遂行する。E_SETTMモジュールでは、投入異常非監視タイマを設定する。
図208は、E_SETTMモジュールの具体的な処理を示したフローチャートである。ここでは、任意の処理として、図89のステップS2200-11や図95のステップS2800-39で示したエラーウェイト処理を実行するERRWAITモジュールにおいて、ブロッカー閉塞処理を実行するBLKSHUTモジュールの一部を挙げて説明する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。
メインCPU500aは、図208(a)のように、任意の処理を実行する。メインCPU500aは、ブロッカー状態を確認して、出力ポート4イメージのビット3(ブロッカーソレノイド出力ビット番号)が0ではない場合に、別領域のE_SETTMモジュールを呼び出す。このため、メインCPU500aは、まず、割込を禁止し(S1)、サブルーチンとして別領域のE_SETTMモジュールを呼び出す(S2)。
メインCPU500aは、図208(b)のように、E_SETTMモジュールにおいて、汎用レジスタ(Aレジスタ、Bレジスタ、Cレジスタ、Dレジスタ、Eレジスタ、Hレジスタ、Lレジスタ、Fレジスタ)を退避する(S3)。そして、メインCPU500aは、初期値としての投入異常非監視タイマ値をAレジスタに設定し(S4)、そのAレジスタの値を所定のアドレス(投入異常非監視タイマ)が示す値に格納して、投入異常非監視タイマを設定する(S5)。かかる処理が完了すると、メインCPU500aは、汎用レジスタを復帰させ(S6)、割込を許可し(S7)、当該E_SETTMモジュールを終了して1段上のルーチンに戻る(S8)。
ここで、E_SETTMモジュールは、遊技機の公正さを担保しつつ、使用領域と別領域とで適切に役割分担するための、上述した(1)~(6)の条件を全て満たすように設計されている。
図209は、E_SETTMモジュールを実現するためのコマンドの一例を説明するための説明図である。このうち、図209(a)は、E_SETTMモジュールを呼び出す任意の処理のコマンド群を示し、図209(b)は、E_SETTMモジュールのコマンド群を示す。図208で示したフローチャートは、例えば、図209に示したプログラムによって実現される。
図209(a)の1行目のコマンド「DI」によって、割込が禁止される。かかる1行目のコマンドが、図208(a)のステップS1に対応する。2行目のコマンド「CALL E_SETTM」によって、サブルーチンとしてE_SETTMモジュールが呼び出される。かかる2行目のコマンドが、図208(a)のステップS2に対応する。
図209(b)の1行目の指標「E_SETTM:」は、当該E_SETTMモジュールの先頭アドレスを示す。2行目のコマンド「EX AF,AF’」によって、ペアレジスタAFの値と裏レジスタであるペアレジスタAF’の値とが入れ替わり、ペアレジスタAFの値が退避される。3行目のコマンド「EXX」によって、ペアレジスタBC、DE、HLの値と裏レジスタであるペアレジスタBC’、DE’、HL’の値とが入れ替わり、ペアレジスタBC、DE、HLの値が退避される。かかる2、3行目のコマンドが、図208(b)のステップS3に対応する。
図209(b)の4行目のコマンド「LD A,@MDL_WAT_TMR」によって、固定値「@MDL_WAT_TMR」、すなわち、投入異常非監視タイマ値(初期値)としての250.32msecに相当する(252/6+1)がAレジスタに読み出される。かかる4行目のコマンドが、図208(b)のステップS4に対応する。5行目のコマンド「LD (_EX_SLTM),A」によって、投入異常非監視タイマとしての変数「_EX_SLTM」にAレジスタの値を格納する。かかる5行目のコマンドが、図208(b)のステップS5に対応する。こうして、投入異常非監視タイマに投入異常非監視タイマ値を設定することが可能となる。
図209(b)の6行目のコマンド「EXX」によって、ペアレジスタBC、DE、HLの値と裏レジスタであるペアレジスタBC’、DE’、HL’の値とが入れ替わり、ペアレジスタBC、DE、HLの値が復帰する。7行目のコマンド「EX AF,AF’」によって、ペアレジスタAFの値と裏レジスタであるペアレジスタAF’の値とが入れ替わり、ペアレジスタAFの値が復帰する。かかる6、7行目のコマンドが、図208(b)のステップS6に対応する。図209(b)の8行目のコマンド「EI」によって、割込が許可される。なお、ここでは、サブルーチンから戻る前にコマンド「EI」を行っても適切に割込が許可される。したがって、サブルーチン内にコマンド「EI」を記述することで、使用領域の容量を確保することが可能となる。かかる8行目のコマンドが、図208(b)のステップS7に対応する。そして、9行目のコマンド「RET」によって、1段上のルーチンに戻る。かかる9行目のコマンドが、図208(b)のステップS8に対応する。こうして、別領域において投入異常非監視タイマを設定することが可能となる。
このように、図209(a)に示したBLKSHUTモジュールと図209(b)に示したE_SETTMモジュールの総コマンドサイズは、図209(a)の1行目のコマンド「DI」1バイト+2行目のコマンド「CALL E_SETTM」3バイト+図209(b)の2行目のコマンド「EX AF,AF’」1バイト+3行目のコマンド「EXX」1バイト+4行目のコマンド「LD A,@MDL_WAT_TMR」2バイト+5行目のコマンド「LD (_EX_SLTM),A」4バイト+6行目のコマンド「EXX」1バイト+7行目のコマンド「EX AF,AF’」1バイト+8行目のコマンド「EI」1バイト+9行目のコマンド「RET」1バイト=16バイトであり、総実行サイクルは、図209(a)の1行目1サイクル+2行目5サイクル+図209(b)の2行目1サイクル+3行目1サイクル+4行目2サイクル+5行目4サイクル+6行目1サイクル+7行目1サイクル+8行目1サイクル+9行目3サイクル=20サイクルとなる。かかるE_SETTMモジュールを設けることによって、上述した各モジュール内で投入異常非監視タイマを設定することなく、コマンドサイズ3バイトのコマンド「CALL E_SETTM」で賄うことができるので、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図210は、E_SETTMモジュールを実現するためのコマンドの他の例を説明するための説明図である。ここでは、図209(a)のE_SETTMモジュールを呼び出す任意の処理のコマンド群を、図210(a)のE_SETTMモジュールを呼び出す任意の処理のコマンド群に置き換え、図209(b)のE_SETTMモジュールのコマンド群を、図210(b)のE_SETTMモジュールのコマンド群に置き換えている。
図210(a)の1行目のコマンド「CALLEX E_SETTM」によって、サブルーチンとしてE_SETTMモジュールが呼び出される。かかる1行目のコマンドが、図208(a)のステップS2に対応する。
ここで、コマンド「CALLEX mn」は、コマンド「CALL mn」同様、固定値mnで示される先頭アドレスを有するサブルーチンを呼び出すコマンドである。ただし、コマンド「CALLEX mn」は、コマンド「CALL mn」のように、単にサブルーチンを呼び出すだけでなく、複数の機能を有している。例えば、当該コマンドを実行することで、自動的に、ノンマスカブル割込(NMI)およびマスカブル割込(INT)を禁止し、レジスタのバンクを第1レジスタバンク726から第2レジスタバンク728に切り換えてから固定値mnで示される先頭アドレスを有するサブルーチンを呼び出す。したがって、割込に関するコマンド「DI」や、退避に関するコマンド「EX AF,AF’」、「EXX」(または、コマンド「PUSH」)を要さない。したがって、図210(a)の1行目のコマンド「CALLEX E_SETTM」は、図208(a)のステップS2のみならず、図208(a)のステップS1および図208(b)のステップS3にも対応する。かかるコマンドのコマンドサイズは「2」であり、実行サイクルは「4」である。
ただし、コマンド「CALLEX mn」には、所定の制限がある。例えば、呼び出し先アドレスがアドレスマップ上の2000H~20FFHの範囲であれば、コマンドのコマンドサイズは「2」であり、実行サイクルは「4」であるが、それ以外の範囲では、コマンドのコマンドサイズは「4」であり、実行サイクルは「6」となる。したがって、コマンドの短縮化を図るため、本実施形態では、呼び出し先アドレス、例えば、「E_SETTM」が2000H~20FFH内に含まれるように配置する。
図210(b)の1行目の指標「E_SETTM:」は、当該E_SETTMモジュールの先頭アドレスを示す。2行目のコマンド「LD A,@MDL_WAT_TMR」によって、固定値「@MDL_WAT_TMR」、すなわち、投入異常非監視タイマ値(初期値)としての250.32msecに相当する(252/6+1)がAレジスタに読み出される。かかる2行目のコマンドが、図208(b)のステップS4に対応する。3行目のコマンド「LD (_EX_SLTM),A」によって、投入異常非監視タイマとしての変数「_EX_SLTM」にAレジスタの値を格納する。かかる3行目のコマンドが、図208(b)のステップS5に対応する。こうして、投入異常非監視タイマに投入異常非監視タイマ値を設定することが可能となる。
図210(b)の4行目のコマンド「RETEX」によって、1段上のルーチンに戻る。かかる4行目のコマンドが、図208(b)のステップS8に対応する。こうして、別領域において投入異常非監視タイマを設定することが可能となる。
ここで、コマンド「RETEX」は、コマンド「RET」同様、1段上のルーチンに戻るコマンドである。ただし、コマンド「RETEX」は、コマンド「CALLEX mn」とペアで用いられることが多く、コマンド「RET」のように、単にサブルーチンから戻るだけでなく、複数の機能を有している。例えば、当該コマンドを実行することで、自動的に、レジスタのバンクを第2レジスタバンク728から第1レジスタバンク726に切り換え、割込を許可してから1段上のルーチンに戻る。したがって、復帰に関するコマンド「EXX」、「EX AF,AF’」(または、コマンド「POP」)や、割込に関するコマンド「EI」を要さない。したがって、図210(b)の4行目のコマンド「RETEX」は、図208(b)のステップS8のみならず、図208(b)のステップS6およびステップS7にも対応する。かかるコマンドのコマンドサイズは「2」であり、実行サイクルは「5」である。
図210(a)に示したBLKSHUTモジュールと図210(b)に示したE_SETTMモジュールの総コマンドサイズは、図210(a)の1行目のコマンド「CALLEX E_SETTM」2バイト+図210(b)の2行目のコマンド「LD A,@MDL_WAT_TMR」2バイト+3行目のコマンド「LD (_EX_SLTM),A」4バイト+4行目のコマンド「RETEX」2バイト=10バイトであり、総実行サイクルは、図210(a)の1行目4サイクル+図210(b)の2行目2サイクル+3行目4サイクル+4行目5サイクル=15サイクルとなる。したがって、図209の場合と比べ、総コマンドサイズが6バイト削減され、総実行サイクルも少なくとも5サイクル削減される。かかるE_SETTMモジュールによって、コマンドの更なる短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図209と図210とを比較して理解できるように、図209において8行(図209(a)の1、2行目および図209(b)の2、3、6~9行目)を占有していたコマンド群を、図210においては、2行(図210(a)の1行目および図210(b)の4行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
かかるコマンド「CALLEX」は、上述したBLKSHUTモジュールのみならず、様々なモジュールに採用することができる。また、スロットマシンのみならず、パチンコ機における、例えば、DYM_OUTモジュール等にも採用することができる。
図211、図212は、DYM_OUTモジュールを説明するための説明図である。図26のステップS400-5で示したDYM_OUTモジュールは、第1特別図柄表示器160、第2特別図柄表示器162、第1特別図柄保留表示器164、第2特別図柄保留表示器166、普通図柄表示器168、普通図柄保留表示器170、右打ち報知表示器172、性能表示モニタ184を点灯制御するダイナミックポート出力処理を実行する。
図211(a)の1行目のコマンド「DI」によって、割込が禁止される。2行目のコマンド「CALL E_DMOUT」によって、サブルーチンとしてE_DMOUTモジュールが呼び出される。
図211(b)の1行目の指標「E_DMOUT:」は、当該E_DMOUTモジュールの先頭アドレスを示す。2行目のコマンド「EX AF,AF’」によって、ペアレジスタAFの値と裏レジスタであるペアレジスタAF’の値とが入れ替わり、ペアレジスタAFの値が退避される。3行目のコマンド「EXX」によって、ペアレジスタBC、DE、HLの値と裏レジスタであるペアレジスタBC’、DE’、HL’の値とが入れ替わり、ペアレジスタBC、DE、HLの値が退避される。4行目のコマンド「LD HL,R_ERW_IOB」によって識別セグ出力要求バッファのアドレス「R_ERW_IOB」をHLレジスタに設定する。5行目のコマンド「LD A,(R_COM_CNT)」によって、「R_COM_CNT」で示されるアドレスに格納された1バイト値(コモンカウンタ)がAレジスタに読み出される。ここで、コモンカウンタはLEDダイナミック点灯制御のコモン番号を判定するために使用され、コモン番号を示す値が格納されている。6行目のコマンド「LD A,(HL+A)」によって、HLレジスタで示されるアドレスにAレジスタの値を加算した(オフセットさせた)アドレスに格納された1バイト値(表示データ)がAレジスタに読み出される。7行目のコマンド「OUT (@OTC_PRT),A」によって、Uレジスタの値をアドレスの上位1バイトとし、出力ポート12(内部レジスタI/Oポート)のアドレスの下位1バイトを示す固定値「@OTC_PRT」を下位1バイトとし、そのアドレスに、Aレジスタの値を出力する。8行目のコマンド「EXX」によって、ペアレジスタBC、DE、HLの値と裏レジスタであるペアレジスタBC’、DE’、HL’の値とが入れ替わり、ペアレジスタBC、DE、HLの値が復帰する。9行目のコマンド「EX AF,AF’」によって、ペアレジスタAFの値と裏レジスタであるペアレジスタAF’の値とが入れ替わり、ペアレジスタAFの値が復帰する。10行目のコマンド「EI」によって、割込が許可される。なお、ここでは、サブルーチンから戻る前にコマンド「EI」を行っても適切に割込が許可される。したがって、サブルーチン内にコマンド「EI」を記述することで、使用領域の容量を確保することが可能となる。そして、11行目のコマンド「RET」によって、1段上のルーチンに戻る。こうして、別領域においてダイナミックポート出力処理を実行することができる。
ここで、コマンド「CALLEX」への置き換えを行うと、図211のコマンド群を図212のように変更することができる。図212(a)の1行目のコマンド「CALLEX E_DMOUT」によって、サブルーチンとしてE_DMOUTモジュールが呼び出される。ここでは、呼び出し先アドレス、例えば、「E_DMOUT」が2000H~20FFH内に含まれるように配置されている。
図212(b)の1行目の指標「E_DMOUT:」は、当該E_DMOUTモジュールの先頭アドレスを示す。2行目のコマンド「LD HL,R_ERW_IOB」によって識別セグ出力要求バッファのアドレス「R_ERW_IOB」をHLレジスタに設定する。3行目のコマンド「LD A,(R_COM_CNT)」によって、「R_COM_CNT」で示されるアドレスに格納された1バイト値(コモンカウンタ)がAレジスタに読み出される。4行目のコマンド「LD A,(HL+A)」によって、HLレジスタで示されるアドレスにAレジスタの値を加算した(オフセットさせた)アドレスに格納された1バイト値(表示データ)がAレジスタに読み出される。5行目のコマンド「OUT (@OTC_PRT),A」によって、Uレジスタの値をアドレスの上位1バイトとし、出力ポート12(内部レジスタI/Oポート)のアドレスの下位1バイトを示す固定値「@OTC_PRT」を下位1バイトとし、そのアドレスに、Aレジスタの値を出力する。6行目のコマンド「RETEX」によって、1段上のルーチンに戻る。こうして、図211同様、別領域においてダイナミックポート出力処理を実行することができる。
このように、図211(a)に示したDYM_OUTモジュールと図211(b)に示したE_DMOUTモジュールの総コマンドサイズは、図211(a)の1行目のコマンド「DI」1バイト+2行目のコマンド「CALL E_DMOUT」3バイト+図211(b)の2行目のコマンド「EX AF,AF’」1バイト+3行目のコマンド「EXX」1バイト+4行目のコマンド「LD HL,R_ERW_IOB」3バイト+5行目のコマンド「LD A,(R_COM_CNT)」3バイト+6行目のコマンド「LD A,(HL+A)」3バイト+7行目のコマンド「OUT (@OTC_PRT),A」2バイト+8行目のコマンド「EXX」1バイト+9行目のコマンド「EX AF,AF’」1バイト+10行目のコマンド「EI」1バイト+11行目のコマンド「RET」1バイト=21バイトであり、総実行サイクルは、図211(a)の1行目1サイクル+2行目5サイクル+図211(b)の2行目1サイクル+3行目1サイクル+4行目3サイクル+5行目4サイクル+6行目4サイクル+7行目3サイクル+8行目1サイクル+9行目1サイクル+10行目1サイクル+11行目3サイクル=28サイクルとなる。
一方、図212(a)に示したDYM_OUTモジュールと図212(b)に示したE_DMOUTモジュールの総コマンドサイズは、図212(a)の1行目のコマンド「CALLEX E_DMOUT」2バイト+図212(b)の2行目のコマンド「LD HL,R_ERW_IOB」3バイト+3行目のコマンド「LD A,(R_COM_CNT)」3バイト+4行目のコマンド「LD A,(HL+A)」3バイト+5行目のコマンド「OUT (@OTC_PRT),A」2バイト+6行目のコマンド「RETEX」2バイト=15バイトであり、総実行サイクルは、図212(a)の1行目4サイクル+図212(b)の2行目3サイクル+3行目4サイクル+4行目4サイクル+5行目3サイクル+6行目5サイクル=23サイクルとなる。したがって、図211の場合と比べ、総コマンドサイズが6バイト削減され、総実行サイクルも5サイクル削減される。かかるE_DMOUTモジュールによって、コマンドの更なる短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
ところで、図208~図210を用いて説明したように、コマンド「CALLEX mn」は、呼び出し先アドレスがアドレスマップ上の2000H~20FFHの範囲であれば、コマンドのコマンドサイズは「2」であり、実行サイクルは「4」であるが、それ以外の範囲では、コマンドのコマンドサイズは「4」であり、実行サイクルは「6」となる。したがって、呼び出し先アドレスは全て2000H~20FFHの範囲に配置するのが望ましい。しかし、2000H~20FFHでは、記述できるバイト数が256バイトしかないので、かかる範囲にサブルーチンをそのまま記述するとなると、サブルーチンの数が制限されてしまう。例えば、比較的コマンドサイズが小さいE_SETTMモジュールであっても、図210(b)の2行目のコマンド「LD A,@MDL_WAT_TMR」2バイト+3行目のコマンド「LD (_EX_SLTM),A」4バイト+4行目のコマンド「RETEX」2バイト=8バイトを占有するので、サブルーチンの数を多く配置することができなくなる。
そこで、本実施形態では、アドレスマップ上の2000H~20FFHの範囲には、実質的に、移動に関するコマンド「JP mn」のみを配置し、サブルーチンの本体は移動先に配置する。かかるコマンド「JP mn」のコマンドサイズは「3」なので、アドレスマップ上の2000H~20FFHの範囲にコマンド「JP mn」を並置することで、256/3=86個のモジュールをサブルーチンとして呼び出すことが可能となる。
なお、コマンド「JP mn」の代わりにコマンドサイズ「3」のコマンド「CALL mn」を用いることも可能であるが、その場合、コマンド「CALL mn」の後に、コマンドサイズ「2」のコマンド「RETEX」を配置する必要が生じるので、コマンド「JP mn」よりサブルーチンの数が制限されることとなる。したがって、コマンド「JP mn」を採用するのが望ましい。以下、かかる内容を反映したE_SETTMモジュールの具体的な処理を説明する。
図213は、E_SETTMモジュールの具体的な処理を示したフローチャートである。ここでは、任意の処理として、図208同様、ブロッカー閉塞処理を実行するBLKSHUTモジュールの一部を挙げて説明する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。
メインCPU500aは、図213(a)のように、任意の処理を実行する。メインCPU500aは、別領域のサブルーチンとしてRRE01モジュールを呼び出す(S1)。
続いて、メインCPU500aは、図213(b)のように、RRE01モジュールにおいて、有意な処理を行うことなく、E_SETTMモジュールに移動する(S2)。このように、RRE01モジュールは、E_SETTMモジュールに移動するためのモジュールであり、アドレスマップ上の2000H~20FFHの範囲に配置される。こうして、サブルーチンの数を多く配置することができる。
メインCPU500aは、図213(c)のように、E_SETTMモジュールにおいて、投入異常非監視タイマ値をAレジスタに設定し(S3)、そのAレジスタの値を所定のアドレス(投入異常非監視タイマ)が示す値に格納して、投入異常非監視タイマを設定する(S4)。かかる処理が完了すると、メインCPU500aは、当該E_SETTMモジュールを終了して1段上のルーチンに戻る(S5)。かかるE_SETTMモジュールは、RRE01モジュールの移動先なので、アドレスマップの制限を受けない。したがって、別領域のうちの2100H~3FBFHの範囲に任意に配置することができるので、総コマンドサイズがある程度大きくとも許容される。
図214は、E_SETTMモジュールを実現するためのコマンドのさらに他の例を説明するための説明図である。ここでは、図214(b)のように、新たに、E_SETTMモジュールに移動するためのRRE01モジュールを設けている。
図214(a)の1行目のコマンド「CALLEX PRE01」によって、サブルーチンとしてE_SETTMモジュールではなく、RRE01モジュールが呼び出される。かかる1行目のコマンドが、図213(a)のステップS1に対応する。なお、コマンド「CALLEX PRE01」によって、割込の禁止、および、汎用レジスタの退避も実行される。
図214(b)の1行目の指標「PRE01:」は、当該PRE01モジュールの先頭アドレスを示す。2行目のコマンド「JP E_SETTM」によって、E_SETTMモジュール本体へ移動する。かかるコマンドが、図213(b)のステップS2に対応する。
なお、コマンド「CALLEX mn」を通じて複数のサブルーチンを呼び出す場合、その複数のサブルーチンに関する呼び出しアドレスを示す指標(例えば、「PRE01:」と、コマンド「JP mn」とを、2000H~20FFHの範囲に連続して並置する。こうすることで、2000H~20FFHの範囲を有効利用し、サブルーチンの数を多く配置することができる。
図214(c)の1行目の指標「E_SETTM:」は、当該E_SETTMモジュールの先頭アドレスを示す。2行目のコマンド「LD A,@MDL_WAT_TMR」によって、固定値「@MDL_WAT_TMR」、すなわち、投入異常非監視タイマ値(初期値)としての250.32msecに相当する(252/6+1)がAレジスタに読み出される。かかる2行目のコマンドが、図213(c)のステップS3に対応する。3行目のコマンド「LD (_EX_SLTM),A」によって、投入異常非監視タイマとしての変数「_EX_SLTM」にAレジスタの値を格納する。かかる3行目のコマンドが、図213(c)のステップS4に対応する。こうして、投入異常非監視タイマに投入異常非監視タイマ値を設定することが可能となる。
図214(c)の4行目のコマンド「RETEX」によって、1段上のルーチンに戻る。かかる4行目のコマンドが、図213(c)のステップS5に対応する。こうして、別領域において投入異常非監視タイマを設定することが可能となる。なお、コマンド「RETEX」によって、汎用レジスタの復帰、および、割込の許可も実行される。
かかる図214の例では、図210の場合と比べ、コマンド「JP E_SETTM」の分だけ、総コマンドサイズおよび総実行サイクルが大きくなる。しかし、コマンド「JP E_SETTM」を経由してサブルーチン本体に移動させる構成とすることで、2000H~20FFHの範囲にサブルーチンを多く配することができ、サブルーチン数の制限を広げ、さらに、サブルーチン自体のコマンドサイズの制限が緩和されるので、結果、コマンドの更なる短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
なお、このように、2000H~20FFHの範囲にコマンド「JP mn」のみを配置しても、配置できるサブルーチンの数が足りない場合、すなわち、サブルーチンが86個以上ある場合、総コマンドサイズが小さいモジュールを2100H~217FHの範囲(128バイトの範囲)に配置し、コマンドサイズ「3」のコマンド「JP mn」ではなく、近距離の移動に適しているコマンドサイズ「2」のコマンド「JR mn」を用いるとしてもよい。こうすることで、2000H~20FFHの範囲に、さらに多くのコマンド「JR mn」を配置することが可能となる。
<コマンド「ICPLMQA」、「ICPLMQ」>
RAM_INCモジュールは、RAM加算処理、すなわち、メインRAM500cの1バイト変数を、所定数を上限に、1だけインクリメントするためのモジュールである。なお、RAM_INCモジュールは、インクリメントのみならず、インクリメントした結果、キャリーフラグを設定している。また、RAM_INCモジュールは、汎用モジュールとして利用することもできる。
かかるRAM_INCモジュールは、複数のモジュールからサブルーチンとして呼び出される。例えば、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、本前兆中処理(AT状態=「3」)を実行するHID_LOTモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、終了画面中処理(AT状態=「4」)を実行するFIN_LOTモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、REG中処理(AT状態=「6」)を実行するREG_LOTモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、BIG中処理(AT状態=「7」)を実行するBIT_LOTモジュール等から呼び出される。
メインCPU500aは、メインROM500bからプログラムを読み出し、読み出したプログラムを遂行し、任意の処理において、メインRAM500cに保持された1バイト値をインクリメントする。
図215は、RAM_INCモジュールの具体的な処理を示したフローチャートである。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。また、当該RAM_INCモジュールの説明中、所定レジスタはAレジスタであり、所定数は上限値であり、特定アドレスはインクリメントの対象となるアドレスである。
メインCPU500aは、図215(a)のように、任意の処理において、インクリメント対象となるアドレスをHLレジスタに設定する(S1)。そして、メインCPU500aは、HLレジスタで示されるアドレスに格納された1バイト値をインクリメントし(S2)、インクリメントした値をHLアドレスで示されるアドレスに格納して、値を更新する(S3)。ただし、ここでは、上限値(所定数)が設定され、インクリメントした結果が、その上限値を超えないようになっている。
図216、図217は、RAM_INCモジュールを実現するためのコマンドの一例を説明するための説明図である。図215で示したフローチャートは、例えば、図216に示したプログラムによって実現される。
図216の1行目の指標「RAM_INC:」は、当該RAM_INCモジュールの先頭アドレスを示す。2行目のコマンド「LDQ HL,LOW _AT_SET」によって、Qレジスタの値をHレジスタに読み出し、アドレス「_AT_SET」の下位1バイトの値をLレジスタに読み出す。かかる2行目のコマンドが、図215のステップS1に対応する。3行目のコマンド「LD A,(HL)」によって、図217に示すように、HLレジスタで示されるアドレスに格納された1バイト値(例えば、02H)がAレジスタに読み出される。図216の4行目のコマンド「INC A」によって、図217に示すようにAレジスタの値が、例えば、02Hから03Hに1だけインクリメントされる。なお、汎用性を持たせるため、3行目のコマンド「LD A,(HL)」および4行目のコマンド「INC A」の代わりに、コマンド「LD A,1」およびコマンド「ADD A,(HL)」を用いることもできる。この場合、Aレジスタに格納する「1」の値を変えることで、インクリメントする値を1以外に変更することができる。
図216の5行目のコマンド「JCP C,A,5,RAM_INC01」によって、Aレジスタの値と、上限値「5」とを比較し、その結果、5未満であれば(キャリーフラグが立てば)、アドレス「RAM_INC01」に移動する。こうして、Aレジスタの値が上限値の5未満であれば、次の処理を省略して7行目の指標「RAM_INC01」に移動することができる。6行目のコマンド「LD A,5」によって、Aレジスタに上限値「5」を格納する。これは、4行目のコマンド「INC A」によって、Aレジスタの値が5を超えた場合、強制的にAレジスタの値を5に上書きすることで、インクリメントした結果を5以下とするためのである。なお、ここでは、インクリメント前のAレジスタの値が4の場合、すなわち、Aレジスタの値が4から5にインクリメントされた場合、既にAレジスタの値は5となっているので5に更新する必要はないが、そのことを判定する処理を追加すると処理負荷が高まるので、汎用性を優先し、5を超えた場合同様、強制的にAレジスタの値を5に更新することとしている。かかる3~6行目のコマンドが、図215のステップS2に対応する。
図216の7行目の指標「RAM_INC01」は、5行目のコマンド「JCP C,A,5,RAM_INC01」の移動先アドレスを示す。8行目のコマンド「LD (HL),A」によって、図217に示すように、Aレジスタの値(例えば、03H)がHLレジスタで示されるアドレスに格納される。かかる8行目のコマンドが、図215のステップS3に対応する。こうして、メインRAM500cの1バイト変数を、所定数を上限に、1だけインクリメントしつつ、Aレジスタにインクリメント後の値を保持すること(Aレジスタの値をその後の処理で利用すること)が可能となる。
このように、図216に示したRAM_INCモジュールのコマンドの総コマンドサイズは、2行目のコマンド「LDQ HL,LOW _AT_SET」2バイト+3行目のコマンド「LD A,(HL)」1バイト+4行目のコマンド「INC A」1バイト+5行目のコマンド「JCP C,A,5,RAM_INC01」3バイト+6行目のコマンド「LD A,5」2バイト+8行目のコマンド「LD (HL),A」1バイト=10バイトとなり、総実行サイクルは、2行目2サイクル+3行目2サイクル+4行目1サイクル+5行目4サイクル+6行目2サイクル+8行目2サイクル=13サイクルとなる。かかるRAM_INCモジュールを設けることによって、1バイト変数を、画一的かつ容易にインクリメントできるので、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図218は、RAM_INCモジュールを実現するためのコマンドの他の例を説明するための説明図である。ここでは、図216のRAM_INCモジュールのコマンド群を、図218のRAM_INCモジュールのコマンド群に置き換えている。
図218の1行目の指標「RAM_INC:」は、当該RAM_INCモジュールの先頭アドレスを示す。2行目のコマンド「ICPLMQA (LOW _AT_SET)、5」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_AT_SET」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレス(インクリメント対象となるアドレス)に格納された1バイト値と、上限値「5」とを比較し、その結果、5未満であれば(キャリーフラグが立てば)、インクリメント対象となるアドレスに格納された1バイト値を1だけインクリメントして、Aレジスタに格納するとともに、インクリメント対象となるアドレスに格納された1バイト値を更新する。また、インクリメント後の値が5以上であれば(キャリーフラグが立っていなければ)、Aレジスタに上限値「5」を格納するとともに、インクリメント対象となるアドレスに格納された1バイト値を上限値「5」に更新する。かかる2行目のコマンドが、図215のステップS1~S3に対応する。こうして、メインRAM500cの1バイト変数を、所定数を上限に、1だけインクリメントしつつ、Aレジスタにインクリメント後の値を保持すること(Aレジスタの値をその後の処理で利用すること)が可能となる。
ここで、コマンド「ICPLMQA (k)、n」は、Qレジスタの値をアドレスの上位1バイトとし、値kをアドレスの下位1バイトとし、その対象アドレスに格納された1バイト値と、上限値nとを比較し、その結果、n未満であれば、対象アドレスに格納された1バイト値を1だけインクリメントして、Aレジスタに格納するとともに、対象アドレスに格納された1バイト値を更新し、n以上であれば、Aレジスタに上限値nを格納するとともに、対象アドレスに格納された1バイト値を上限値nに更新するコマンドである。かかるコマンドサイズは「4」であり、実行サイクルは「7」である。
図218のRAM_INCモジュールのコマンドの総コマンドサイズは、2行目のコマンド「ICPLMQA (LOW _AT_SET)、5」4バイト=4バイトとなり、総実行サイクルは、2行目7サイクル=7サイクルとなる。したがって、図216の場合と比べ、総コマンドサイズが6バイト削減され、総実行サイクルが6サイクル削減されている。かかるRAM_INCモジュールによって、コマンドの更なる短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図216と図218とを比較して理解できるように、図216において7行(2~8行目)を占有していたコマンド群を、図218においては1行(2行目)で表すことができ、コマンド数自体の削減、および、設計負荷の軽減を図ることが可能となる。
図219は、RAM_INCモジュールを実現するためのコマンドのさらに他の例を説明するための説明図である。図218を用いて説明したRAM_INCモジュールでは、メインRAM500cの1バイト変数を、所定数を上限に、1だけインクリメントしつつ、Aレジスタにインクリメント後の値を保持する例を挙げた。しかし、処理によっては、Aレジスタにその結果を残すことなく、メインRAM500cの1バイト変数を、所定数を上限に1だけインクリメントしさえすればよい場合もある。ここでは、Aレジスタを更新することなく、1バイト変数を1だけインクリメントする例を挙げる。
図219の1行目の指標「RAM_INC:」は、当該RAM_INCモジュールの先頭アドレスを示す。2行目のコマンド「ICPLMQ (LOW _AT_SET)、5」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_AT_SET」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレス(インクリメント対象となるアドレス)に格納された1バイト値と、上限値「5」とを比較し、その結果、5未満であれば(キャリーフラグが立てば)、インクリメント対象となるアドレスに格納された1バイト値を1だけインクリメントして更新する。また、インクリメントされた値が5以上であれば(キャリーフラグが立っていなければ)、インクリメント対象となるアドレスに格納された1バイト値を上限値「5」に更新する。かかる2行目のコマンドが、図215のステップS1~S3に対応する。こうして、メインRAM500cの1バイト変数を、所定数を上限に、1だけインクリメントすることが可能となる。
ここで、コマンド「ICPLMQ (k)、n」は、Qレジスタの値をアドレスの上位1バイトとし、値kをアドレスの下位1バイトとし、その対象アドレスに格納された1バイト値と、上限値nとを比較し、その結果、n未満であれば、対象アドレスに格納された1バイト値を1だけインクリメントして更新し、n以上であれば、対象アドレスに格納された1バイト値を上限値nに更新するコマンドである。かかるコマンドサイズは「4」であり、実行サイクルは「7」である。
図219のRAM_INCモジュールのコマンドの総コマンドサイズは、2行目のコマンド「ICPLMQ (LOW _AT_SET)、5」4バイト=4バイトとなり、総実行サイクルは、2行目7サイクル=7サイクルとなる。したがって、図216の場合と比べ、総コマンドサイズが6バイト削減され、総実行サイクルが6サイクル削減されている。かかるRAM_INCモジュールによって、コマンドの更なる短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、ここでは、図216の例と比較して、Aレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図216の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
また、図216と図219とを比較して理解できるように、図216において7行(2~8行目)を占有していたコマンド群を、図219においては1行(2行目)で表すことができ、コマンド数自体の削減、および、設計負荷の軽減を図ることが可能となる。
<コマンド「LDINTQR」>
TABLSETモジュールは、テーブルセット処理、すなわち、メインRAM500cの変数に所定の値(初期値)を設定するための汎用モジュールである。ここでは、TABLSETモジュールをメモリマップ上の0030Hに配置する例を挙げて説明する。
メインCPU500aは、メインROM500bからプログラムを読み出し、読み出したプログラムを遂行し、任意の処理において、サブルーチンとしてTABLSETモジュールを呼び出し、TABLSETモジュールを遂行する。TABLSETモジュールでは、メインROM500bのプログラムデータに記述された複数の1バイト値を、メインRAM500cのワークエリアにおいて変数として扱われる複数のデータを保持する領域に転送する。こうして、複数の変数の値が設定される。ここで、転送するデータの数を単にデータ数と言う。
図220は、TABLSETモジュールの具体的な処理を示したフローチャートである。ここでは、任意の処理として、図89のステップS2200-11や図95のステップS2800-39で示したエラーウェイト処理、すなわち、エラー表示、警告音要求およびエラー復帰待ちを実行するERRWAITモジュールの一部を挙げて説明する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。また、当該TABLSETモジュールの説明中、第1レジスタはBレジスタであり、第2レジスタはHLレジスタであり、第1レジスタおよび第2レジスタと異なるレジスタはAレジスタであり、所定値は「1」である。なお、所定値を任意に設定できるのは言うまでもない。
メインCPU500aは、図220(a)のように、任意の処理において、転送元となる1バイトデータ群の先頭アドレスをHLレジスタに設定する(S1)。そして、サブルーチンとしてTABLSETモジュールを呼び出す(S2)。
メインCPU500aは、図220(b)のように、TABLSETモジュールにおいて、BCレジスタを退避し(S3)、割込を禁止する(S4)。そして、メインCPU500aは、HLレジスタで示されるアドレスに格納された1バイト値をBレジスタに読み出す(S5)。かかる1バイト値はデータ数を示す。続いて、メインCPU500aは、HLレジスタに「1」を加えた値で示されるアドレスに格納された値で特定されるアドレスに、HLレジスタに「2」を加えた値で示されるアドレスに格納された値を転送し、HLレジスタの値に「2」を加えて次に転送するアドレスを設定する(S6)。続いて、メインCPU500aは、Bレジスタの値をデクリメント(「1」減算)し、デクリメントした結果が0であるか否か判定する(S7)。ここで、デクリメントした結果が0でなければ(S7におけるNO)、ステップS6からの処理を繰り返し、デクリメントした結果が0であれば(S7におけるYES)、割込を許可し(S8)、BCレジスタを復帰させて(S9)、当該TABLSETモジュールを終了して1段上のルーチンに戻る(S10)。
図221、図222は、TABLSETモジュールを実現するためのコマンドの一例を説明するための説明図である。このうち、図221(a)は、TABLSETモジュールを呼び出す任意の処理のコマンド群を示し、図221(b)は、TABLSETモジュールのコマンド群を示し、図221(c)は、メインROM500bのプログラムデータにおける1バイトデータ群の配置を示し、図221(d)は、メインRAM500cのワークエリアにおける1バイトデータ群の配置を示す。図220で示したフローチャートは、例えば、図221に示したプログラムによって実現される。
図221(a)の1行目のコマンド「LD HL,T_ERR_RCV」によって、転送元となる1バイトデータ群の先頭アドレス「T_ERR_RCV」をHLレジスタに設定する。かかる1行目のコマンドが、図220(a)のステップS1に対応する。そして、2行目のコマンド「RST TABLSET」によって、サブルーチンとしてTABLSETモジュールが呼び出される。かかる2行目のコマンドが、図220(a)のステップS2に対応する。
図221(b)の1行目の指標「TABLSET:」は、当該TABLSETモジュールの先頭アドレスを示す。2行目のコマンド「PUSH BC」によって、BCレジスタの値がスタック領域に退避される。かかる2行目のコマンドが、図220(b)のステップS3に対応する。3行目のコマンド「DI」によって割込が禁止される。かかる3行目のコマンドが、図220(b)のステップS4に対応する。
図221(b)の4行目のコマンド「LD B,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト値がBレジスタに読み出される。このとき、HLレジスタには、図221(a)で示したように、アドレス「T_ERR_RCV」が設定されている。したがって、図221(c)の2行目の1バイト値「(T_ERR_RCV_-T_ERR_RCV)/2」がデータ数(転送の繰り返し数)としてBレジスタに読み出されることとなる。なお、「T_ERR_RCV_」は、転送元となる1バイトデータ群の最終アドレスの次のアドレスであり、T_ERR_RCVは転送元となる1バイトデータ群の先頭アドレスなので、T_ERR_RCV_-T_ERR_RCVの値(データ数を示す1バイト値)の値が、1バイト値の総バイト数となり、その値を、アドレスと値との組み合わせ数である2で除算すると、データ数が導出される。図221(c)の例では、データ数は、9/2=4となる。かかる図221(b)の4行目のコマンドが、図220(b)のステップS5に対応する。
図221(b)の5行目の指標「TABLSET10:」は繰り返し処理の先頭アドレスを示す。6行目のコマンド「INLD AC,(HL)」および7行目のコマンド「LDQ (C),A」によって、HLレジスタに「1」を加えた値で示されるアドレスに格納された値で特定されるアドレスに、HLレジスタに「2」を加えた値で示されるアドレスに格納された値が格納され、HLレジスタの値に「2」が加えられて次に転送するアドレスが設定される。かかる6,7行目のコマンドが、図220(b)のステップS6に対応する。
例えば、HLレジスタがアドレス「T_ERR_RCV」の値であった場合、図221(c)の3行目における2バイト変数「_ERR_NUM」の下位1バイト値がCレジスタに格納され、図221(c)の3行目における「0」の値がAレジスタに格納される。
また、図221(b)の7行目のコマンド「LDQ (C),A」は、Qレジスタの値をアドレスの上位1バイトとし、Cレジスタの値をアドレスの下位1バイトとし、そのアドレスに、Aレジスタの値を格納するコマンドである。
例えば、Cレジスタの値、すなわち「_ERR_NUM」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに、Aレジスタの値、すなわち、「0」の値を格納する。
ここで、図221(c)、図221(d)において、変数「_ERR_NUM」は、エラー番号を示し、変数「_CRE_TMR」は、クレジットボタン検出タイマを示し、変数「_CRE_FLG」は、クレジットボタン検出フラグを示し、変数「_SNS_OLD」はメダル通過センサービット前回状態を示す。なお、図221(d)に示す変数の配置は図のように連続している必要はなく、離隔していてもよい。
続いて、図221(b)の8行目のコマンド「DJNZ TABLSET10」によって、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0でなければ、アドレス「TABLSET10」に移動し、デクリメントした結果が0であれば、当該コマンドの次のコマンドに処理を移す。ここでは、データ数が「4」なので、「TABLSET10」からの処理を4回繰り返すとBレジスタの値が0となる。かかる8行目のコマンドが、図220(b)のステップS7に対応する。
図221(b)の9行目のコマンド「EI」によって割込が許可される。かかる9行目のコマンドが、図220(b)のステップS8に対応する。10行目のコマンド「POP BC」によってスタック領域に退避されていたデータがBCレジスタに復帰される。かかる10行目のコマンドが、図220(b)のステップS9に対応する。そして、11行目のコマンド「RET」によって、1段上のルーチンに戻る。かかる11行目のコマンドが、図220(b)のステップS10に対応する。
こうして、図222に示すように、メインROM500bのプログラムデータに記述された複数の1バイト値(55H、77H、66H、22H)を、メインRAM500cのワークエリアにおける変数(「_ERR_NUM」、「_CRE_TMR」、「_CRE_FLG」、「_SNS_OLD」)に転送することが可能となる。
TABLSETモジュールは、複数のモジュールからサブルーチンとして呼び出される。例えば、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、本前兆中処理(AT状態=「3」)を実行するHID_LOTモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、終了画面中処理(AT状態=「4」)を実行するFIN_LOTモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、準備中処理(AT状態=「5」)を実行するPRE_LOTモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、REG中処理(AT状態=「6」)を実行するREG_LOTモジュール、図91におけるステップS2400-11で示した実行フラグ設定処理を実行するEXE_SETモジュールにおいて遊技状態および演出状態に応じて選択的に移行し、BIG中処理(AT状態=「7」)を実行するBIG_LOTモジュール、図85のステップS2020で示した設定値切り替え処理を実行するRANKSETモジュール、図91のステップS2400で示した図柄コード設定処理を実行するFGSETUPモジュール、図96のステップS2900で示した遊技移行処理を実行するGAMESETモジュール、図96のステップS2900-3で示した役物作動中処理を実行するJCGMSETモジュール等から呼び出される。
このように、図221(b)に示したTABLSETモジュールのコマンドの総コマンドサイズは、2行目のコマンド「PUSH BC」1バイト+3行目のコマンド「DI」1バイト+4行目のコマンド「LD B,(HL)」1バイト+6行目のコマンド「INLD AC,(HL)」2バイト+7行目のコマンド「LDQ (C),A」2バイト+8行目のコマンド「DJNZ TABLSET10」2バイト+9行目のコマンド「EI」1バイト+10行目のコマンド「POP BC」1バイト+11行目のコマンド「RET」1バイト=12バイトとなり、総実行サイクルは、2行目3サイクル+3行目1サイクル+4行目2サイクル+6行目4サイクル+7行目3サイクル+8行目3サイクル(または2サイクル)+9行目1サイクル+10行目3サイクル+11行目3サイクル=23サイクル(または22サイクル)となる。なお、括弧内のサイクル数は、コマンド「DJNZ TABLSET10」によって移動しなかった場合の実行サイクルを示している。かかるTABLSETモジュールを設けることによって、上述した各モジュール内でテーブルセット処理を行うことなく、コマンドサイズ1バイトのコマンド「RST TABLSET」で賄うことができるので、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
図223は、TABLSETモジュールを実現するためのコマンドの他の例を説明するための説明図である。ここでは、図221(b)のTABLSETモジュールのコマンド群を、図223(b)のTABLSETモジュールのコマンド群に置き換えており、他の、図221(a)のTABLSETモジュールを呼び出す任意の処理のコマンド群、図221(c)のメインROM500bのプログラムデータにおける1バイトデータ群、および、図221(d)のメインRAM500cのワークエリアにおける1バイトデータ群は、図223(a)、図223(c)、図223(d)として、そのまま用いている。ここでは、図223(a)、図223(c)、図223(d)のように、図221(a)、図221(c)、図221(d)と実質的に等しい処理についてはその説明を省略し、図223(b)の異なる処理のみを説明する。
図223(b)の1行目の指標「TABLSET:」は、当該TABLSETモジュールの先頭アドレスを示す。2行目のコマンド「PUSH BC」によって、BCレジスタの値がスタック領域に退避される。かかる2行目のコマンドが、図220(b)のステップS3に対応する。3行目のコマンド「DI」によって割込が禁止される。かかる3行目のコマンドが、図220(b)のステップS4に対応する。
図223(b)の4行目のコマンド「LD B,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト値がBレジスタに読み出される。このとき、HLレジスタには、図223(a)で示したように、アドレス「T_ERR_RCV」が設定されている。したがって、図223(c)の2行目の1バイト値「(T_ERR_RCV_-T_ERR_RCV)/2」がデータ数(転送の繰り返し数)としてBレジスタに読み出されることとなる。図223(c)の例では、データ数は4となる。かかる図223(b)の4行目のコマンドが、図220(b)のステップS5に対応する。
図223(b)の5行目のコマンド「INC HL」によって、HLレジスタの値が1だけインクリメントされる。6行目のコマンド「LDINTQR (HL)」によって、HLレジスタで示されるアドレスに格納された値で特定されるアドレスに、HLレジスタに「1」を加えた値で示されるアドレスに格納された値が転送され、HLレジスタの値に「2」を加えて次に転送するアドレスが設定され、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0になるまで、当該処理が繰り返される。かかる5、6行目のコマンドが、図220(b)のステップS6、S7に対応する。
ここで、コマンド「LDINTQR (HL)」は、Qレジスタの値をアドレスの上位1バイトとし、HLレジスタで示されるアドレスに格納された値をアドレスの下位1バイトとし、そのアドレスに、HLレジスタに「1」を加えた値で示されるアドレスに格納された値を転送し、HLレジスタの値に「2」を加えてHLレジスタの値を更新し、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0になるまで、値の転送を繰り返すコマンドである。かかるコマンドのコマンドサイズは「2」であり、実行サイクルは「5」である。
例えば、HLレジスタがアドレス「T_ERR_RCV」の値であった場合、Qレジスタの値をアドレスの上位1バイトとし、図223(c)の3行目における「_ERR_NUM」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに、図223(c)の3行目における「0」の値が転送され、HLレジスタの値に「2」が加えられ、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0になるまで、すなわち、4回転送が繰り返される。
続いて、図223(b)の7行目のコマンド「EI」によって割込が許可される。かかる7行目のコマンドが、図220(b)のステップS8に対応する。8行目のコマンド「POP BC」によってスタック領域に退避されていたデータがBCレジスタに復帰される。かかる8行目のコマンドが、図220(b)のステップS9に対応する。そして、9行目のコマンド「RET」によって、1段上のルーチンに戻る。かかる9行目のコマンドが、図220(b)のステップS10に対応する。
図223(b)のTABLSETモジュールのコマンドの総コマンドサイズは、2行目のコマンド「PUSH BC」1バイト+3行目のコマンド「DI」1バイト+4行目のコマンド「LD B,(HL)」1バイト+5行目のコマンド「INC HL」1バイト+6行目のコマンド「LDINTQR (HL)」2バイト+7行目のコマンド「EI」1バイト+8行目のコマンド「POP BC」1バイト+9行目のコマンド「RET」1バイト=9バイトとなり、総実行サイクルは、2行目3サイクル+3行目1サイクル+4行目2サイクル+5行目1サイクル+6行目5サイクル+7行目1サイクル+8行目3サイクル+9行目3サイクル=19サイクルとなる。したがって、図221(b)の場合と比べ、総コマンドサイズが3バイト削減され、総実行サイクルも少なくとも4サイクル削減される。特に、図221(b)の例では、コマンド「DJNZ TABLSET10」におけるBレジスタの値が2以上であれば、その値に10サイクル(6行目4サイクル+7行目3サイクル+8行目3サイクル)を乗じた分だけ総実行サイクルが増えるので、図221(b)の総実行サイクルの削減量も多くなる。かかるTABLSETモジュールによって、コマンドの更なる短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、ここでは、図221の例と比較して、AレジスタおよびCレジスタを利用していない。したがって、Aレジスタの値やCレジスタの値を意図せず更新してしまうことはない。また、図221の例では、AレジスタやCレジスタが既に利用されている場合、スタックしてAレジスタやCレジスタの値を退避する必要があったが、ここでは、AレジスタやCレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
また、図221(b)と図223(b)とを比較して理解できるように、図221(b)において4行(5行目~8行目)を占有していたコマンド群を、図223(b)においては2行(5、6行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
<DECWMQ>
図224は、IPT_PCモジュールの具体的な処理を示したフローチャートである。IPT_PCモジュールは、上記タイマ割込み処理(図98参照)のステップS3100-21において4回に1回読み出される時間監視処理を実行する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。
時間監視処理は、図82~図98の様々なステップにおいてセットされたタイマ(例えば、1遊技間タイマ等)を1ずつ減算する処理である。
メインCPU500aは、図224(a)に示すように、タイマが格納されたアドレスをHLレジスタに読み出した後(S1)、図224(b)に示すWORDDECモジュールを実行し(S2)、HLレジスタに示されたアドレスの値を1減算する(S3)。そして、コマンド「RET」によって、当該WORDDECモジュールを終了してIPT_PCモジュールに戻る(S4)。
図225は、IPT_PCモジュールを実現するためのコマンドの一例を説明するための説明図である。図224で示したフローチャートは、例えば、図225に示したプログラムによって実現される。なお、図225では、一例として、1遊技間タイマを減算する処理について説明する。
図225(a)の1行目の指標「IPT_PC:」は、当該IPT_PCモジュールの先頭アドレスを示す。そして、図225(a)の2行目のコマンド「LDQ HL,(LOW _GAM_TMR)」によって、Qレジスタの値をHレジスタに読み出し、アドレス「_GAM_TMR」の下位1バイトの値をLレジスタに読み出す。かかる2行目のコマンドが、図224(a)のステップS1に対応する。
そして、図225(a)の3行目のコマンド「CALLF WORDDEC」によって、図225(b)に示すWORDDECモジュールが呼び出される。かかる2行目のコマンドが、図224(a)のステップS2に対応する。
図225(b)の1行目の指標「WORDDEC:」は、当該WORDDECモジュールの先頭アドレスを示す。そして、図225(b)の2行目のコマンド「DCPWLD (HL),0」によって、HLレジスタに示されるアドレス(より厳密には、HLレジスタに示されるアドレスと、その次のアドレス)に格納された2バイト長の値(1遊技間タイマ)が読み出され、読み出された値から1が減算(更新)される。そして、減算することによりキャリーフラグに1が立っていた場合、すなわち、読み出された値が0(所定の値)であった場合、HLレジスタに示されるアドレス(より厳密には、HLレジスタに示されるアドレスと、その次のアドレス)に固定値「0(特定値)」が格納される。一方、キャリーフラグに1が立っていなかった場合、すなわち、読み出された値が1以上であった場合、減算された値が、HLレジスタに示されるアドレス(より厳密には、HLレジスタに示されるアドレスと、その次のアドレス)に格納される。かかる2行目のコマンドが、図224(b)のステップS3に対応する。
そして、図225(b)の3行目のコマンド「RET」によって、当該WORDDECモジュールを終了してIPT_PCモジュールに戻る。かかる3行目のコマンドが、図224(b)のステップS4に対応する。こうして、HLレジスタで示されるアドレスに格納された2バイト長の値(1遊技間タイマ)が0になるまで、1回の処理毎に1ずつデクリメントすることが可能となる。
ここで、図225(a)および図225(b)のコマンド群を図225(c)のように変更することができる。ここでは、図225(a)および図225(b)と実質的に等しい処理についてはその説明を省略し、図225(c)の異なる処理のみを説明する。
図225(c)の2行目のコマンド「DECWMQ (LOW _GAM_TMR)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_GAM_TMR」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値が読み出される。そして、読み出された値から1が減算(デクリメント)され、減算することによりキャリーフラグに1が立っていた場合、すなわち、読み出された値が0であった場合、そのアドレスに固定値「0」が格納される。一方、キャリーフラグに1が立っていなかった場合、すなわち、読み出された値が1以上であった場合、減算された値が、そのアドレスに格納される。
ここで、図225(a)および図225(b)に示したコマンド群の総コマンドサイズは、図225(a)の2行目のコマンド「LDQ A,(LOW _GAM_TMR)」2バイト+図225(a)の3行目のコマンド「CALLF WORDDEC」2バイト+図225(b)の2行目のコマンド「DCPWLD (HL),0」4バイト+図225(b)の3行目のコマンド「RET」1バイト=9バイトとなり、総実行サイクルは、図225(a)の2行目2サイクル+図225(a)の3行目4サイクル+図225(b)の2行目9サイクル+図225(b)の3行目3サイクル=18サイクルとなる。
一方、図225(c)に示したコマンド群の総コマンドサイズは、2行目のコマンド「DECWMQ (LOW _GAM_TMR)」3バイト=3バイトとなり、総実行サイクルは、2行目8サイクル=8サイクルとなる。
したがって、図225(a)および図225(b)のコマンド群を図225(c)のコマンド群に置き換えることで、総コマンドサイズが6バイト削減され、総実行サイクルも10サイクル削減される。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図225(a)と図225(c)とを比較して理解できるように、図225(a)において2行(2行目~3行目)を占有していたコマンド群を、図225(c)においては1行(2行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、図225(c)の例では、WORDDECモジュールも削除することが可能であり、貴重な汎用モジュールの領域を空け、その領域に他のモジュールを配置することができる。こうしてリソースの有効活用が可能となる。
<RIBIT>
図226は、CMDPROCモジュールの具体的な処理を示したフローチャートである。CMDPROCモジュールは、上記サブコマンド送信処理(図98のステップS3100-11参照)を実行する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。
メインCPU500aは、図226に示すように、割込み待ちモニタレジスタの値を取得する(S1)。ここで、割込み待ちモニタレジスタは、1バイトで構成されており、6ビット目に、電源断予告信号が入力される。そして、スロットマシン400の電源電圧が所定値以下になると、電源断予告信号が入力され、割込み待ちモニタレジスタの6ビット目が1になり、それ以外の場合は0になっている。
メインCPU500aは、取得した割込み待ちモニタレジスタの6ビット目を参照することで、電源断予告信号が入力されているか、すなわち、外部割込み要求があるかを判定する(S2)。そして、外部割込み要求があれば(S2におけるYES)、当該CMDPROCモジュールを終了して1段上のルーチンに戻り、外部割込み要求がなければ(S2におけるNO)、次の処理に移り、サブコマンドを副制御基板502に送信する。
図227は、CMDPROCモジュールを実現するためのコマンドの一例を説明するための説明図である。図226で示したフローチャートは、例えば、図227に示したプログラムによって実現される。
図227(a)の1行目の指標「CMDPROC:」は、当該CMDPROCモジュールの先頭アドレスを示す。そして、図227(a)の2行目のコマンド「IN A,(@IRR____)」によって、Uレジスタの値をアドレスの上位1バイトとし、割込み待ちモニタレジスタのアドレスの下位1バイトを示す固定値「@IRR____」をアドレスの下位1バイトとし、そのアドレスに格納された値をAレジスタに読み出す。かかる2行目のコマンドが、図226のステップS1に対応する。
そして、図227(a)の3行目のコマンド「RBIT NZ,6,A」によって、Aレジスタに格納された値の6ビット目が0でなければ、すなわち、1であれば、コマンド「RET」を実行するように、当該CMDPROCモジュールを終了して1段上のルーチンに戻る。一方、Aレジスタに格納された値の6ビット目が0であれば、次のコマンドに処理を移す。かかる3行目のコマンドが、図226のステップS2に対応する。
ここで、図227(a)のコマンド群を図227(b)のように変更することができる。ここでは、図227(a)と実質的に等しい処理についてはその説明を省略し、図227(b)の異なる処理のみを説明する。
図227(b)の2行目のコマンド「RIBIT NZ,6,(@IRR____)」によって、Uレジスタの値をアドレスの上位1バイトとし、割込み待ちモニタレジスタのアドレスの下位1バイトを示す固定値「@IRR____」をアドレスの下位1バイトとし、そのアドレスに格納された値の6ビット目が0でなければ、コマンド「RET」を実行するように、当該CMDPROCモジュールを終了して1段上のルーチンに戻る。一方、そのアドレスに格納された値の6ビット目が0であれば、次のコマンドに処理を移す。
ここで、図227(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「IN A,(@IRR____)」2バイト+3行目のコマンド「RBIT NZ,6,A」2バイト=4バイトとなり、総実行サイクルは、2行目3サイクル+3行目5(3)サイクル=8(6)サイクルとなる。なお、括弧内のサイクル数は、コマンド「RBIT NZ,6,A」によって移動しなかった場合の実行サイクルを示している。
一方、図227(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「RIBIT NZ,6,(@IRR____)」3バイト=3バイトとなり、総実行サイクルは、2行目7(5)サイクル=7(5)サイクルとなる。なお、括弧内のサイクル数は、コマンド「RIBIT NZ,6,(@IRR____)」によって移動しなかった場合の実行サイクルを示している。
したがって、図227(a)のコマンド群を図227(b)のコマンド群に置き換えることで、総コマンドサイズが1バイト削減され、総実行サイクルも少なくとも1サイクル削減される。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図227(b)の例では、図227(a)で利用していたAレジスタを利用していない。したがって、Aレジスタの値を意図せず更新してしまうことはない。また、図227(a)の例では、Aレジスタが既に利用されている場合、スタックしてAレジスタの値を退避する必要があったが、ここでは、Aレジスタを利用しないので、スタック処理も必要ない。こうして、リソースを有効利用することが可能となる。
また、図227(a)と図227(b)とを比較して理解できるように、図227(a)において2行(2行目~3行目)を占有していたコマンド群を、図227(b)においては1行(2行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
<AND+OR>
図228は、SET_PLSモジュールの具体的な処理を示したフローチャートである。SET_PLSモジュールは、上記ステッピングモータ制御処理(図98のステップS3100-13参照)において読み出される励磁パターン更新処理を実行する。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。
メインCPU500aは、図228に示すように、ステッピングモータ452の励磁パターンが格納された励磁パターンテーブルの先頭アドレスを取得する(S1)。メインCPU500aは、取得した励磁パターンテーブルの先頭アドレスに対して、予めAレジスタに格納されたオフセット値を加算、すなわち、オフセットする(S2)。
そして、メインCPU500aは、所定の出力ポートに格納された出力イメージを取得し(S3)、取得した出力イメージの上位4ビットをマスクする(S4)。なお、ここで取得した出力イメージは、1バイト長で構成されており、上位4ビットに、ステッピングモータ452の励磁パターンが示されている。そこで、ここでは、出力イメージの上位4ビットをマスクすることで、励磁パターンをクリアしている。
その後、メインCPU500aは、ステップS2においてオフセットされたアドレスに示される値と、取得した出力イメージとの論理和を取ることにより、励磁パターンを合成し(S5)、合成した励磁パターンを出力イメージとして更新し(S6)、当該SET_PLSモジュールを終了して1段上のルーチンに戻る(S7)。
図229は、SET_PLSモジュールを実現するためのコマンドの一例を説明するための説明図である。図228で示したフローチャートは、例えば、図229に示したプログラムによって実現される。
図229(a)の1行目の指標「SET_PLS:」は、当該SET_PLSモジュールの先頭アドレスを示す。そして、図229(a)の2行目のコマンド「LD HL,T_PLS_PTN」によって、ステッピングモータ452の励磁パターンが格納された励磁パターンテーブルのアドレス「T_PLS_PTN」をHLレジスタに読み出す。かかる2行目のコマンドが、図228のステップS1に対応する。
そして、図229(a)の3行目のコマンド「ADDWB HL,A」によって、HLレジスタの値にAレジスタの値(オフセット値)が加算され、HLレジスタの値が更新される。かかる3行目のコマンドが、図228のステップS2に対応する。
その後、図229(a)の4行目のコマンド「LD A,(IY+@OFS_OUT_PRT)」によって、出力ポートのアドレス「IY+@OFS_OUT_PRT」に格納された値(出力イメージ)をAレジスタに読み出す。かかる4行目のコマンドが、図228のステップS3に対応する。
続いて、図229(a)の5行目のコマンド「AND A,00001111B」によって、Aレジスタの値(出力イメージ)と、固定値「00001111B」(第1の値)との論理積が演算され(上位4ビットがマスクされ)、演算結果がAレジスタに格納される。かかる5行目のコマンドが、図228のステップS4に対応する。
そして、図229(a)の6行目のコマンド「OR A,(HL)」によって、Aレジスタの値(マスクされた出力イメージ)と、HLレジスタに示されるアドレスに格納された値(励磁パターン、第2の値)との論理和が演算され、演算結果がAレジスタに格納される。かかる6行目のコマンドが、図228のステップS5に対応する。
その後、図229(a)の7行目のコマンド「LD (IY+@OFS_OUT_PRT),A」によって、Aレジスタの値が出力ポートのアドレス「IY+@OFS_OUT_PRT」に格納される。かかる7行目のコマンドが、図228のステップS6に対応する。そして、図229(a)の8行目のコマンド「RET」によって、当該SET_PLSモジュールが終了して1段上のルーチンに戻る。かかる8行目のコマンドが、図228のステップS7に対応する。
ここで、図229(a)のコマンド群を図229(b)のように変更することができる。ここでは、図229(a)と実質的に等しい処理についてはその説明を省略し、図229(b)の異なる処理のみを説明する。
図229(b)の3行目のコマンド「RST CALADRS」によって、図229(c)に示すCALADRSモジュールが呼び出される。図229(c)の1行目の指標「CALADRS:」は、当該CALADRSモジュールの先頭アドレスを示す。そして、図229(c)の2行目のコマンド「ADDWB HL,A」によって、HLレジスタの値にAレジスタの値(オフセット値)が加算され、HLレジスタの値が更新される。そして、3行目のコマンド「LD A,(HL)」によって、HLレジスタで示されるアドレスに格納された1バイト値がAレジスタに読み出される。そして、図229(c)の4行目のコマンド「RET」によって、当該CALADRSモジュールを終了してSET_PLSモジュールに戻る。
その後、図229(b)の4行目のコマンド「AND (IY+@OFS_OUT_PRT),00001111B」によって、アドレス「IY+@OFS_OUT_PRT」に格納された値(出力イメージ)と、固定値「00001111B」との論理積が演算され(上位4ビットがマスクされ)、演算結果がアドレス「IY+@OFS_OUT_PRT」に格納される。
そして、図229(b)の5行目のコマンド「OR (IY+@OFS_OUT_PRT),A」によって、アドレス「IY+@OFS_OUT_PRT」に格納された値(マスクされた出力イメージ)と、Aレジスタの値(励磁パターン)との論理和が演算され、演算結果がアドレス「IY+@OFS_OUT_PRT」に格納される。
ここで、図229(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LD HL,T_PLS_PTN」3バイト+3行目のコマンド「ADDWB HL,A」1バイト+4行目のコマンド「LD A,(IY+@OFS_OUT_PRT)」3バイト+5行目のコマンド「AND A,00001111B」2バイト+6行目のコマンド「OR A,(HL)」1バイト+7行目のコマンド「LD (IY+@OFS_OUT_PRT),A」3バイト+8行目のコマンド「RET」1バイト=14バイトとなり、総実行サイクルは、2行目3サイクル+3行目1サイクル+4行目4サイクル+5行目2サイクル+6行目2サイクル+7行目4サイクル+8行目3サイクル=19サイクルとなる。
一方、図229(b)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LD HL,T_PLS_PTN」3バイト+3行目のコマンド「RST CALADRS」1バイト+4行目のコマンド「AND (IY+@OFS_OUT_PRT),00001111B」4バイト+5行目のコマンド「OR (IY+@OFS_OUT_PRT),A」3バイト+6行目のコマンド「RET」1バイト=12バイトとなり、総実行サイクルは、2行目3サイクル+3行目4サイクル+4行目7サイクル+5行目6サイクル+6行目3サイクル=23サイクルとなる。
したがって、図229(a)のコマンド群を図229(b)のコマンド群に置き換えることで、総コマンドサイズが2バイト削減される。かかる置き換えによって、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。なお、汎用モジュールであるCALADRSモジュールは、他のモジュールによって読み出されて実行されるものであり、新たに追加するものではない。
また、図229(a)と図229(b)とを比較して理解できるように、図229(b)のコマンド群は、図229(a)のコマンド群よりも2行減らすことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
<CPLBQ>
図230は、OTM_ATKモジュールの具体的な処理を示したフローチャートである。かかる図におけるステップSの数値は、本図の説明においてのみ用いることとする。
ここで、スロットマシン400の別例としては、所謂チャンスゾーン演出状態が設けられている。チャンスゾーン演出状態は、通常演出状態よりもAT抽選に当選しやすい状態であり、所定遊技に亘って移行される。例えば、チャンスゾーン演出状態が8遊技に亘って移行され、1遊技毎にAT抽選を行う。そして、スロットマシン400の別例では、チャンスゾーン演出状態における各遊技でのAT抽選の結果を1ビットで記憶する(当選=1、非当選=0)ことで、全てのAT抽選の結果を合計8ビット(1バイト長)の当否情報として管理する。
このようなAT抽選の結果を管理する処理をOTM_ATKモジュールによって実行する。なお、OTM_ATKモジュールは、各遊技においてAT抽選に当選した場合にのみ、図91におけるステップS2400-11に示した実行フラグ設定処理において呼び出されて実行される。
メインCPU500aは、図230に示すように、チャンスゾーン演出状態の遊技数を取得するとともに(S1)、遊技数ビットテーブルのアドレスを取得する(S2)。なお、遊技数ビットテーブルには、詳しくは後述するように、チャンスゾーン演出状態における1遊技目から8遊技目にそれぞれ対応したビット情報が連続して配置されており、各ビット情報は、その遊技に対応したビット(1ビット情報)が1であり、その他のビットが0となっている1バイト長のデータとなっている。
メインCPU500aは、遊技数ビットテーブルから、取得した遊技数に対応するビット情報を取得するとともに(S3)、AT抽選の結果が示される1バイト長の当否情報(1バイト情報)を取得する(S4)。そして、メインCPU500aは、取得したビット情報と当否情報との論理和を演算することにより、当否情報を更新(合成)し(S5)、更新した当否情報をセーブし(S6)。当該OTM_ATKモジュールを終了して1段上のルーチンに戻る(S7)。
図231は、OTM_ATKモジュールを実現するためのコマンドの一例を説明するための説明図である。図230で示したフローチャートは、例えば、図231に示したプログラムによって実現される。
図231(a)の1行目の指標「OTM_ATK:」は、当該OTM_ATKモジュールの先頭アドレスを示す。そして、図231(a)の2行目のコマンド「LDQ A,(LOW _CZ_CNT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_CZ_CNT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(遊技数)をAレジスタに読み出す。かかる2行目のコマンドが、図230のステップS1に対応する。
そして、図231(a)の3行目のコマンド「LD HL,T_XXX_XXX」によって、図231(b)に示す、遊技数ビットテーブルの先頭アドレス「T_XXX_XXX」をHLレジスタに読み出す。かかる3行目のコマンドが、図230のステップS2に対応する。
図231(b)の1行目の指標「T_XXX_XXX:」は、テーブル「T_XXX_XXX」の先頭アドレスを示す。図231(b)の2行目の値「00000001B」は、チャンスゾーン演出状態における1遊技目に対応し、0ビットのみが1であり、他のビットが0である。同様に、図231(b)の3行目~9行目の値は、チャンスゾーン演出状態における2遊技目~8遊技目にそれぞれ対応し、その遊技に対応するビットが1であり、他のビットが0である。
図231(a)の4行目のコマンド「RST CALADRS」によって、CALADRSモジュールが呼び出される。なお、CALADRSモジュールでは、HLレジスタの値にAレジスタの値(遊技数)が加算され、HLレジスタの値が更新されるとともに、更新されたHLレジスタに示されるアドレスに格納された値(遊技数に対応するビット情報)がAレジスタに読み出される。かかる4行目のコマンドが、図230のステップS3に対応する。
図231(a)の5行目のコマンド「LDQ B,(LOW _ATW_BIT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_ATW_BIT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(当否情報)をBレジスタに読み出す。かかる5行目のコマンドが、図230のステップS4に対応する。
図231(a)の6行目のコマンド「OR A,B」によって、Aレジスタの値(遊技数に対応するビット情報)と、Bレジスタの値(当否情報)との論理和を演算する。ここでは、当該遊技においてAT抽選に当選したときに、当否情報のうち、その遊技数に対応するビットが1となる。かかる6行目のコマンドが、図230のステップS5に対応する。
図231(a)の7行目のコマンド「LDQ (LOW _ATW_BIT),A」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_ATW_BIT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスにAレジスタの値(更新された当否情報)を格納する。かかる7行目のコマンドが、図230のステップS6に対応する。
そして、図231(a)の8行目のコマンド「RET」によって、当該OTM_ATKモジュールが終了して1段上のルーチンに戻る。かかる8行目のコマンドが、図230のステップS7に対応する。
ここで、図231(a)のコマンド群を図231(c)のように変更することができる。ここでは、図231(a)と実質的に等しい処理についてはその説明を省略し、図231(c)の異なる処理のみを説明する。
図231(c)の3行目のコマンド「CPLBQ A,(LOW _ATW_BIT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「_ATW_BIT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(当否情報)のうち、Aレジスタの値(遊技数)に対応するビットを反転する。したがって、ここでは、当否情報のうち、AT抽選に当選した遊技(遊技数)に対応するビットが反転されて1となる。
ここで、図231(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW _CZ_CNT)」2バイト+3行目のコマンド「LD HL,T_XXX_XXX」3バイト+4行目のコマンド「RST CALADRS」1バイト+5行目のコマンド「LDQ B,(LOW _ATW_BIT)」3バイト+6行目のコマンド「OR A,B」1バイト+7行目のコマンド「LDQ (LOW _ATW_BIT),A」2バイト+8行目のコマンド「RET」1バイト=13バイトとなり、総実行サイクルは、2行目3サイクル+3行目3サイクル+4行目4サイクル+5行目4サイクル+6行目2サイクル+7行目3サイクル+8行目3サイクル=22サイクルとなる。
一方、図231(c)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW _CZ_CNT)」2バイト+3行目のコマンド「CPLBQ A,(LOW _ATW_BIT)」3バイト+4行目のコマンド「RET」1バイト=6バイトとなり、総実行サイクルは、2行目3サイクル+3行目6サイクル+4行目3サイクル=12サイクルとなる。
したがって、図231(a)のコマンド群を図231(c)のコマンド群に置き換えることで、総コマンドサイズが7バイト削減され、総実行サイクルも少なくとも10サイクル削減される。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
また、図231(a)と図231(c)とを比較して理解できるように、図231(a)において5行(3行目~7行目)を占有していたコマンド群を、図231(c)においては1行(3行目)で表すことができ、コマンド数自体の削減と、設計負荷の軽減を図ることが可能となる。
また、図231(c)のコマンド群に置き換えることで、遊技数ビットテーブルが不要になるため、遊技数ビットテーブル分のデータ容量も削減することができる。
<LDSB>
図232は、KRS_JDGモジュールを実現するためのコマンドの一例を説明するための説明図である。
ここで、遊技機100の別例としては、大役遊技における所定のラウンド遊技において、大入賞口内に設けられた確変領域(特定領域)に遊技球が進入した場合に、大役遊技後の遊技状態を高確率遊技状態に設定する。そして、所定の特別図柄が決定された大役遊技において、所定のラウンド遊技で、大入賞口に所定の遊技数が通過したときに、確変領域を開放し、確変領域に遊技球を進入可能としている。以下では、1回目のラウンド遊技において大入賞口に遊技球が3球入球した場合、および、5回目のラウンド遊技において大入賞口に遊技球が5球入球した場合に、確変領域が開放される例を挙げて説明する。
このような確変領域の開放を管理する処理をKRS_JDGモジュールによって実行する。なお、KRS_JDGモジュールは、図47に示した大入賞口開放制御処理において呼び出されて実行される。
図232(a)の1行目の指標「KRS_JDG:」は、当該KRS_JDGモジュールの先頭アドレスを示す。そして、図232(a)の2行目のコマンド「LDQ A,(LOW R_ROU_CNT)」によって、Qレジスタの値をアドレスの上位1バイトとし、アドレス「R_ROU_CNT」の下位1バイトの値をアドレスの下位1バイトとし、そのアドレスに格納された値(特別電動役物連続作動回数、すなわち、ラウンド遊技数)をAレジスタに読み出す。
そして、図232(a)の3行目のコマンド「LD B,(HL)」によって、HLレジスタに格納された値が示すアドレスの値をBレジスタに読み出す。なお、HLレジスタには、予め、図232(b)に示す、確変領域判定テーブルのアドレス「D_KRS_JDG_2」が読み出されている。
図232(b)の1行目の指標「D_KRS_JDG_2:」は、テーブル「D_KRS_JDG_2」の先頭アドレスを示す。図232(b)の2行目の値「(@D_KRS_JDG_2-D_KRS_JDG2-1)/2」は、7行目の指標「@D_KRS_JDG_2:」のアドレスから1行目の指標「D_KRS_JDG_2:」のアドレスおよび1を減算した値を2で除算した値であり、判定回数(確変領域が開放されるラウンド遊技の回数)を示すものである。
図232(b)の3行目の値「@KRS_TGT_ROU_01」は、確変領域を開放する1回目のラウンド遊技を示す値(対象ラウンド値、ここでは、1)であり、図232(b)の4行目の値「@KRS_JDG_01」は、確変領域を開放する1回目のラウンド遊技において大入賞口に何個の遊技球が入球したときに確変領域を開放するかを示す値(開放識別値、ここでは、3)である。同様に、図232(b)の5行目の値「@KRS_TGT_ROU_03」は、確変領域を開放する2回目のラウンド遊技を示す値(対象ラウンド値、ここでは、5)であり、図232(b)の6行目の値「@KRS_JDG_03」は、確変領域を開放する2回目のラウンド遊技において大入賞口に何個の遊技球が入球したときに確変領域を開放するかを示す値(開放識別値、ここでは、5)である。
したがって、図232(a)の3行目のコマンド「LD B,(HL)」によって、判定回数がBレジスタに読み出されることになる。
図232(a)の4行目の指標「KRS_JDG_10:」は、当該指標「KRS_JDG_10」のアドレスを示す。図232(a)の5行目のコマンド「INC HL」によって、HLレジスタの値が1加算(インクリメント)される。その後、図232(a)の6行目のコマンド「CP A,(HL)」によって、Aレジスタの値と、HLレジスタの値によって示されるアドレスに格納された値(対象ラウンド値)とが比較され、Aレジスタの値がHLレジスタの値と同一であれば、ゼロフラグが立って1となり、HLレジスタの値と異なれば、ゼロフラグが立たずに0となる。
続いて、図232(a)の7行目のコマンド「INC HL」によって、HLレジスタの値が再び1加算(インクリメント)される。その後、図232(a)の8行目のコマンド「LD C,(HL)」によって、HLレジスタで示されるアドレスの値(開放識別値)がCレジスタに読み出される。
そして、図232(a)の9行目のコマンド「RET Z」によって、ゼロフラグが立っている場合、当該KRS_JDGモジュールを終了して1つ上のモジュールに戻る。
また、ゼロフラグが立っていない場合、図232(a)の10行目のコマンド「DJNZ KRS_JDG_10」によって、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0でなければ、アドレス「KRS_JDG_10」に移動し、デクリメントした結果が0であれば、図232(a)の11行目のコマンド「RET」によって、当該KRS_JDGモジュールを終了して1つ上のモジュールに戻る。
ここで、遊技機100においては、ラウンド遊技数は最大で10である。また、確変領域を開放するための大入賞口への入球数は、各ラウンド遊技の規定数が10であることから、2~5の間に設定されることになる。すなわち、対象ラウンド値は10以下の値であり、4ビットで表現可能である。したがって、対象ラウンド値を示す値「@KRS_TGT_ROU_01」および値「@KRS_TGT_ROU_03」は、1バイト長で構成されているが、実際には4ビットでよい。
また、開放識別値は5以下の値であり、3ビットで表現可能である。したがって、開放識別値を示す値「@KRS_JDG_01」および値「@KRS_JDG_03」は、1バイト長で構成されているが、実際には3ビットでよい。
そこで、以下では、4ビットで表現可能な対象ラウンド値、および、3ビットで表現可能な開放識別値の2つの値を、1バイト長の1つの値(データ)として扱う例について説明する。
図233は、KRS_JDGモジュールを実現するためのコマンドの別例を説明するための説明図である。なお、図232と実質的に等しい処理についてはその説明を省略し、図233の異なる処理のみを説明する。
図233(a)の3行目のコマンド「LD B,(HL)」によって、HLレジスタに示されるアドレスの値をBレジスタに読み出す。なお、HLレジスタには、予め、図233(b)に示す、確変領域判定テーブルのアドレス「D_KRS_JDG_2」が読み出されている。
図233(b)の3行目の値「@KRS_TGT_ROU_01*8+@KRS_JDG_01」は、上位5ビットが、確変領域を開放する1回目のラウンド遊技を示す値(対象ラウンド値)であり、下位3ビットが、確変領域を開放する1回目のラウンド遊技において大入賞口に何個の遊技球が入球したときに確変領域を開放するかを示す値(開放識別値)である。同様に、図233(b)の4行目の値「@KRS_TGT_ROU_03*8+@KRS_JDG_03」は、上位5ビットが、確変領域を開放する2回目のラウンド遊技を示す値(対象ラウンド値)であり、下位3ビットが、確変領域を開放する2回目のラウンド遊技において大入賞口に何個の遊技球が入球したときに確変領域を開放するかを示す値(開放識別値)である。
図233(a)の6行目のコマンド「LDSB 2,DE,(HL)」によって、HLレジスタの値の下位3ビットがEレジスタに読み出され(他のビットは0にされる)、HLレジスタの値の上位5ビットが3ビット右にシフトされてDレジスタに読み出される(他のビットは0にされる)。すなわち、対象ラウンド値および開放識別値を分けて、対象ラウンド値がDレジスタに読み出され、開放識別値がEレジスタに読み出される。なお、コマンド「LDSB 2,DE,(HL)」における「2」は、0ビットから2ビット目までの3ビットがEレジスタに読み出されることを示す値であるとともに、それよりも上位のビット(5ビット)がシフトされてDレジスタに読み出されることを示す値である。
図233(a)の7行目のコマンド「CP A,D」によって、Aレジスタの値と、Dレジスタの値(対象ラウンド値)とが比較され、Aレジスタの値がDレジスタの値と同一であれば、ゼロフラグが立って1となり、対象ラウンド値と異なれば、ゼロフラグが立たずに0となる。
ここで、図232(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_ROU_CNT)」2バイト+3行目のコマンド「LD B,(HL)」1バイト+5行目のコマンド「INC HL」1バイト+6行目のコマンド「CP A,(HL)」1バイト+7行目のコマンド「INC HL」1バイト+8行目のコマンド「LD C,(HL)」1バイト+9行目のコマンド「RET Z」1バイト+10行目のコマンド「DJNZ KRS_JDG_10」2バイト+11行目のコマンド「RET」1バイト=11バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+5行目1サイクル+6行目2サイクル+7行目1サイクル+8行目1サイクル+9行目3(1)サイクル+10行目3(2)サイクル+11行目3(1)サイクル=19(14)サイクルとなる。また、図232(b)に示す確変領域判定テーブルは、5バイトとなる。なお、括弧内のサイクル数は、コマンドによって移動しなかった場合の実行サイクルを示している。
一方、図233(a)に示したコマンド群の総コマンドサイズは、2行目のコマンド「LDQ A,(LOW R_ROU_CNT)」2バイト+3行目のコマンド「LD B,(HL)」1バイト+5行目のコマンド「INC HL」1バイト+6行目のコマンド「LDSB 2,DE,(HL)」2バイト+7行目のコマンド「CP A,D」1バイト+8行目のコマンド「RET Z」1バイト+9行目のコマンド「DJNZ KRS_JDG_10」2バイト+10行目のコマンド「RET」1バイト=11バイトとなり、総実行サイクルは、2行目3サイクル+3行目2サイクル+5行目1サイクル+6行目3サイクル+7行目1サイクル+8行目3(1)サイクル+9行目3(2)サイクル+10行目3(1)サイクル=19(14)サイクルとなる。また、図233(b)に示す確変領域判定テーブルは、3バイトとなる。なお、括弧内のサイクル数は、コマンドによって移動しなかった場合の実行サイクルを示している。
したがって、図232(a)のコマンド群および図232(b)の確変領域判定テーブルを、図233(a)のコマンド群および図233(b)の確変領域判定テーブルに置き換えることで、総サイズが2バイト削減される。かかる置き換えによって、コマンドの短縮化および処理負荷の軽減を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
なお、コマンド「LDSB」は、合計で8バイト以下の2つの値(情報)を、1バイト長の1つのデータとして扱う際に使用可能であり、上記の例以外であっても適用することができる。
<レジスタバンクおよびレジスタ群の管理>
図101を用いて説明したように、CPUコア700のレジスタユニット716には、排他的に切り換えて利用可能な2つのレジスタバンク(第1レジスタバンク726および第2レジスタバンク728)が設けられる。また、第1レジスタバンク726および第2レジスタバンク728それぞれには、排他的に切り換えてアクセス可能な2つのレジスタ群(メインレジスタ群726a、728aおよびサブレジスタ群726b、728b)が設けられ、それぞれ、8ビットのレジスタ(Q、A、F、B、C、D、E、H、L)と、16ビットのレジスタ(IX、IY)とを含む。したがって、このような複数のレジスタが共通するレジスタ群は、2つのレジスタバンク(第1レジスタバンク726、第2レジスタバンク728)と、2つのレジスタ群(メインレジスタ群726a、728a、サブレジスタ群726b、728b)との掛け合わせで4つの領域に存在することとなる。
このようなレジスタ群は、それぞれレジスタバンク間、レジスタ群間で排他的に利用されるとともに、独立して情報を記憶できるので、他の領域のレジスタの更新に影響を受けることがない。換言すれば、メインCPU500aは、現在対象としているレジスタバンクおよびレジスタ群のレジスタの内容は更新できるが、他の対象としていないレジスタバンクおよびレジスタ群にはアクセスすることができない。
このように、レジスタ群が、レジスタバンク間およびレジスタ群間で独立していることを利用し、それぞれのレジスタ群を、その種別(目的、機能、契機等)により区分けすることが可能な複数のプログラムそれぞれに対応させることを検討する。例えば、本実施形態のメモリ空間では、図102のメモリマップのように、メインROM500bおよびメインRAM500cにおいて使用領域と別領域とが割り当てられている。上述したように、メインROM500bの使用領域には、遊技の進行を制御する遊技制御処理を実行するためのプログラムやデータが格納され、メインROM500bの別領域には、遊技の進行に影響を及ぼさない遊技制御外処理を遂行するプログラムの命令コードおよびプログラムデータが格納されている。このように使用領域と別領域とは、目的とする処理の内容が異なるため、それぞれ異なるレジスタ群を対応させることが好ましい。
そこで、本実施形態では、使用領域における遊技制御処理の実行に用いるレジスタ群として第1レジスタバンク726を対応させ、別領域における遊技制御外処理の実行に用いるレジスタ群として第2レジスタバンク728を対応させる。換言すれば、第1レジスタバンク726は、使用領域における遊技制御処理の実行に用いるレジスタ群として使用し、第2レジスタバンク728は、別領域における遊技制御外処理の実行に用いるレジスタ群として使用する。そして、メインCPU500aは、メインROM500bの0000h~1FFFhに格納されているプログラムを参照し、第1レジスタバンク726のレジスタ群を更新して遊技制御処理を実行するとともに、メインROM500bの2000h~3FFFhに格納されているプログラムを参照し、レジスタバンクを切り換え、第2レジスタバンク728のレジスタ群を更新して遊技制御外処理を実行する。かかる構成により、メモリおよびレジスタの両方において、使用領域と別領域との独立性および排他性を担保することができる。
また、本実施形態では、遊技制御処理において実行されるプログラムを2つに区分けする。ここでは、例えば、メイン処理とタイマ割込み処理とに区分する。メイン処理(第1処理)は、例えば、図22~図25(遊技機100)、図82~図97(スロットマシン400)に示したように、メインループを含む、遊技者の操作とその結果に従って順次実行される処理であり、タイマ割込み処理(第2処理)は、例えば、図26~図59(遊技機100)、図98(スロットマシン400)に示したように、メイン処理の実行中に生じる、所定時間(例えば、4ms、1.49ms)毎のタイマ割込に応じ、メイン処理を一旦中断して実行される処理である。なお、ここでは、第1処理として、メイン処理を挙げて説明したが、かかる場合に限らず、遊技を進行するための任意の処理を適用することができる。また、ここでは、第2処理として、タイマ割込み処理を挙げて説明したが、かかる場合に限らず、遊技を進行する上での所定の条件(計時契機、タイミング契機、操作契機、処理の実行契機等)の成立に基づいて発生する所定の割込みによって実行される処理であれば、任意の処理を適用することができる。
そして、本実施形態においては、メイン処理およびタイマ割込み処理のいずれか一方に、第1レジスタバンク726の2つのレジスタ群726a、726bの一方を対応させ、メイン処理およびタイマ割込み処理の他方に、第1レジスタバンク726の2つのレジスタ群726a、726bの他方を対応させる。換言すれば、第1レジスタバンク726の2つのレジスタ群726a、726bの一方は、メイン処理およびタイマ割込み処理のいずれか一方の処理の実行に用いるレジスタ群として使用し、第1レジスタバンク726の2つのレジスタ群726a、726bの他方は、メイン処理およびタイマ割込み処理の他方の処理の実行に用いるレジスタ群として使用する。以下、第1の実施形態で、メイン処理にメインレジスタ群726aを対応させ、タイマ割込み処理にサブレジスタ群726bを対応させた例を説明し、第2の実施形態で、メイン処理にサブレジスタ群726bを対応させ、タイマ割込み処理にメインレジスタ群726aを対応させた例を説明する。
(第1の実施形態)
ここでは、メイン処理にメインレジスタ群726aを対応させ、タイマ割込み処理にサブレジスタ群726bを対応させた例を説明する。したがって、メインCPU500aは、メインレジスタ群726aを参照してメイン処理を順次実行し、タイマ割込みが生じた場合に、メイン処理を中断し、一旦、メインレジスタ群726aからサブレジスタ群726bに切り換えてタイマ割込み処理を実行し、タイマ割込み処理が終了すると、サブレジスタ群726bからメインレジスタ群726aに切り換えて、メイン処理を再開する。
ところで、上述したように、本実施形態ではQレジスタを用いている。Qレジスタに記述された値は、任意のコマンドにおいてアドレスの一部として参照される。かかるQレジスタを用いることで、Qレジスタを参照するコマンドを記述でき、コマンドサイズやサイクル数を削減することが可能となる。
例えば、メモリ空間からデータを読み出すロード命令「LD」に関し、コマンド「LD A,(mn)」をプログラムに記述すると、16ビットのアドレスmnに格納された値をAレジスタに読み出すことができる。かかるコマンドは、コマンドサイズが3バイトでサイクル数が4サイクルとなる。これに対し、Qレジスタを参照するコマンド「LDQ A,(n)」をプログラムに記述すると、Qレジスタの値をアドレスの上位1バイトとし、アドレスnをアドレスの下位1バイトとし、16ビットのアドレスとして取り扱うように、そのアドレスに格納された値をAレジスタに読み出すことができる。かかるコマンドは、コマンドサイズが2バイトでサイクル数が3サイクルとなる。したがって、コマンドサイズおよびサイクル数のいずれも削減することが可能となる。
かかるQレジスタは、上述したように、レジスタ群毎に管理されている。すなわち、メインレジスタ群(第1のレジスタ群)726aのQレジスタ(第1レジスタ)と、サブレジスタ群(第2のレジスタ群)726bのQ’レジスタ(第2レジスタ)が存在し、互いに独立して値を保持する。
また、当該レジスタユニット716を含むメインCPU500aの電源投入時においても、メインレジスタ群726aのQレジスタと、サブレジスタ群726bのQ’レジスタは、互いに独立して初期値が設定される。例えば、電源投入時において、メインレジスタ群726aのQレジスタは、メインRAM500cの記憶領域のアドレスにおける複数の上位バイトの値(例えば、F0h~F3)のうちの、1の上位バイトの値(例えばF0h)と同じ「F0h」(第1の値)に設定され、サブレジスタ群726bのQ’レジスタは、メインRAM500cの記憶領域のアドレスにおける複数の上位バイトの値(例えば、F0h~F3)のうちの、1の上位バイトの値(例えばF1h)と同じ「F1h」に設定される。これは、メインレジスタ群726aを利用する処理と、サブレジスタ群726bを利用する処理とで、互いに参照するメモリ領域を区分けすることを想定したものである。
ただし、本実施形態では、メインレジスタ群726aを利用するメイン処理と、サブレジスタ群726bを利用するタイマ割込み処理とは、同一のメモリ領域に対応付けられた変数にアクセスする。したがって、アドレスの上位バイトとして参照されるメインレジスタ群726aのQレジスタおよびサブレジスタ群726bのQ’レジスタのいずれも同じ値(例えば、F0h)を保持させた方が、アドレスを調整するためのコマンドが不要な分、コマンドサイズを小さくできる。
そこで、本実施形態では、メインレジスタ群726aのQレジスタおよびサブレジスタ群726bのQ’レジスタのいずれも同じ値(ここではF0h)に設定することとする。なお、メインレジスタ群726aのQレジスタは、初期値がF0h(第1の値)なので、さらに別の値を設定する必要がない。したがって、ここでは、サブレジスタ群726bのQ’レジスタのみF1hをF0h(第2の値)に書き替える。なお、メインCPU500aは、Q’レジスタを参照するコマンドが用いられる前に、Q’レジスタに値を設定する必要がある。そこで、例えば、メイン処理の初期化処理(例えば、図82のCPU初期化処理)において、Q’レジスタを初期化することが考えられる。
図234は、Q’レジスタに値を設定するコマンドの一例を示した図である。ここで、メインCPU500aは、メイン処理の初期化処理において、Q’レジスタにF0hを設定する。ただし、上述したように、メインCPU500aは、現在対象としているレジスタ群であるメインレジスタ群726aのQレジスタの内容は更新できるが、他のレジスタ群であるサブレジスタ群726bのQ’レジスタにはアクセスすることができない。そこで、図234のように、1行目のコマンド「EX ALL」によって、メインレジスタ群726aにおける8ビットのレジスタ(Q、A、F、B、C、D、E、H、L)および16ビットのレジスタ(IX、IY)から、サブレジスタ群726bにおける8ビットのレジスタ(Q’、A’、F’、B’、C’、D’、E’、H’、L’)および16ビットのレジスタ(IX’、IY’)に切り換える。そして、2行目のコマンド「LD Q,0F0H」によって、Q’レジスタにF0hを設定し、3行目のコマンド「EX ALL」によって、サブレジスタ群726bからメインレジスタ群726aに切り換える。
図234に示したコマンド例の総コマンドサイズは、1行目のコマンド「EX ALL」2バイト+2行目のコマンド「LD Q,0F0H」1バイト+3行目のコマンド「EX ALL」2バイト=5バイトとなり、総実行サイクルは、1行目2サイクル+2行目1サイクル+3行目2サイクル=5サイクルとなる。
なお、ここでは、メインレジスタ群726aのQレジスタとサブレジスタ群726bのQ’レジスタとの切り換えに、コマンド「EX ALL」を用いる例を挙げて説明したが、かかる場合に限らず、Qレジスタ同士を切り換えれば足り、例えば、コマンド「EX Q,Q’」を用いてもよい。なお、コマンド「EX Q,Q’」のコマンドサイズは2バイトで、サイクルは2サイクルなので、コマンド「EX ALL」と置換したとしても総コマンドサイズおよび総実行サイクルは変わらない。
このようなQ’レジスタを参照するコマンド種別は、上記で例示したコマンド「LDQ」のみならず、多数あり、また、プログラムの中で繰り返し記述される。したがって、Q’レジスタを参照するコマンドを利用する度にコマンドサイズおよびサイクル数の削減効果が得られることとなる。このようなQ’レジスタを参照するコマンドの利用頻度の高さに伴い、Qレジスタの参照回数も多くなる。したがって、Q’レジスタの値は確実に設定されるべきである。そこで、Q’レジスタの設定を、メイン処理の初期化処理で1度のみ行うのに代えて、または、加えて、メイン処理のループ処理を通じて繰り返し行うことも考えられる。例えば、図234のコマンド群を図88~図97(スロットマシン400)のいずれかで行う。こうすることで、メイン処理のループ処理が実行される度にQ’レジスタにF0hを設定することができるので、仮に、Q’レジスタが初期値F1hになってしまうことがあったとしても、Q’レジスタの値を確実にF0hに設定することができ、Q’レジスタの値を安定的に維持することが可能となる。
ただし、Q’レジスタはタイマ割込み処理で利用するので、タイマ割込みを許可するまでにはQ’レジスタにF0hを設定する。
また、Q’レジスタの設定を、メイン処理の初期化処理で1度のみ行う、または、メイン処理のループ処理で繰り返し行うのに代えて、または、加えて、タイマ割込み処理を通じて繰り返し行うことも考えられる。こうすることで、タイマ割込みが生じる度に、Q’レジスタにF0hを設定することができるので、仮に、Q’レジスタが初期値F1hになってしまうことがあったとしても、Q’レジスタの値を確実にF0hに設定することができ、Q’レジスタの値を安定的に維持することが可能となる。以下、タイマ割込み処理を通じてQ’レジスタの設定を繰り返し行う例を詳述する。
図235は、Q’レジスタに値を設定するコマンドの一例を示した図である。ここでは、まず、Q’レジスタの設定に言及せず、図235(a)を用いて、通常のタイマ割込み処理を説明する。なお、タイマ割込み処理が発生するまで(メイン処理において)、メインCPU500aは、メインレジスタ群726aを対象としている。図235(a)の1行目の指標「TMR_IPT:」は、当該タイマ割込み処理の先頭アドレスを示す。2行目のコマンド「EX ALL」によって、メインレジスタ群726aにおける8ビットのレジスタ(Q、A、F、B、C、D、E、H、L)および16ビットのレジスタ(IX、IY)から、サブレジスタ群726bにおける8ビットのレジスタ(Q’、A’、F’、B’、C’、D’、E’、H’、L’)および16ビットのレジスタ(IX’、IY’)に切り換える。こうして、対象がサブレジスタ群726bとなる。そして、タイマ割込み処理で必要な処理を実行した後、5行目のコマンド「EX ALL」によって、サブレジスタ群726bからメインレジスタ群726aに切り換える。6行目のコマンド「EI」によって、割込が許可される。なお、ここでは、サブルーチンからメイン処理に戻る前にコマンド「EI」を行っても適切に割込が許可される。そして、7行目のコマンド「RETI」によって、メイン処理に戻る。
図235(a)に示したコマンドの総コマンドサイズは、2行目のコマンド「EX ALL」2バイト+5行目のコマンド「EX ALL」2バイト+6行目のコマンド「EI」1バイト+7行目のコマンド「RETI」2バイト=7バイトとなり、総実行サイクルは、2行目2サイクル+5行目2サイクル+6行目1サイクル+7行目4サイクル=9サイクルとなる。
ここで、図235(a)のタイマ割込み処理のいずれかのタイミングに、Q’レジスタを設定するコマンドを記述する。タイマ割込み処理でQ’レジスタの設定を行う場合、図235(b)のように、コマンド「EX ALL」の後に、コマンド「LD Q,0F0H」のみを記述すればよい。なお、タイマ割込み処理の場合、処理の最後(5行目)で、再度、コマンド「EX ALL」が実行され、メインレジスタ群726aに切り換わる。
なお、コマンド「LD Q,0F0H」の位置は、タイマ割込み処理内においてQ’レジスタを参照するコマンドより前でなければならない。したがって、図235(b)のように、2行目のコマンド「EX ALL」の直後とするとよい。なお、コマンド「EX ALL」の後に、Q’レジスタを参照するコマンド以外のコマンドを記述し、コマンド「LD Q,0F0H」を記述した後に、Q’レジスタを参照するコマンドを記述することでも実現できる。
図235(b)に示したコマンドの総コマンドサイズは、2行目のコマンド「EX ALL」2バイト+3行目のコマンド「LD Q,0F0H」1バイト+5行目のコマンド「EX ALL」2バイト+6行目のコマンド「EI」1バイト+7行目のコマンド「RETI」2バイト=8バイトとなり、総実行サイクルは、2行目2サイクル+3行目1サイクル+5行目2サイクル+6行目1サイクル+7行目4サイクル=10サイクルとなる。図235(a)と図235(b)とを比較して理解できるように、Q’レジスタの設定を追加しても、総コマンドサイズ=1バイト、総実行サイクル=1サイクルの増加に収まる。
図234を用いて説明したように、メイン処理の初期化処理でQ’レジスタの設定を行うと、総コマンドサイズ=5バイト、総実行サイクル=5サイクル必要となる。また、メイン処理のループ処理を通じて繰り返し行う場合も同様に、総コマンドサイズ=5バイト、総実行サイクル=5サイクル必要となる。これに対し、タイマ割込み処理でQ’レジスタの設定を行うと、コマンド「EX ALL」2個分の記述を省略できるので、総コマンドサイズ=1バイト、総実行サイクル=1サイクルの増加に留まる。したがって、Q’レジスタの設定をタイマ割込み処理のみで実行すると、少なくとも、メモリの増加を抑えることが可能となる。
(第2の実施形態)
続いて、メイン処理にサブレジスタ群726bを対応させ、タイマ割込み処理にメインレジスタ群726aを対応させた例を説明する。したがって、メインCPU500aは、まず、メインレジスタ群726aからサブレジスタ群726bに切り換え、サブレジスタ群726bを参照してメイン処理を実行し、タイマ割込みが生じた場合に、メイン処理を中断し、一旦、サブレジスタ群726bからメインレジスタ群726aに切り換えてタイマ割込み処理を実行し、タイマ割込み処理が終了すると、メインレジスタ群726aからサブレジスタ群726bに切り換えて、メイン処理を再開する。
また、ここでも、メインレジスタ群726aのQレジスタは、初期値がF0hとなっているので、さらに別の値を設定する必要はなく、サブレジスタ群726bのQ’レジスタのみF0hに書き替える。なお、上述したように、Q’レジスタを参照するコマンドが用いられる前に設定する必要がある。そこで、例えば、メイン処理の初期化処理(例えば、図82のCPU初期化処理)において、Q’レジスタを初期化することが考えられる。
図236は、Q’レジスタに値を設定するコマンドの一例を示した図である。ここで、メインCPU500aは、メイン処理の初期化処理において、Q’レジスタにF0hを設定する。ただし、上述したように、メインCPU500aは、現在対象としているレジスタ群であるメインレジスタ群726aのQレジスタの内容は更新できるが、他のレジスタ群であるサブレジスタ群726bのQ’レジスタにはアクセスすることができない。そこで、図234同様、図236のように、1行目のコマンド「EX ALL」によって、メインレジスタ群726aにおける8ビットのレジスタ(Q、A、F、B、C、D、E、H、L)および16ビットのレジスタ(IX、IY)から、サブレジスタ群726bにおける8ビットのレジスタ(Q’、A’、F’、B’、C’、D’、E’、H’、L’)および16ビットのレジスタ(IX’、IY’)に切り換える。
そして、2行目のコマンド「LD Q,0F0H」によって、Q’レジスタにF0hを設定する。以降は、サブレジスタ群726bが参照されてメイン処理が行われることとなる。
図236に示したコマンドの総コマンドサイズは、1行目のコマンド「EX ALL」2バイト+2行目のコマンド「LD Q,0F0H」1バイト=3バイトとなり、総実行サイクルは、1行目2サイクル+2行目1サイクル=3サイクルとなる。
図234を用いて説明したように、メイン処理にメインレジスタ群726aを対応させ、タイマ割込み処理にサブレジスタ群726bを対応させた上で、メイン処理の初期化処理でQ’レジスタの設定を行うと、総コマンドサイズ=5バイト、総実行サイクル=5サイクル必要となる。また、メイン処理のループ処理を通じて繰り返しQ’レジスタの設定を行う場合も同様に、総コマンドサイズ=5バイト、総実行サイクル=5サイクル必要となる。これに対し、メイン処理にサブレジスタ群726bを対応させ、タイマ割込み処理にメインレジスタ群726aを対応させ、メイン処理の初期化処理でQ’レジスタの設定を行うと、コマンド「EX ALL」1個分の記述を省略できるので、総コマンドサイズ=3バイト、総実行サイクル=3サイクルの増加に抑えることができる。
また、上述したように、Q’レジスタは利用頻度が高いので、Q’レジスタの値は確実に設定されるべきである。そこで、Q’レジスタの設定を、メイン処理の初期化処理で1度のみ行うのに代えて、または、加えて、メイン処理のループ処理を通じて繰り返し行うことも考えられる。例えば、図236のコマンド群のうち、1行目のコマンド「EX ALL」のみをメイン処理の初期化処理で行い、図236のコマンド群のうち、2行目のコマンド「LD Q,0F0H」を、図88~図97(スロットマシン400)のいずれかで行う。こうすることで、メイン処理のループ処理に応じて、毎回、Q’レジスタにF0hを設定することができるので、仮に、Q’レジスタが初期値F1hになってしまうことがあったとしても、Q’レジスタの値を確実にF0hに設定することができ、Q’レジスタの値を安定的に維持することが可能となる。
ただし、メイン処理においてQ’レジスタを参照するコマンドを利用するので、Q’レジスタを参照するコマンドを利用するまでにQ’レジスタにF0hを設定する。
また、Q’レジスタの設定を、メイン処理の初期化処理で1度のみ行う、または、メイン処理のループ処理で繰り返し行うのに代えて、または、加えて、タイマ割込み処理を通じて繰り返し行うことも考えられる。こうすることで、タイマ割込みが生じる度に、Q’レジスタにF0hを設定することができるので、仮に、Q’レジスタが初期値F1hになってしまうことがあったとしても、Q’レジスタの値を確実にF0hに設定することができ、Q’レジスタの値を安定的に維持することが可能となる。
図237は、Q’レジスタに値を設定するコマンドの一例を示した図である。ここでは、タイマ割込み処理でQ’レジスタの設定を行う。なお、タイマ割込み処理が発生するまで(メイン処理において)、メインCPU500aは、サブレジスタ群726bを対象としている。具体的に、図237の1行目の指標「TMR_IPT:」は、当該タイマ割込み処理の先頭アドレスを示す。2行目のコマンド「LD Q,0F0H」によって、Q’レジスタにF0hを設定する。そして、メイン処理で用いていたレジスタの値を退避するため、3行目のコマンド「EX ALL」によって、サブレジスタ群726bにおける8ビットのレジスタ(Q’、A’、F’、B’、C’、D’、E’、H’、L’)および16ビットのレジスタ(IX’、IY’)から、メインレジスタ群726aにおける8ビットのレジスタ(Q、A、F、B、C、D、E、H、L)と、16ビットのレジスタ(IX、IY)に切り換える。こうして、対象がメインレジスタ群726aとなる。続いて、タイマ割込み処理で必要な処理を実行した後、5行目のコマンド「EX ALL」によって、メインレジスタ群726aからサブレジスタ群726bに切り換える。6行目のコマンド「EI」によって、割込が許可される。なお、ここでは、サブルーチンからメイン処理に戻る前にコマンド「EI」を行っても適切に割込が許可される。そして、7行目のコマンド「RETI」によって、メイン処理に戻る。
図237に示したコマンドの総コマンドサイズは、2行目のコマンド「LD Q,0F0H」1バイト+3行目のコマンド「EX ALL」2バイト+5行目のコマンド「EX ALL」2バイト+6行目のコマンド「EI」1バイト+7行目のコマンド「RETI」2バイト=8バイトとなり、総実行サイクルは、2行目1サイクル+3行目2サイクル+5行目2サイクル+6行目1サイクル+7行目4サイクル=10サイクルとなる。
なお、コマンド「LD Q,0F0H」の位置は、タイマ割込み処理内においてコマンド「EX ALL」が実行されるより前でなければならない。したがって、3行目のコマンド「EX ALL」の直前とするとよい。
ここでは、メイン処理にサブレジスタ群726bを対応させ、タイマ割込み処理にメインレジスタ群726aを対応させた上で、Q’レジスタの設定を、メイン処理の初期化処理で1度のみ行う、メイン処理のループ処理を通じて繰り返し行う、または、タイマ割込み処理を通じて繰り返し行っている。いずれの場合においても、メイン処理にメインレジスタ群726aを対応させ、タイマ割込み処理にサブレジスタ群726bを対応させて、メイン処理の初期化処理でQ’レジスタの設定を行う場合に比べ、コマンド「EX ALL」1個分の記述を省略できるので、総コマンドサイズ=3バイト、総実行サイクル=3サイクルの増加に留めつつ、仮に、Q’レジスタが初期値F1hになってしまうことがあったとしても、Q’レジスタの値を確実にF0hに設定することができ、Q’レジスタの値を安定的に維持することが可能となる。
<レジスタ群の切り換え>
ところで、メイン処理の実行中にタイマ割込みが発生すると、その割込みタイミングにおいてレジスタがどのような値となっているかに拘わらず、タイマ割込み処理においても継続してレジスタが利用される。したがって、タイマ割込みが生じた場合に、その割込みタイミングにおけるレジスタの内容を別途保持する必要がある。例えば、タイマ割込み処理からメイン処理に戻ったときにメイン処理をスムーズに再開するため、割込みタイミングにおけるレジスタの内容を、退避コマンドを用いてメインRAM500cのスタック領域に退避しなければならない。しかし、退避コマンドは、退避すべきレジスタの数に応じて多くなり、コマンドサイズのみならず、サイクル数も増える。
本実施形態では、上述したように、コマンド「EX ALL」によって、メインレジスタ群726aにおける8ビットのレジスタ(Q、A、F、B、C、D、E、H、L)および16ビットのレジスタ(IX、IY)と、サブレジスタ群726bにおける8ビットのレジスタ(Q’、A’、F’、B’、C’、D’、E’、H’、L’)および16ビットのレジスタ(IX’、IY’)とを切り換えている。かかるコマンドでは、メイン処理とタイマ割込み処理との切り換えにおいて、対象となるレジスタ群を一度に退避するとともに、退避していた他のレジスタ群を一度に復帰させることができる。かかるコマンド「EX ALL」は、コマンドサイズが2バイトに抑えられ、サイクル数も2サイクルしか要さない。
また、コマンド「CALLEX mn」、コマンド「RETEX」によって、メインレジスタ群726aおよびサブレジスタ群726bを含むレジスタバンク単位で、第1レジスタバンク726と第2レジスタバンク728とを切り換えている。かかるコマンドでは、対象となるレジスタバンクを一度に退避するとともに、退避していた他のレジスタバンクを一度に復帰させることができる。かかるコマンド「CALLEX mn」は、アドレスmnを2000h~20FFhに限定すればコマンドサイズが2バイトに抑えられ、サイクル数も4サイクルしか要さない。コマンド「RETEX」は、コマンドサイズが2バイトに抑えられ、サイクル数も5サイクルしか要さない。以下、このような切換コマンドを第1の実施形態および第2の実施形態に当て嵌めて説明する。
図238は、レジスタバンクおよびレジスタ群の遷移を説明するための図である。上述したように、メイン処理にメインレジスタ群726aを対応させ、タイマ割込み処理にサブレジスタ群726bを対応させた例(第1の実施形態)において、メインCPU500aは、メインレジスタ群726aを参照してメイン処理を順次実行し、タイマ割込みが生じた場合に、メイン処理を中断し、コマンド「EX ALL」により、一旦、メインレジスタ群726aからサブレジスタ群726bに切り換えて(1)、タイマ割込み処理を実行し、タイマ割込み処理が終了すると、コマンド「EX ALL」により、サブレジスタ群726bからメインレジスタ群726aに切り換えて(2)、メイン処理を再開する。また、メインCPU500aは、遊技制御処理における所定のタイミングで、コマンド「CALLEX mn」により、第1レジスタバンク726から第2レジスタバンク728に切り換えて(3)、遊技制御外処理を実行し、遊技制御外処理が完了すると、コマンド「RETEX」により、第2レジスタバンク728から第1レジスタバンク726に切り換えて(4)、遊技制御処理を再開する。
また、メイン処理にサブレジスタ群726bを対応させ、タイマ割込み処理にメインレジスタ群726aを対応させた例(第2の実施形態)において、メインCPU500aは、まず、コマンド「EX ALL」により、メインレジスタ群726aからサブレジスタ群726bに切り換え(1)、サブレジスタ群726bを参照してメイン処理を実行し、タイマ割込みが生じた場合に、メイン処理を中断し、コマンド「EX ALL」により、一旦、サブレジスタ群726bからメインレジスタ群726aに切り換えて(2)、タイマ割込み処理を実行し、タイマ割込み処理が終了すると、コマンド「EX ALL」により、メインレジスタ群726aからサブレジスタ群726bに切り換えて(1)、メイン処理を再開する。また、メインCPU500aは、遊技制御処理における所定のタイミングで、コマンド「CALLEX mn」により、第1レジスタバンク726から第2レジスタバンク728に切り換えて(3)、遊技制御外処理を実行し、遊技制御外処理が完了すると、コマンド「RETEX」により、第2レジスタバンク728から第1レジスタバンク726に切り換えて(4)、遊技制御処理を再開する。
このように、2つのレジスタバンクについて、第1レジスタバンク726は使用領域に対応させ、第2レジスタバンク728は別領域に対応させ、第1レジスタバンク726のメインレジスタ群726aおよびサブレジスタ群726bの一方をメイン処理に対応させ、他方をタイマ割込み処理に対応させることで、各領域の独立性、排他性を担保することができる。また、これらの切換とともに、切換コマンドを用いて、少なくともレジスタ群全体を一体的に切り換えることで、各領域の独立性、排他性を確保しつつ、コマンドサイズやサイクル数を削減することが可能となる。なお、ここでは、図238を用いて説明したように、第1レジスタバンク726のメインレジスタ群726aおよびサブレジスタ群726bの一方をメイン処理に対応させ、他方をタイマ割込み処理に対応させ、第2レジスタバンク728のメインレジスタ群728aおよびサブレジスタ群728bの一方もしくは両方を遊技制御外処理に対応させる例を挙げて説明したが、例えば、メイン処理、タイマ割込み処理、遊技制御外処理に対応させるレジスタバンクおよびレジスタ群は、任意に設定することができる。例えば、第2レジスタバンク728のメインレジスタ群728aおよびサブレジスタ群728bの一方をメイン処理に対応させ、他方をタイマ割込み処理に対応させ、第1レジスタバンク726のメインレジスタ群726aおよびサブレジスタ群726bの一方もしくは両方を遊技制御外処理に対応させたり、第1レジスタバンク726のメインレジスタ群726aをメイン処理に対応させ、第2レジスタバンク728のメインレジスタ群728aをタイマ割込み処理に対応させ、第1レジスタバンク726のサブレジスタ群726bおよび第2レジスタバンク728のサブレジスタ群728bの一方もしくは両方を遊技制御外処理に対応させるとしてもよい。
続いて、メインCPU500aの電源が断たれた場合について説明する。メインCPU500aは、メイン処理を実行している間に電源が断たれると、メイン処理に対応するレジスタバンクのレジスタ群(第1レジスタバンク726のメインレジスタ群726aまたはサブレジスタ群726b)を、コマンド「PUSH」(例えば、コマンド「PUSH ALL」)等を通じて、メインRAM500cのスタック領域に退避させ、その後、例えば、図97に示した電源断時退避処理を行う。
ここでは、メイン処理に対応するレジスタ群(メインレジスタ群726aまたはサブレジスタ群726b)を退避させているが、タイマ割込み処理や遊技制御外処理に対応するレジスタ群の退避を割愛している。かかるタイマ割込み処理に対応するレジスタ群には、タイマ割込み処理が開始された後、必要な情報が設定され、すなわち、メイン処理からレジスタの内容が引き継がれることなく、タイマ割込み処理内でのみ参照され、タイマ割込み処理が終了すると、そのレジスタの内容は不要となる。同様に、遊技制御外処理に対応するレジスタ群には、遊技制御外処理が開始された後、必要な情報が設定され、すなわち、遊技制御処理からレジスタの内容が引き継がれることなく、遊技制御外処理内でのみ参照され、遊技制御外処理が終了すると、そのレジスタの内容は不要となる。したがって、タイマ割込み処理や遊技制御外処理に対応するレジスタ群を退避させなくても問題ない。
また、メイン処理中ではなく、タイマ割込み処理中や遊技制御外処理中に電源が断たれると、以下のように処理が遂行される。タイマ割込み処理は、電源断による割込みより優先されている。すなわち、タイマ割込み処理中に電源断の割込みが生じたとしても、電源断時退避処理は即座に実行されず、タイマ割込み処理が終了してはじめて実行される。換言すれば、電源断時退避処理が開始するタイミングでは、タイマ割込み処理が完了している。なお、タイマ割込み処理は、上記のように、タイマ割込み処理内でのみ参照され、タイマ割込み処理が終了すると、そのレジスタの内容は不要となる。したがって、タイマ割込み処理中に電源断になったとしても、電源断時退避処理が開始するタイミングでは、タイマ割込み処理にかかるレジスタの内容を退避する必要がなくなるので問題は生じない。同様に、遊技制御外処理は、電源断による割込みより優先されている。すなわち、遊技制御外処理中に電源断の割込みが生じたとしても、電源断時退避処理は即座に実行されず、遊技制御外処理が終了してはじめて実行される。換言すれば、電源断時退避処理が開始するタイミングでは、タイマ割込み処理が完了している。なお、遊技制御外処理は、上記のように、遊技制御外処理内でのみ参照され、遊技制御外処理が終了すると、そのレジスタの内容は不要となる。したがって、遊技制御外処理中に電源断になったとしても、電源断時退避処理が開始するタイミングでは、遊技制御外処理にかかるレジスタの内容を退避する必要がなくなるので問題が生じない。
なお、電源断によって、電源断時のレジスタバンクおよびレジスタ群の情報は消去される。そして、電源断の後、電源復帰すると、レジスタバンクおよびレジスタ群は、初期値である第1レジスタバンク726およびそのメインレジスタ群726aが設定される。したがって、電源復帰すると最初に実行される処理をメイン処理とし、そのメイン処理に、第1レジスタバンク726およびそのメインレジスタ群726aを対応させている。こうして、電源復帰後は、メイン処理から開始されることとなる。ここでは、電源断時に、第1レジスタバンク726およびそのメインレジスタ群726aを退避させているので、メイン処理を安定かつ確実に遂行することが可能となる。
上述した実施形態では、第1のレジスタ群をメインレジスタ群とし、第1レジスタをQレジスタとし、第1の値をF0hとし、第2のレジスタ群をサブレジスタ群とし、第2レジスタをQ’レジスタとし、第2の値をF0hとする例を挙げて説明したが、かかる場合に限らず、第1のレジスタ群をサブレジスタ群とし、第1レジスタをQ’レジスタとし、第1の値をF1hとし、第2のレジスタ群をメインレジスタ群とし、第2レジスタをQレジスタとし、第2の値をF1hとしてもよい。かかる構成では、メインレジスタ群のQレジスタにF1hを書き替えることとなる。また、上述した実施形態では、第1のレジスタバンクを第1レジスタバンク726とし、第2のレジスタバンクを第2レジスタバンク728とする例を挙げて説明したが、かかる場合に限らず、第1のレジスタバンクを第2レジスタバンク728とし、第2のレジスタバンクを第1レジスタバンク726としてもよい。
<レジスタのアクセス方式>
ところで、従来のマイクロプロセッサでは、メインROM500bおよびメインRAM500cが割り当てられたアドレス空間(メモリ空間)と、入出力部704(入出力部704に対応するデバイス)が割り当てられたアドレス空間(I/O空間)とが独立して管理されていた。ここで、メインROM500bおよびメインRAM500cが割り当てられたメモリ空間をメモリマップと言う場合があり、入出力部704が割り当てられたI/O空間をI/Oマップという場合がある。
従来のマイクロプロセッサは、メモリ空間およびI/O空間それぞれに対し、専用の命令を使用してアクセスしなければならなかった。例えば、従来のマイクロプロセッサが、メインROM500bおよびメインRAM500cのメモリ空間専用の命令を使用すると、メモリリクエスト(MREQ)端子がイネーブル(有効)になることでメインROM500bやメインRAM500cへのアクセスが可能となる。また、従来のマイクロプロセッサが、入出力部704のI/O空間専用の命令を使用すると、I/Oリクエスト(IORQ)端子がイネーブル(有効)になることで入出力部704へのアクセスが可能となる。したがって、従来のマイクロプロセッサは、アクセスする対象が、メインROM500bやメインRAM500cであるか、入出力部704であるかに応じて、使用する命令を変えなければならなかった。ここで、従来のマイクロプロセッサが、入出力部704(デバイス)にアクセスするために設けられたアクセス方式をI/OマップドI/O方式と言う。かかるI/OマップドI/O方式に基づくコマンドにより、メインCPU500aは、入出力部704からレジスタに情報を読み出したり、レジスタから入出力部704に情報を書き込むことができる。
しかし、上述したように、本実施形態では、入出力部704のアドレス空間と、メインROM500bおよびメインRAM500cのアドレス空間とを一体化し、メモリ空間のFE00h~FFFFhに入出力部704を割り当てている。そのため、I/O空間という概念がなく、メインCPU500aは、メモリ空間のFE00h~FFFFhに割り当てられた入出力部704に、メモリ空間専用の命令を利用することでアクセスすることができる。ここで、メインCPU(プロセッサ)500aが、メインROM(記憶手段)500bやメインRAM(記憶手段)500cにアクセスするために設けられたアクセス方式をメモリマップドI/O方式と言う。かかるメモリマップドI/O方式に基づくコマンドにより、メインCPU500aは、入出力部704からレジスタに情報を読み出したり、レジスタから入出力部704に情報を書き込むことができる。
このように、本実施形態において、メインCPU500aは、メモリマップドI/O方式によって入出力部704にアクセスする。一方、従来のマイクロプロセッサのプログラムをそのまま流用できる等の汎用性の観点から、本実施形態において、I/OマップドI/O方式によるアクセスもできるようになっている。したがって、メインCPU500aは、メモリマップドI/O方式に加え、メモリ空間の一部をI/O空間に見立て、I/OマップドI/O方式によって入出力部704にアクセスすることが可能となる。なお、従来のマイクロプロセッサでもメモリマップドI/O方式により入出力部704にアクセスすることは可能であったが、I/OマップドI/O方式を用いるかメモリマップドI/O方式を用いるかは初期起動時に選択しなければならず、メモリマップドI/O方式を選択すると、I/OマップドI/O方式を用いることができなかった。
図239は、アクセス方式の利用態様を説明するための説明図である。メモリマップドI/O方式は、LD命令やLDIR命令等、メインROM500bやメインRAM500cにアクセスするために準備された多数のコマンド(命令)を利用できる利点がある。一方、メモリマップドI/O方式は、入出力部704に対し、単なる読み書きを行う場合には、I/OマップドI/O方式に比べ、コマンドサイズが大きくなる欠点を有す。これに対し、I/OマップドI/O方式は、入出力部704に対し、単なる読み書きを行う場合には、メモリマップドI/O方式に比べ、コマンドサイズが小さくて済む利点がある。一方、I/OマップドI/O方式は、IN命令やOUT命令等、入出力部704にアクセスするために準備された限定的なコマンド(命令)しか利用できない欠点を有す。
プログラムにおいては、通常、入出力部704の単純な読み書きが多いので、メモリマップドI/O方式ではなく、I/OマップドI/O方式を用いることでコマンドサイズを小さくすることが可能となる。例えば、入出力部704の所定のアドレスに格納された値をAレジスタに読み出す場合、メモリマップドI/O方式のコマンド「LD A,(mn)」(mnは2バイトの整数)を利用すると、コマンドサイズが3バイト必要となるのに対し、I/OマップドI/O方式のコマンド「IN A,(g)」(gは1バイトの整数)を利用すると、コマンドサイズは2バイトで済む。したがって、通常、I/OマップドI/O方式を用いることとしている。
しかし、プログラムのうちの一部の処理においては、I/OマップドI/O方式のコマンド(命令)より、メモリマップドI/O方式のコマンド(命令)を利用した方が、遊技制御処理を行うための制御領域の容量を削減できる場合がある。具体的に、メモリ空間に割り当てられた入出力部704の同一のアドレスに対し、IN命令やOUT命令といったI/OマップドI/O方式によるコマンドでアクセスするより、LD命令等のメモリマップドI/O方式によるコマンドでアクセスした方が、総コマンドサイズが小さくなる場合がある。したがって、ここでは、その処理の内容に応じて、総コマンドサイズが小さくなる適切なアクセス方式を用いる。
図240は、サブコマンド送信処理の一例を説明するためのフローチャートであり、図241は、サブコマンド送信処理を実現するための具体的なコマンドの一例を示した図である。かかるサブコマンド送信処理は、上述した、図23のステップS100-65、および、図98のステップS3100-11において実行される。サブコマンド送信処理では、指令電文(コマンド)が、送信バッファ(FIFO)を通じて副制御基板330、502に送信される。なお、ここでは、説明の便宜上、メインCPU500aがサブコマンド送信処理S3100-11を実行する例を挙げ、また、本実施形態に関係のないサブコマンド累積データに関する処理を省略する。かかる図240の説明におけるステップSの数値は、本図の説明においてのみ用いることとする。
なお、ここでは、副制御基板502に送信する4バイトの指令電文を構成する電文1、電文2、電文3、電文4が、それぞれDレジスタ、Eレジスタ、Bレジスタ、Cレジスタに設定されている。ただし、送信する指令電文によっては、電文2~4について事後的に設定する場合がある。また、電文3、4について電文が設定されていない場合、電文3、4として所定の値を設定する場合がある。
図240に示すように、まず、メインCPU500aは、各レジスタの値を退避させ(S1)、電文1に基づいて電文2~4が既に設定済みか否か判定する(S2)。メインCPU500aは、電文2~4が設定済みであれば(S2におけるYES)、ステップS6に移行し、設定済みでなければ(S2におけるNO)、メインRAM500cから取得した値を電文2に設定し(S3)、電文1に基づいて電文3、4が既に設定済みか否か判定する(S4)。メインCPU500aは、電文3、4が設定済みであれば(S4におけるYES)、ステップS6に移行し、設定済みでなければ(S4におけるNO)、所定の値を電文3、4に設定する(S5)。
続いて、メインCPU500aは、送信先のアドレスを設定し(S6)、電文2を被加算数として設定し(S7)、割込みを禁止する(S8)。メインCPU500aは、電文1~4を出力し(S9)、電文1~4のチェックサムを算出すると(S10)、算出したチェックサムも出力する(S11)。最後に、メインCPU500aは、割込みを許可し(S12)、退避させていた各レジスタの値を復帰させる(S13)。
具体的に、図241の1行目の指標「CMDPROC」は当該サブコマンド送信処理の先頭アドレスを示す。かかる指標「CMDPROC」によって当該サブコマンド送信処理が呼び出される。2行目のコマンド「PUSH HL」によって、HLレジスタの値がスタック領域に退避され、3行目のコマンド「PUSH BC」によって、BCレジスタの値がスタック領域に退避される。かかる2、3行目のコマンドが、レジスタの値を退避させる図240のステップS1に相当する。
図241の4行目のコマンド「LD A,D」によって、Dレジスタの値、すなわち、電文1の値がAレジスタに設定され、5行目のコマンド「JCP C,A,0B0H,CMDPROC01」によって、Aレジスタの値と、固定値「B0H」とが比較され、その結果、B0H未満であれば(キャリーフラグが立っていれば)、12行目の指標「CMDPROC01」に移動する。こうして、電文1の値がB0H未満であれば、次の処理を省略して12行目の指標「CMDPROC01」に移動することができる。かかる4、5行目のコマンドが、電文2~4が既に設定済みであればステップS6に移行する図240のステップS2に相当する。
図241の6行目のコマンド「LDQ A,(E)」によって、Qレジスタの値をアドレスの上位1バイトとし、Eレジスタの値をアドレスの下位1バイトとし、そのアドレスが示すメモリ領域に格納された1バイトの値(電文2)がAレジスタに設定され、7行目のコマンド「LD E,A」によって、Aレジスタの値、すなわち、電文2がEレジスタに設定される。かかる6、7行目のコマンドが、電文2を設定する図240のステップS3に相当する。
図241の8行目のコマンド「JBIT Z,3,D,CMDPROC01」によって、Dレジスタの値(電文1)のビット3が0であれば(ゼロフラグが立っていれば)、12行目の指標「CMDPROC01」に移動する。こうして、電文1のビット3が0であれば、次の処理を省略して12行目の指標「CMDPROC01」に移動することができる。かかる8行目のコマンドが、電文3、4が既に設定済みであればステップS6に移行する図240のステップS4に相当する。
図241の9行目のコマンド「IN HL,(@CID____)」によって、Uレジスタの値をアドレスの上位1バイトとし、シンボル「@CID____」自体(1バイト値)を下位1バイトとし、そのアドレスが示すメモリ領域に格納された2バイトの値がHLレジスタに入力される。具体的には、そのアドレスが示すメモリ領域に格納された1バイトの値がLレジスタに入力され、そのアドレスに1を加えた値が示すメモリ領域に格納された1バイトの値がHレジスタに入力される。10行目のコマンド「LD B,H」によって、Hレジスタの値がBレジスタに設定され、11行目のコマンド「LD C,L」によって、Lレジスタの値がCレジスタに設定される。かかる9~11行目のコマンドが、電文3、4を設定する図240のステップS5に相当する。
続いて、図241の13行目のコマンド「LD H,C」によって、Cレジスタの値がHレジスタに設定される。ここでは、Cレジスタに格納されている電文4をHレジスタに転送させることで、OUT命令で用いられるCレジスタを開放している。14行目のコマンド「LD C,@S1DT___」によって、シンボル「@S1DT___」自体がCレジスタに設定される。なお、シンボル「@S1DT___」は、送信専用の非同期シリアル通信回路の送信バッファ(FIFO)を示している。かかる13、14行目のコマンドが、送信先のアドレスを設定する図240のステップS6に相当する。
図241の15行目のコマンド「LD A,E」によって、Eレジスタの値(電文2)がAレジスタに設定される。これは、図240のステップS10においてチェックサムを算出する際にAレジスタの値を被加算数とするためである。かかる15行目のコマンドが、Aレジスタに電文2を設定する図240のステップS7に相当する。そして、16行目のコマンド「DI」によって、割込が禁止される。かかる16行目のコマンドが、図240のステップS8に相当する。
図241の17行目のコマンド「OUT (C),D」によって、Uレジスタの値をアドレスの上位1バイトとし、Cレジスタの値を下位1バイトとし、そのアドレスが示すメモリ領域にDレジスタの値(電文1)が出力される。18行目のコマンド「OUT (C),A」によって、Uレジスタの値をアドレスの上位1バイトとし、Cレジスタの値を下位1バイトとし、そのアドレスが示すメモリ領域にAレジスタの値(電文2)が出力される。19行目のコマンド「OUT (C),B」によって、Uレジスタの値をアドレスの上位1バイトとし、Cレジスタの値を下位1バイトとし、そのアドレスが示すメモリ領域にBレジスタの値(電文3)が出力される。20行目のコマンド「OUT (C),H」によって、Uレジスタの値をアドレスの上位1バイトとし、Cレジスタの値を下位1バイトとし、そのアドレスが示すメモリ領域にHレジスタの値(電文4)が出力される。ここでは、シンボル「@S1DT___」自体(アドレス値)に、Dレジスタ、Aレジスタ(Eレジスタ)、Bレジスタ、Hレジスタ(Cレジスタ)の順、すなわち、電文1、2、3、4の順にデータが出力されている。かかる17~20行目のコマンドが、電文1~4を出力する図240のステップS9に相当する。
図241の21行目のコマンド「ADD A,D」によって、Aレジスタの値(電文2)にDレジスタの値(電文1)が加算され、その結果がAレジスタに保持される。22行目のコマンド「ADD A,B」によって、Aレジスタの値(チェックサム値)にBレジスタの値(電文3)が加算され、その結果がAレジスタに保持される。23行目のコマンド「ADD A,H」によって、Aレジスタの値(チェックサム値)にHレジスタの値(電文4)が加算され、その結果がAレジスタに保持される。かかる21~23行目のコマンドが、電文1~4のチェックサムを算出する図240のステップS10に相当する。
図241の24行目のコマンド「OUT (C),A」によって、Uレジスタの値をアドレスの上位1バイトとし、Cレジスタの値を下位1バイトとし、そのアドレスが示すメモリ領域にAレジスタの値(チェックサム値)が出力される。こうして、電文1~4とチェックサム値の合計5バイトの指令電文が送信バッファに出力される。かかる24行目のコマンドが、算出したチェックサムを出力する図240のステップS11に相当する。そして、25行目のコマンド「EI」によって、割込が許可される。かかる25行目のコマンドが、図240のステップS12に相当する。
図241の26行目のコマンド「POP BC」によって、スタック領域に退避されていたデータがBCレジスタに復帰され、27行目のコマンド「POP HL」によって、スタック領域に退避されていたデータがHLレジスタに復帰される。かかる26、27行目のコマンドが、レジスタの値を復帰させる図240のステップS13に相当する。そして、28行目のコマンド「RET」によって、呼び出し元の処理に復帰する。
図241においては、図240におけるサブコマンド送信処理を、IN命令やOUT命令を利用したI/OマップドI/O方式で実現している。しかしながら、上述したように、プログラムのうちの一部の処理においては、メモリマップドI/O方式の命令を利用した方が、コマンドサイズが小さくなる場合がある。以下、一部の処理にメモリマップドI/O方式を適用する例を挙げて説明する。
図242は、サブコマンド送信処理を実現するための他のコマンドの一例を示した図である。ここでも、図241同様、副制御基板502に送信する4バイトの電文1、2、3、4が、それぞれDレジスタ、Eレジスタ、Bレジスタ、Cレジスタに設定されている。
図241のコマンド群と図242のコマンド群とを比較すると、ステップS5に対応する(1)で示したコマンド群、および、ステップS6~S11に対応する(2)で示したコマンド群が相違している。ここでは、(1)のコマンド群および(2)のコマンド群それぞれに焦点を当てて、総コマンドサイズの違いを説明する。
(1)のコマンド群について、図242の9行目のコマンド「LD BC,(@CID____)」によって、シンボル「@CID____」が示すメモリ領域に格納された2バイトの値がBCレジスタに設定される。具体的に、シンボル「@CID____」が示すメモリ領域に格納された1バイトの値がCレジスタに入力され、シンボル「@CID____」+1が示すメモリ領域に格納された1バイトの値がBレジスタに入力される。かかる9行目のコマンドが、電文3、4を設定する図240のステップS5に相当する。
図241の例においては、I/OマップドI/O方式が用いられているので、IN命令で入力した値の設定先としてHLレジスタは選択できるが、BCレジスタを選択できない。換言すれば、コマンド「IN BC,(mn)」(mnは2バイトの整数)はコマンドとして準備されていない。したがって、図241の例においては、シンボル「@CID____」が示すメモリ領域に格納された2バイト値を、一旦、HLレジスタに保持し、その後、BレジスタおよびCレジスタにそれぞれ転送しなければならない。これに対し、図242のメモリマップドI/O方式では、LD命令を利用することで、シンボル「@CID____」が示すメモリ領域に格納された2バイトの値を、直接、BCレジスタに設定することができる。
ここで、図241の(1)のコマンド群の総コマンドサイズは、9行目のコマンド「IN HL,(@CID____)」3バイト+10行目のコマンド「LD B,H」1バイト+11行目のコマンド「LD C,L」1バイト=5バイトであるのに対し、図242の(1)のコマンド群(コマンド)の総コマンドサイズは、9行目のコマンド「LD BC,(@CID____)」4バイトとなる。したがって、I/OマップドI/O方式をメモリマップドI/O方式に変更することで総コマンドサイズを1バイト削減できることが理解できる。
続いて、(2)のコマンド群について、図242の11行目のコマンド「LD HL,@S2DT___」によって、シンボル「@S2DT___」自体の2バイト値がHLレジスタに設定される。なお、シンボル「@S2DT___」は、送信専用の非同期シリアル通信回路の入力バッファを示している。かかる11行目のコマンドが、送信先のアドレスを設定する図240のステップS6に相当する。図241の例においては、I/OマップドI/O方式を用いているので、OUT命令を利用するためにCレジスタを開放しなければならなかった。これに対し、メモリマップドI/O方式では、Cレジスタを開放する必要がなく、送信先のアドレスをHLレジスタに保持することができる。したがって、図242の例では、図241の13行目のコマンド「LD H,C」を削除することができる。
図242の12行目のコマンド「LD A,E」によって、Eレジスタの値(電文2)がAレジスタに設定される。かかる12行目のコマンドが、Aレジスタに電文2を設定する図240のステップS7に相当する。そして、13行目のコマンド「DI」によって、割込が禁止される。かかる13行目のコマンドが、図240のステップS8に相当する。
図242の14行目のコマンド「LD (HL),D」によって、HLレジスタのアドレスで示されるメモリ領域にDレジスタの値(電文1)が格納される。15行目のコマンド「LD (HL),A」によって、HLレジスタのアドレスで示されるメモリ領域にAレジスタの値(電文2)が格納される。16行目のコマンド「LD (HL),B」によって、HLレジスタのアドレスで示されるメモリ領域にBレジスタの値(電文3)が格納される。17行目のコマンド「LD (HL),C」によって、HLレジスタのアドレスで示されるメモリ領域にCレジスタの値(電文4)が格納される。ここでは、シンボル「@S1DT___」自体(アドレス値)に、Dレジスタ、Aレジスタ(Eレジスタ)、Bレジスタ、Cレジスタの順、すなわち、電文1、2、3、4の順にデータが格納され、その結果、電文1、2、3、4の順にデータが送信バッファに出力されることになる。かかる14~17行目のコマンドが、電文1~4を出力する図240のステップS9に相当する。
図242の18行目のコマンド「ADD A,D」によって、Aレジスタの値(電文2)にDレジスタの値(電文1)が加算され、その結果がAレジスタに保持される。19行目のコマンド「ADD A,B」によって、Aレジスタの値(チェックサム値)にBレジスタの値(電文3)が加算され、その結果がAレジスタに保持される。20行目のコマンド「ADD A,C」によって、Aレジスタの値(チェックサム値)にCレジスタの値(電文4)が加算され、その結果がAレジスタに保持される。かかる18~20行目のコマンドが、電文1~4のチェックサムを算出する図240のステップS10に相当する。
図242の21行目のコマンド「LD (HL),A」によって、HLレジスタのアドレスで示されるメモリ領域にAレジスタの値(チェックサム値)が格納される。こうして、電文1~4とチェックサム値の合計5バイトの指令電文が送信バッファに格納され、その結果、指令電文が送信バッファに出力されることになる。かかる21行目のコマンドが、算出したチェックサムを出力する図240のステップS11に相当する。
図241の例においては、I/OマップドI/O方式により、入出力部704に出力するためにOUT命令が利用されている。これに対し、メモリマップドI/O方式では、LD命令を利用することができる。したがって、送信先のアドレスをCレジスタではなくHLレジスタに保持し、LD命令によって各レジスタの値を、HLレジスタのアドレスが示すメモリ領域に格納することでコマンドサイズを削減することが可能となる。
ここで、図241の(2)のコマンド群の総コマンドサイズは、13行目のコマンド「LD H,C」1バイト+14行目のコマンド「LD C,@S1DT___」2バイト+15行目のコマンド「LD A,E」1バイト+16行目のコマンド「DI」1バイト+17行目のコマンド「OUT (C),D」2バイト+18行目のコマンド「OUT (C),A」2バイト+19行目のコマンド「OUT (C),B」2バイト+20行目のコマンド「OUT (C),H」2バイト+21行目のコマンド「ADD A,D」1バイト+22行目のコマンド「ADD A,B」1バイト+23行目のコマンド「ADD A,H」1バイト+24行目のコマンド「OUT (C),A」2バイト=18バイトであるのに対し、図242の(2)のコマンド群の総コマンドサイズは、11行目のコマンド「LD HL,@S2DT___」3バイト+12行目のコマンド「LD A,E」1バイト+13行目のコマンド「DI」1バイト+14行目のコマンド「LD (HL),D」1バイト+15行目のコマンド「LD (HL),A」1バイト+16行目のコマンド「LD (HL),B」1バイト+17行目のコマンド「LD (HL),C」1バイト+18行目のコマンド「ADD A,D」1バイト+19行目のコマンド「ADD A,B」1バイト+20行目のコマンド「ADD A,C」1バイト+21行目のコマンド「LD (HL),A」1バイト=13バイトとなる。
したがって、(2)のコマンド群に関し、I/OマップドI/O方式をメモリマップドI/O方式に変更することで総コマンドサイズを5バイト削減できる。図241の(2)のコマンド群と図242の(2)のコマンド群とを比較して理解できるように、OUT命令をLD命令に置き換える毎に、総コマンドサイズを1バイト削減可能となる。
このように、本実施形態では、I/OマップドI/O方式により入出力部704にアクセスしつつ、処理の内容によっては、総コマンドサイズが小さくなるメモリマップドI/O方式により入出力部704にアクセスしている。このように、同一のプログラムにおいて、I/OマップドI/O方式とメモリマップドI/O方式とを混在させ、処理の内容によって総コマンドサイズが小さくなるアクセス方式を適用することで、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
<メモリマップドI/O方式の利用例1>
上述したように従来のマイクロプロセッサでは、I/OマップドI/O方式を用いて入出力部704にアクセスしていた。この場合、入出力部704を割り当て得るI/O空間は256バイトに制限される。換言すれば、従来のマイクロプロセッサでは、1バイトのアドレス情報のみによって入出力部704を特定することができる。
図243は、CPU初期化処理を実現するためのコマンド群の一部を示した図であり、図244は、CPU初期化処理で参照するテーブルを示した図である。ここでは、説明の便宜上、上述したCPU初期化処理のうちの初期設定処理(図22のステップS100-1、および、図82のステップS2000-1)を説明する。初期設定処理では、入出力部704(内蔵レジスタ)に設定データを設定することで入出力部704の初期設定を行う。なお、ここでは、メインCPU500aが初期設定処理S2000-1を実行する例を挙げる。
図243の1行目のコマンド「LD HL,T_CPU_REG」によって、読み出し元となるCPU内蔵レジスタ設定データテーブルのデータ群の先頭アドレス「T_CPU_REG」をHLレジスタに設定する。2行目のコマンド「LD B,@NUM_CPU_REG」によって、シンボル「@NUM_CPU_REG」自体がBレジスタに設定される。
なお、図244のCPU内蔵レジスタ設定データテーブルの48行目を参照して理解できるように、シンボル「@NUM_CPU_REG」には、コマンド「EQU ($-T_CPU_REG)/2」が記載されている。ここで、「$」は、転送元となるデータ群の最終アドレスの次のアドレス、すなわち、シンボル「@NUM_CPU_REG」自体であり、「T_CPU_REG」は転送元となるデータ群の先頭アドレスなので、$-T_CPU_REGの値(データ数を示す1バイト値)の値が、1バイト値の総バイト数となり、その値を、アドレスと値との組み合わせ数である2で除算すると、設定データ数が導出される。例えば、図244の例では、設定データ数は30/2=15となる。
図243の3行目の指標「INITIAL01」は繰り返し処理の先頭アドレスを示す。4行目のコマンド「LDIN AC,(HL)」によって、HLレジスタのアドレスで示されるメモリ領域に格納された1バイト値がCレジスタに格納され、HLレジスタに「1」を加えた値のアドレスで示されるメモリ領域に格納された1バイト値がAレジスタに格納される。5行目のコマンド「OUT (C),A」によって、Cレジスタのアドレスで示されるメモリ領域(内蔵レジスタ)に、Aレジスタの値(設定データ)が出力される。
例えば、HLレジスタがアドレス「T_CPU_REG」の値であった場合、図244の3行目における1バイト値「@PT0PR__」がCレジスタに格納され、図244の4行目における1バイト値「160」がAレジスタに格納される。そして、Cレジスタのシンボル「@PT0PR__」で示されるメモリ領域に、Aレジスタの値「160」が出力される。
続いて、図243の6行目のコマンド「DJNZ INITIAL01」によって、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0でなければ、3行目の指標「INITIAL01」に移動し、デクリメントした結果が0であれば、当該コマンドの次のコマンドに処理を移す。ここでは、データ数が「15」なので、指標「INITIAL01」からの処理を15回繰り返すとBレジスタの値が0となる。
このように、図243に示した初期設定処理のコマンドの総コマンドサイズは、1行目のコマンド「LD HL,T_CPU_REG」3バイト+2行目のコマンド「LD B,@NUM_CPU_REG」2バイト+4行目のコマンド「LDIN AC,(HL)」2バイト+5行目のコマンド「OUT (C),A」2バイト+6行目のコマンド「DJNZ INITIAL01」2バイト=11バイトとなる。
上述したように、本実施形態では、入出力部704のアドレス空間を、メインROM500bおよびメインRAM500cのアドレス空間と一体化している。したがって、メインCPU500aは、メモリ空間のFE00h~FFFFhのアドレスを通じて入出力部704にアクセスする。この場合、入出力部704を割り当てることができるメモリ空間が512バイトとなる。このようにメモリ空間が増えることで、割り当てられる入出力部704の数も増やすことができる。その一方で、メモリ空間が256バイトより大きくなるので、入出力部704を特定するためのアドレスとして2バイトを要することとなる。例えば、本実施形態においては、予め、一部の入出力部704がメモリ空間の256バイトの領域であるFE00h~FEFFhに割り当てられ、他の入出力部704がメモリ空間の256バイトの領域であるFF00h~FFFFhに割り当てられている。したがって、メインCPU500aは、アドレスの上位バイトが異なる入出力部704にアクセスする度、Uレジスタの値を「FEH」と「FFH」との間で変更しなければならない。ここでは、図243で示した初期設定処理を、Uレジスタを用いて実現する他の実施例を説明する。
図245は、CPU初期化処理を実現するためのコマンド群の一部の他の例を示した図であり、図246は、CPU初期化処理で参照するテーブルの他の例を示した図である。ここでは、メインCPU500aは、図243、図244同様、説明の便宜上、I/OマップドI/O方式によって入出力部704(内蔵レジスタ)に設定データを設定している。
図245の1行目のコマンド「LDF HL,T_CPU_REG」によって、図246のCPU内蔵レジスタ設定データテーブルのデータ群の先頭アドレス「T_CPU_REG」がHLレジスタに設定される。2行目のコマンド「LD B,@NUM_CPU_RG1」によって、シンボル「@NUM_CPU_RG1」自体がBレジスタに設定される。
なお、図246のCPU内蔵レジスタ設定データテーブルの42行目を参照して理解できるように、シンボル「@NUM_CPU_RG1」には、コマンド「EQU ($-T_CPU_REG)/2」が記載されている。ここで、「$」は、シンボル「@NUM_CPU_RG1」自体であり、「T_CPU_REG」は転送元となるデータ群の先頭アドレスなので、$-T_CPU_REGの値が、データ数を示す1バイト値の総バイト数となり、その値を、アドレスと値との組み合わせ数である2で除算すると、設定データ数が導出される。例えば、図246の例では、設定データ数は26/2=13となる。
図245の3行目のコマンド「LD U,0FEH」によって、入出力部704を示すアドレスの上位バイトとなる「FEH」をUレジスタに設定する。ここでは、複数の入出力部704を示すアドレスの上位アドレスとして2つの値「FEH」、「FFH」が準備されており、メインCPU500aは、アクセス対象となる入出力部704に応じて、その都度、上位バイトとなるUレジスタの値を変更する。なお、Uレジスタの初期値は「FFH」である。ここでは、まず、Uレジスタに「FEH」を設定し(「FFH」を「FEH」に変更し)、上位アドレスが「FEH」となる入出力部704に関して設定データを設定する。
図245の4行目の指標「INITIAL01」は繰り返し処理の先頭アドレスを示す。5行目のコマンド「LDIN AC,(HL)」によって、HLレジスタのアドレスで示されるメモリ領域に格納された値がCレジスタに格納され、HLレジスタに「1」を加えた値のアドレスで示されるメモリ領域に格納された値がAレジスタに格納される。6行目のコマンド「OUT (C),A」によって、Cレジスタのアドレスで示されるメモリ領域(内蔵レジスタ)に、Aレジスタの値(設定データ)が出力される。
例えば、HLレジスタがアドレス「T_CPU_REG」の値であった場合、図246の3行目における1バイト値「@PT0PR__」(例えば「01H」)がCレジスタに格納され、図246の4行目における1バイト値「160」がAレジスタに格納される。そして、Cレジスタのシンボル「@PT0PR__」で示されるメモリ領域に、Aレジスタの値「160」が出力される。
図245の7行目のコマンド「DJNZ INITIAL01」によって、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0でなければ、4行目の指標「INITIAL01」に移動し、デクリメントした結果が0であれば、当該コマンドの次のコマンドに処理を移す。ここでは、データ数が「13」なので、指標「INITIAL01」からの処理を13回繰り返すとBレジスタの値が0となる。こうして、図246の前段における13の入出力部704に関して設定データの設定が完了する。
図245の8行目のコマンド「LD U,0FFH」によって、入出力部704を示すアドレスの上位バイトとなる「FFH」をUレジスタに設定する。上述したように、入出力部704を示すアドレスとして2つの値「FEH」、「FFH」のうち、上位アドレスが「FEH」となる入出力部704に関して設定データの設定が完了しているので、ここでは、Uレジスタに「FFH」を設定し、上位アドレスが「FFH」となる入出力部704に関して設定データを設定する。なお、Uレジスタに「FFH」を設定することで、Uレジスタを初期値に戻すこととなる。
図245の9行目のコマンド「LD B,@NUM_CPU_RG2」によって、シンボル「@NUM_CPU_RG2」自体がBレジスタに設定される。なお、図246のCPU内蔵レジスタ設定データテーブルの50行目を参照して理解できるように、シンボル「@NUM_CPU_RG2」には、コマンド「EQU ($-T_CPU_REG)/2-@NUM_CPU_RG1」が記載されている。ここで、「$」は、シンボル「@NUM_CPU_RG2」自体であり、「T_CPU_REG」は転送元となる1バイトデータ群の先頭アドレスなので、$-T_CPU_REGの値は30/2=15であり、「@NUM_CPU_RG1」は13なので、図246の例では、設定データ数は15-13=2となる。
図245の10行目の指標「INITIAL02」は繰り返し処理の先頭アドレスを示す。11行目のコマンド「LDIN AC,(HL)」によって、HLレジスタのアドレスで示されるメモリ領域に格納された値がCレジスタに格納され、HLレジスタに「1」を加えた値のアドレスで示されるメモリ領域に格納された値がAレジスタに格納される。12行目のコマンド「OUT (C),A」によって、Cレジスタのアドレスで示されるメモリ領域(内蔵レジスタ)に、Aレジスタの値(設定データ)が出力される。
例えば、HLレジスタがシンボル「@NUM_CPU_RG1」自体であった場合、図246の44行目における1バイト値「@S1CM___」(例えば「2CH」)がCレジスタに格納され、図246の45行目における1バイト値「10000000B」がAレジスタに格納される。そして、Cレジスタのシンボル「@S1CM___」で示されるメモリ領域に、Aレジスタの値「10000000B」が出力される。
続いて、図245の13行目のコマンド「DJNZ INITIAL02」によって、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0でなければ、10行目の指標「INITIAL02」に移動し、デクリメントした結果が0であれば、当該コマンドの次のコマンドに処理を移す。ここでは、データ数が「2」なので、指標「INITIAL02」からの処理を2回繰り返すとBレジスタの値が0となる。こうして、図246の後段における2の入出力部704に関して設定データの設定が完了する。
このように、図245に示した初期設定処理のコマンドの総コマンドサイズは、1行目のコマンド「LDF HL,T_CPU_REG」2バイト+2行目のコマンド「LD B,@NUM_CPU_RG1」2バイト+3行目のコマンド「LD U,0FEH」3バイト+5行目のコマンド「LDIN AC,(HL)」2バイト+6行目のコマンド「OUT (C),A」2バイト+7行目のコマンド「DJNZ INITIAL01」2バイト+8行目のコマンド「LD U,0FFH」3バイト+9行目のコマンド「LD B,@NUM_CPU_RG2」2バイト+11行目のコマンド「LDIN AC,(HL)」2バイト+12行目のコマンド「OUT (C),A」2バイト+13行目のコマンド「DJNZ INITIAL02」2バイト=24バイトとなる。
ここでは、複数の入出力部704にアクセスするためにUレジスタを変更しなければならないので、その分、図243の例と比べて総コマンドサイズが大きくなる。ただし、上述したように、プログラムのうちの一部の処理においては、I/OマップドI/O方式ではなくメモリマップドI/O方式の命令を利用した方が、コマンドサイズが小さくなる場合がある。そこで、一部の処理にメモリマップドI/O方式を適用する例を挙げて説明する。
図247は、CPU初期化処理を実現するためのコマンド群の一部の他の例を示した図である。ここでは、メインCPU500aは、図243、図245と異なり、メモリマップドI/O方式によって入出力部704(内蔵レジスタ)に設定データを設定している。なお、CPU初期化処理で参照するCPU内蔵レジスタ設定データテーブルは、図246のCPU内蔵レジスタ設定データテーブルをそのまま用いることができるので、図246を用いて説明する。
図247の1行目のコマンド「LDF HL,T_CPU_REG」によって、図246のCPU内蔵レジスタ設定データテーブル(転送情報が含まれるテーブル)のデータ群の先頭アドレス「T_CPU_REG」がHLレジスタ(第2レジスタ)に設定される。2行目のコマンド「LD B,@NUM_CPU_RG1」によって、シンボル「@NUM_CPU_RG1」自体(転送する数)がBレジスタ(第1レジスタ)に設定される。
なお、図246のCPU内蔵レジスタ設定データテーブルの42行目を参照して理解できるように、シンボル「@NUM_CPU_RG1」には、コマンド「EQU ($-T_CPU_REG)/2」が記載されている。ここで、$-T_CPU_REGの値が、データ数を示す1バイト値の総バイト数となり、その値を、アドレスと値との組み合わせ数である2で除算すると、設定データ数は26/2=13となる。
図247の3行目のコマンド「LD Q,HIGH @PTOPR__」によって、シンボル「@PTOPR__」の上位バイトの値(「FEH」)がQレジスタに設定される。ここでは、メモリマップドI/O方式で入出力部704にアクセスするため、Uレジスタではなく、QHレジスタに入出力部704の上位バイトを設定している。上述したように、入出力部704を示すアドレスとして2つの値「FEH」、「FFH」が準備されており、メインCPU500aは、アクセス対象となる入出力部704に応じて、その都度、上位バイトとなるQレジスタの値を変更している。なお、Qレジスタの初期値はメインRAM500cの先頭アドレスに相当する「F0H」である。ここでは、まず、Qレジスタ(第3レジスタ)に「FEH」を設定し、上位アドレスが「FEH」となる入出力部704に関して設定データを設定する。
図247の4行目のコマンド「LDINTQR (HL)」によって、Qレジスタの値を転送先アドレスの上位1バイトとし、HLレジスタのアドレスで示されるメモリ領域に格納された値を転送先アドレスの下位1バイトとし、HLレジスタの値に「1」を加えた値のアドレスで示されるメモリ領域に格納された値が、転送先アドレスで示されるメモリ領域に転送され、HLレジスタの値に「2」を加えて次に転送するアドレスが更新され、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0になるまで、すなわち、設定データである13回だけ当該処理が繰り返される。こうして、図246の前段における13の入出力部704に関して設定データの設定が完了する。かかるLDINTQR命令では、Bレジスタ、HLレジスタ、Qレジスタ以外のレジスタ、例えば、Aレジスタを用いることなく処理が実行される。
図247の5行目のコマンド「LD B,@NUM_CPU_RG2」によって、シンボル「@NUM_CPU_RG2」自体(転送する数)がBレジスタ(第1レジスタ)に設定される。なお、図246のCPU内蔵レジスタ設定データテーブルの50行目を参照して理解できるように、シンボル「@NUM_CPU_RG2」には、コマンド「EQU ($-T_CPU_REG)/2-@NUM_CPU_RG1」が記載されている。ここで、$-T_CPU_REGの値(データ数を示す1バイト値)の値は30/2=15であり、「@NUM_CPU_RG1」は13なので、図246の例では、設定データ数は15-13=2となる。
図247の6行目のコマンド「LD Q,HIGH @S2CMS__」によって、シンボル「@S2CMS__」の上位バイトの値(「FFH」)がQレジスタ(第3レジスタ)に設定される。ここでも、メモリマップドI/O方式で入出力部704にアクセスするため、Uレジスタではなく、QHレジスタに入出力部704の上位バイトを設定している。なお、上述したように、入出力部704を示すアドレスとして2つの値「FEH」、「FFH」のうち、上位アドレスが「FEH」となる入出力部704に関して設定データの設定が完了しているので、ここでは、Qレジスタに「FFH」を設定し、上位アドレスが「FFH」となる入出力部704に関して設定データを設定する。
図247の7行目のコマンド「LDINTQR (HL)」によって、Qレジスタの値を転送先アドレスの上位1バイトとし、HLレジスタ(第2レジスタ)のアドレスで示されるメモリ領域に格納された値を転送先アドレスの下位1バイトとし、HLレジスタの値に「1」を加えた値のアドレスで示されるメモリ領域に格納された値が、転送先アドレスで示されるメモリ領域に転送され、HLレジスタの値に「2」を加えて次に転送するアドレスが更新され、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0になるまで、すなわち、設定データである2回だけ当該処理が繰り返される。こうして、図246の後段における2の入出力部704に関して設定データの設定が完了する。かかるLDINTQR命令では、Bレジスタ、HLレジスタ、Qレジスタ以外のレジスタ、例えば、Aレジスタを用いることなく処理が実行される。
そして、図247の8行目のコマンド「LD Q、HIGH @RAM_BGN_ADR」によって、シンボル「@RAM_BGN_ADR」の上位バイトの値がQレジスタに設定される。こうして、Qレジスタの値を初期値「F0H」に復帰させる。
このように、図247に示した初期設定処理のコマンドの総コマンドサイズは、1行目のコマンド「LDF HL,T_CPU_REG」2バイト+2行目のコマンド「LD B,@NUM_CPU_RG1」2バイト+3行目のコマンド「LD Q,HIGH @PTOPR__」2バイト+4行目のコマンド「LDINTQR (HL)」2バイト+5行目のコマンド「LD B,@NUM_CPU_RG2」2バイト+6行目のコマンド「LD Q,HIGH @S2CMS__」2バイト+7行目のコマンド「LDINTQR (HL)」2バイト+コマンド「LD Q、HIGH @RAM_BGN_ADR」1バイト=15バイトとなる。
ここでは、図245のI/OマップドI/O方式を、図247のようにメモリマップドI/O方式に変更し、それに伴ってLDINTQR命令を利用することが可能となる。そうすると、図245の初期設定処理のコマンドの総コマンドサイズが24バイトであるのに対し、図247の初期設定処理のコマンドの総コマンドサイズが15バイトとなるので9バイトの削減が可能となる。このように、メモリマップドI/O方式によるLDINTQR命令を利用することによって、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
<メモリマップドI/O方式の利用例2>
図248は、出力ポートのアドレスを示した説明図であり、図249は、電源断時退避処理を実現するためのコマンド群の一部を示した図である。ここでは、説明の便宜上、電源断時退避処理S3000のうちの出力ポートクリア処理(図25のステップS300-11、および、図97のステップS3000-11)を説明する。出力ポートクリア処理では、出力ポートの出力を0にクリアする。なお、ここでは、メインCPU500aが出力ポートクリア処理S3000-11を実行する例を挙げる。
本実施形態では入出力部704として、出力ポート0~8の合計9つの出力ポートが準備されている。出力ポート0~8では、ビット単位でそれぞれ離散信号(Hi(ハイレベル)とLow(ローレベル)の2値)を連続的に出力することができる。なお、出力ポートクリア処理の対象は、出力ポート0~8のうち、出力ポート0~4、7の合計6つの出力ポートに限られる。したがって、出力ポートクリア処理では、出力ポート0~4、7をクリアしている。
図248を参照すると、メモリ空間上のアドレス「FFF0H」に出力ポート4が割り当てられ、アドレス「FFF1H」に出力ポート3が割り当てられ、アドレス「FFF2H」に出力ポート2が割り当てられ、アドレス「FFF3H」に出力ポート1が割り当てられ、アドレス「FFF4H」に出力ポート0が割り当てられ、アドレス「FFF5H」に出力ポート7が割り当てられている。
図249の出力ポートクリア処理は、Aレジスタに「0」が設定されている場合にのみ遂行される処理であり、出力ポートクリア処理が実行されるときには、既にAレジスタに「0」が設定されていることとなる。図249の1行目のコマンド「LD BC,6*256+@OUT_PRT_7」によって、Bレジスタに出力ポート数である6が設定され、Cレジスタに出力ポート7を示す下位1バイトのアドレス値が設定される。なお、図248に示したように、出力ポート7を示す下位1バイトの値は「F5H」である。3行目のコマンド「OUT (C),A」によって、Uレジスタの値(ここでは初期値である「FFH」)をアドレスの上位1バイトとし、Cレジスタの値を下位1バイトとし、そのアドレスが示すメモリ領域に、Aレジスタの値(「0」)が出力される。
図249の4行目のコマンド「DEC C」によって、Cレジスタで示されるアドレスに格納された値が1だけデクリメントされる。5行目のコマンド「DJNZ PRFPROC02」によって、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0でなければ、2行目の指標「PRFPROC02」に移動し、デクリメントした結果が0であれば、当該コマンドの次のコマンドに処理を移す。ここでは、出力ポート数が「6」なので、指標「PRFPROC02」からの処理を6回繰り返すとBレジスタの値が0となる。
こうして、入出力部704のアドレスが「FFF5H」→「FFF4H」→「FFF3H」→「FFF2H」→「FFF1H」→「FFF0H」とデクリメントされ、それに伴って出力ポート7→出力ポート0→出力ポート1→出力ポート2→出力ポート3→出力ポート4の順で出力ポートの各ビットが0に設定される。
このように、図249に示した出力ポートクリア処理のコマンドの総コマンドサイズは、1行目のコマンド「LD BC,6*256+@OUT_PRT_7」3バイト+3行目のコマンド「OUT (C),A」2バイト+4行目のコマンド「DEC C」1バイト+5行目のコマンド「DJNZ PRFPROC02」2バイト=8バイトとなる。
上述したように、プログラムのうちの一部の処理においては、I/OマップドI/O方式ではなくメモリマップドI/O方式の命令を利用した方が、コマンドサイズが小さくなる場合がある。そこで、一部の処理にメモリマップドI/O方式を適用する例を挙げて説明する。
図250は、電源断時退避処理を実現するためのコマンド群の一部の他の例を示した図である。ここで、メインCPU500aは、メモリマップドI/O方式によって、出力ポートの出力を0にクリアしている。
図250の1行目のコマンド「LD HL,@OUT_PRT_4」によって、出力ポート4を示す2バイトのシンボル「@OUT_PRT_4」自体(出力ポートの情報)をHLレジスタ(第2レジスタ)に設定する。なお、図248に示したように、出力ポート4を示す2バイトの値は「FFF0H」となっている。2行目のコマンド「LD B,6」によって、Bレジスタ(第1レジスタ)にクリア対象となる出力ポート数(クリアする数)である6が設定される。
図250の3行目のコマンド「CLRIRS」によって、HLレジスタのアドレスで示されるメモリ領域に「0」が格納され(出力ポートがクリアされ)、HLレジスタの値に「1」を加えて次にクリアされるアドレスが更新され、Bレジスタの値がデクリメント(「1」減算)され、デクリメントした結果が0になるまで、すなわち、クリア対象となる出力ポート数である6回だけ当該処理が繰り返される。かかるCLRIRS命令では、Bレジスタ、HLレジスタ以外のレジスタ、例えば、Aレジスタを用いることなく処理が実行される。
こうして、入出力部704のアドレスが「FFF0H」→「FFF1H」→「FFF2H」→「FFF3H」→「FFF4H」→「FFF5H」とインクリメントされ、それに伴って出力ポート4→出力ポート3→出力ポート2→出力ポート1→出力ポート0→出力ポート7の順で出力ポートの出力が0に設定される。
このように、図250に示した出力ポートクリア処理のコマンドの総コマンドサイズは、1行目のコマンド「LD HL,@OUT_PRT_4」3バイト+2行目のコマンド「LD B,6」2バイト+3行目のコマンド「CLRIRS」2バイト=7バイトとなる。
ここでは、図249のI/OマップドI/O方式を、図250のようにメモリマップドI/O方式に変更し、それに伴ってCLRIRS命令を利用することが可能となる。そうすると、図249の出力ポートクリア処理のコマンドの総コマンドサイズが8バイトであるのに対し、図250の出力ポートクリア処理のコマンドの総コマンドサイズが7バイトとなるので1バイトの削減が可能となる。このように、メモリマップドI/O方式によるCLRIRS命令を利用することによって、コマンドの短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
なお、図250の例では、CLRIRS命令を利用することで、Aレジスタを利用しないで済む。したがって、Aレジスタの値を意図せず更新してしまうことがない。例えば、Aレジスタが既に利用されている場合、通常、Aレジスタを退避する必要があったが、ここでは、Aレジスタを利用しないので、退避する必要がない。こうして、リソースを有効利用することが可能となる。なお、図249の例では、Aレジスタに予め値「0」が設定されていることを前提としているが、コマンド「CLRIRS」には値「0」を設定する機能が備わっているので、予め値「0」を設定する処理も不要となる。こうして、コマンドの更なる短縮化を図り、遊技制御処理を行うための制御領域の容量を確保することが可能となる。
以上、添付図面を参照しながら本発明の好適な実施形態について説明したが、本発明はかかる実施形態に限定されないことは言うまでもない。当業者であれば、特許請求の範囲に記載された範疇において、各種の変更例または修正例に想到し得ることは明らかであり、それらについても当然に本発明の技術的範囲に属するものと了解される。
また、上述した実施形態では、主制御基板300、500と副制御基板330、502とが、遊技を進行するための機能部を分担するように配したが、主制御基板300、500の機能部を副制御基板330、502に配しても、副制御基板330、502の機能部を主制御基板300、500に配してもよく、また、全ての機能部を1の制御基板に纏めて配することもできる。
また、上述した主制御基板300、500および副制御基板330、502が行う各処理は、必ずしもフローチャートとして記載された順序に沿って時系列に処理する必要はなく、並列的あるいはサブルーチンによる処理を含んでもよい。