手術が終わった。
無事に終わった。
大事なことなので2回言ってみた。
手術が終わった。
無事に終わった。
大事なことなので2回言ってみた。
さて、前回の最後に触れた違和感。
ハズレの時にセットするタイマーがちょっとおかしいのではないか、ということですね。
再掲します。
ハズレでは、タイマーのセットはしますがアタッカーはクローズのままです。
次回以降割り込みごとにタイマーAをマイナス1。0にならない時はインターバルのまま。0になったらデジタル回転スピードのパターン移行を行い、保留のある時は次の割り込みがスタート地点となります。保留がなければスタートチャッカー入賞待ち。
も1つ再掲。
⓪BRAVT-A … おまけ(タイマーCを$00AA(170))
①BRAVT-B … ハズレ(タイマーCを$00AA(170))
②BRAVT-C … おまけ(タイマーCを$00AA(170))
③BRAVT-F … ハズレ(タイマーCを$00AA(170))
④BRAVT-J … ハズレ(タイマーAを$00F4(244))
⑤BRAVT-Z … ハズレ(タイマーAを$00F4(244))
⑥BRA15-J … ハズレ(タイマーAを$00F4(244))
⑦BRA15-K … ハズレ(タイマーCを$00F4(244))
タイマーCというのは、アタッカーの開放時間を管理しているとみなして問題ないです。
なので、大当たり、中当たり、小当たり、おまけの時は、タイマーCをセットします。
タイマーAというのは、インターバルの時間を管理しているとみなして問題ないと思います。
それなのに、ハズレから次のデジタル回転へと向かうインターバルでタイマーCをセットする「やらかし」がちらほらと。。。
では、インターバル前に「セットすべきタイマーA」ではなく「タイマーC」をセットしてしまったらどうなるのか。
タイマーCをセットしてしまった次の割り込みではタイマーAをマイナス1。
でも、タイマーAはセットされていないので「0」です。プログラム上では2バイトメモリで管理されているから「$0000」。
これをマイナス1すると、桁借り減算($10000-$0001)が起こって、結果は$FFFF(65535)。
以後割り込みごとにタイマーAをマイナス1して割り込み65535回後(およそ4分半後)に次のデジタルが始動しま・・・・・ぃゃぃゃさすがにそんなことがあればこのプログラムミスは当然修正されていたことでしょう。
実は、3種類あるタイマーは、このビット以降はセットされることがないというビットを、割り込みごとにきちんとクリアしているのです。
タイマーAの場合は、上位8ビットには絶対にセットされないようになっているので、毎回そこはクリアされています。
つまり、桁借り減算で$FFFFになっても$00FF(255)に修正されるため、まぁ結果として正規にタイマーAをセットした時とさほど変わらない時間でインターバルを済ませることができるのです。
想像するに。。。
⓪BRAVT-Aがプロトモデルなんでしょう。
それを元に①BRAVT-Bのバリエーションを作る際、おまけとしてのアタッカーオープンの部分は消したもののタイマーの変更は忘れてしまったと。
そして③のバリエーションを作る際、今度は①BRAVT-Bを元にしたからタイマーはアレなまま。
⑦BRA15-Kについては情報不足でなんともいえません。
という感じで、ブラボープロジェクトを終わりにしようと思います(嘘)
前回はデジタルの始動から停止までについてまとめました。
前々回に役判定について触れていますが、今回はもう少し踏み込んでいきまして、さらに次の回転のスタート地点まで。
つまり、<第5ブロック>から<第6ブロック>までをお話していこうと思います。
役判定では成立した役に応じて様々な処理を行いますが、解説に必要なのはタイマーくらいでしょうか。
「3」「7」いずれかの3つ揃い
⓪BRAVT-A … 大当たり(タイマーCを$1C9C(7324))
①BRAVT-B … 大当たり(タイマーCを$1C9C(7324))
②BRAVT-C … 大当たり(タイマーCを$1C9C(7324))
③BRAVT-F … 大当たり(タイマーCを$1C9C(7324))
④BRAVT-J … 大当たり(タイマーCを$1C9C(7324))
⑤BRAVT-Z … 大当たり(タイマーCを$1C8C(7308))
⑥BRA15-J … 大当たり(タイマーCを$0E10(3600))
⑦BRA15-K … 大当たり(タイマーCを$0E10(3600))
「3」「7」以外の3つ揃い
⓪BRAVT-A … 小当たり(タイマーCを$0989(2441))
①BRAVT-B … 小当たり(タイマーCを$0989(2441))
②BRAVT-C … 中当たり(タイマーCを$05B9(1465))
③BRAVT-F … 小当たり(タイマーCを$0989(2441))
④BRAVT-J … 小当たり(タイマーCを$0989(2441))
⑤BRAVT-Z … 小当たり(タイマーCを$0979(2425))
⑥BRA15-J … 小当たり(タイマーCを$0989(2441))
⑦BRA15-K … 小当たり(タイマーCを$0979(2425))
「3」「7」の2つ揃い
⓪BRAVT-A … 小当たり(タイマーCを$0989(2441))
①BRAVT-B … 小当たり(タイマーCを$0989(2441))
②BRAVT-C … 小当たり(タイマーCを$0989(2441))
③BRAVT-F … 小当たり(タイマーCを$0989(2441))
④BRAVT-J … 小当たり(タイマーCを$0989(2441))
⑤BRAVT-Z … 小当たり(タイマーCを$04C4(1220))
⑥BRA15-J … 小当たり(タイマーCを$0989(2441))
⑦BRA15-K … 小当たり(タイマーCを$0356(854))
上記以外
⓪BRAVT-A … おまけ(タイマーCを$00AA(170))
①BRAVT-B … ハズレ(タイマーCを$00AA(170))
②BRAVT-C … おまけ(タイマーCを$00AA(170))
③BRAVT-F … ハズレ(タイマーCを$00AA(170))
④BRAVT-J … ハズレ(タイマーAを$00F4(244))
⑤BRAVT-Z … ハズレ(タイマーAを$00F4(244))
⑥BRA15-J … ハズレ(タイマーAを$00F4(244))
⑦BRA15-K … ハズレ(タイマーCを$00F4(244))
<第6ブロック>
(ハズレも含めて)成立した役に応じた処理を行う。
終了後、スタート地点へ。
大当たりと中当たりでは、タイマーCのセットと同時にアタッカーがオープンします。
次の割り込み以降は、タイマーCをマイナス1。
0にならない時はアタッカーが開いたまま(アタッカーに球が入るたびにアタッカーが閉じる→開くの動作を行うのは機械的な構造によるもので、プログラム上ではタイマーCは時間いっぱい開きっ放し)。
0になったらアタッカークローズ。同じ割り込みでタイマーAに$00F4(244)をセット→同じ割り込みからタイマーAをマイナス1。
次回以降割り込みごとにタイマーAをマイナス1。0にならない時はインターバルのまま。0になったらデジタル回転スピードのパターン移行を行い、アタッカーオープン。タイマーCを再セット。
これをV入賞する限り最大10ラウンド分繰り返します。
最終ラウンドはV入賞のチェックが無しです。インターバル終了時にデジタルスピードのパターン移行を済ませたら、保留のある時は次の割り込みがスタート地点となります。保留がなければスタートチャッカー入賞待ち。
小当たりでは、タイマーCのセットと同時にアタッカーがオープンします。
次の割り込み以降は、タイマーCをマイナス1。
0にならない時はアタッカーが開いたまま。
0になったらアタッカークローズ。同じ割り込みでタイマーAに$00F4(244)をセット→同じ割り込みからタイマーAをマイナス1。
次回以降割り込みごとにタイマーAをマイナス1。0にならない時はインターバルのまま。0になったらデジタル回転スピードのパターン移行を行い、保留のある時は次の割り込みがスタート地点となります。保留がなければスタートチャッカー入賞待ち。
おまけでは、タイマーCのセットと同時にアタッカーがオープンします。
次の割り込み以降は、タイマーCをマイナス1。
0にならない時はアタッカーが開いたまま。
0になったらアタッカークローズ。同じ割り込みでタイマーAに$00F4(244)をセット→同じ割り込みからタイマーAをマイナス1。
次回以降割り込みごとにタイマーAをマイナス1。0にならない時はインターバルのまま。0になったらデジタル回転スピードのパターン移行を行い、保留のある時は次の割り込みがスタート地点となります。保留がなければスタートチャッカー入賞待ち。
ハズレでは、タイマーのセットはしますがアタッカーはクローズのままです。
次回以降割り込みごとにタイマーAをマイナス1。0にならない時はインターバルのまま。0になったらデジタル回転スピードのパターン移行を行い、保留のある時は次の割り込みがスタート地点となります。保留がなければスタートチャッカー入賞待ち。
今回はここまで。
なんか違和感があったりすると思いますが、それはまた次回。
前回は概略にとどめましたが、デジタルの始動から停止までを詳しく見ていきましょう。
<第1ブロック>
スタート地点。
保留の有無にかかわりなく、スタートチャッカーに球が入ると保留のカウントをプラス1。
そのうえで、保留数のチェック。
5以上だったら4に修正。よって、回転中+保留3個がマックス。
例外は⑤BRAVT-Zで、6以上だったら5に修正。回転中+最大保留4個。
この後、ストップボタン非タッチ時の回転タイマーをセット(タイマーB)。
この<第1ブロック>は1回の割り込み内で完結します。
タイマーBの値はこんな感じ。
⓪BRAVT-A … $0989(2441)
①BRAVT-B … $0989(2441)
②BRAVT-C … $0989(2441)
③BRAVT-F … $0989(2441)
④BRAVT-J … $0989(2441)
⑤BRAVT-Z … $0979(2425)
⑥BRA15-J … $0989(2441)
⑦BRA15-K … $0979(2425)
<第2ブロック>
割り込みごとにステップ進行。
ベタ押し(・適当にタッチ)・非タッチでこのブロックの滞在時間が変わる。
このブロックが終了するとストップボタンの受け付けは終了。
その際、「左デジタルの停止時間」「中デジタルの停止時間」「右デジタルの停止時間」を決定。
ベタ押しというのは皆さんご存知の通りデジタル始動前からストップボタンをタッチしておくことです。
このブラボーではタッチしているかどうかを割り込みでチェックして、割り込み3回連続でタッチしていたらストップ成立になります。
ベタ押しの場合、始動前からタッチしているので、<第1ブロック>で割り込み1回、<第2ブロック>で割り込み3回、つまりスタートから割り込み4回目で「各デジタルの停止時間」を決定するのです。
逆に非タッチの場合は、<第1ブロック>でセットしたタイマーBの値を、ステップ進行の後にマイナス1。0にならなければ<第2ブロック>のまま。0になった時、つまりスタート地点から割り込み2442回目(あるいは2426回目)で「各デジタルの停止時間」を決定します。
適当にタッチした時はそのタイミングにより上記の下限と上限の間の割り込み回数を消化したところで「各デジタルの停止時間」の決定を行います。
その決定方法には4つのパターンがあります。
⓪BRAVT-A … パターンa
①BRAVT-B … パターンa
②BRAVT-C … パターンa
③BRAVT-F … パターンa
④BRAVT-J … パターンb
⑤BRAVT-Z … パターンc
⑥BRA15-J … パターンb
⑦BRA15-K … パターンd
【パターンa】
「左デジタルの停止時間」
乱数R+$00+前回停止時の「左」ステップ数。
$80と論理和。
「中デジタルの停止時間」
乱数R+$55+前回停止時の「中」ステップ数。
$80と論理和。
「右デジタルの停止時間」
乱数R+$AA+前回停止時の「右」ステップ数。
$80と論理和。
【パターンb】
「左デジタルの停止時間」
乱数R+$00+前回停止時の「左」ステップ数。
$80と論理和。
「中デジタルの停止時間」
乱数R+$00+前回停止時の「左」ステップ数。
$80と論理和。
「右デジタルの停止時間」
乱数R+$00+前回停止時の「左」ステップ数。
$80と論理和。
【パターンc】
「左デジタルの停止時間」
乱数R+$00+前回停止時の「左」ステップ数。
$40と論理和。
「中デジタルの停止時間」
乱数R+$55+前回停止時の「中」ステップ数。
$80と論理和。
「右デジタルの停止時間」
乱数R+$AA+前回停止時の「右」ステップ数。
$80と論理和。
【パターンd】
「左デジタルの停止時間」
乱数R+$00+前回停止時の「左」ステップ数。
$50と論理和。
「中デジタルの停止時間」
乱数R+$55+前回停止時の「中」ステップ数。
$50と論理和。
「右デジタルの停止時間」
乱数R+$AA+前回停止時の「右」ステップ数。
$50と論理和。
パターンbのみ更なる解説が必要ですが、それはさておき、ここで得られた8ビットの値が停止時間となります。
8ビットですから取り得る値の範囲は$00~$FF(0~255)。
加算の結果オーバーフローした(256以上になった)時は256をマイナスして値を範囲内におさめます。
論理和とは論理演算の一種で、ググれば話は早いと思いますが、演算子のいずれか一方が「1」なら演算結果が「1」になる、というものです。
<第3ブロック>
「左デジタルの停止時間」を消化するまで割り込みごとにステップ進行→消化後左デジタル停止。
④BRAVT-Jと⑥BRA15-Jのみ、このブロック終了時に「中デジタルの停止時間」を再決定。
ステップ進行の後に「左デジタルの停止時間」をマイナス1。0になったら次の割り込みから<第4ブロック>へ。
また、④BRAVT-Jと⑥BRA15-Jの「中デジタルの停止時間」の再決定は、乱数Rと$80との論理和。
ちなみに、<第2ブロック>最後の「各デジタルの停止時間」決定と<第3ブロック>初回の「左デジタルの停止時間」をマイナス1は同じ割り込み内で処理されています。
<第4ブロック>
「中デジタルの停止時間」を消化するまで割り込みごとにステップ進行→消化後中デジタル停止。
④BRAVT-Jと⑥BRA15-Jのみ、このブロック終了時に「右デジタルの停止時間」を再決定。
ステップ進行の後に「中デジタルの停止時間」をマイナス1。0になったら次の割り込みから<第5ブロック>へ。
また、④BRAVT-Jと⑥BRA15-Jの「右デジタルの停止時間」の再決定は、乱数Rと$80との論理和。
<第5ブロック>
「右デジタルの停止時間」を消化するまで割り込みごとにステップ進行→消化後右デジタル停止。
そして役判定。
ステップ進行の後に「右デジタルの停止時間」をマイナス1。0になったら次の割り込みで役判定。
④BRAVT-Jと⑥BRA15-Jには停止時間の再決定がありますが、そこで使用される乱数はその都度取り出しているので、基本的にはそれぞれ異なる値になるはずです。
④BRAVT-Jと⑥BRA15-Jには他にも特殊な処理がありまして、<第2ブロック>でストップボタンにタッチしなかった場合、<第3ブロック>以降デジタルに「0」が出にくい状態になります。
これはステップ進行とは別の部分で処理されています。
ステップ進行でデジタル表示値が更新されると「速」「中」「遅」に応じたステップ数を再セットするのですが、デジタル表示が「0」になった時はステップ数として「1」を再セット。
つまり、次の割り込みでのステップ進行でステップ数が0になるため、デジタル表示値が「1」に更新されてしまうわけです。
<第6ブロック>
(ハズレも含めて)成立した役に応じた処理を行う。
終了後、スタート地点へ。
とりあえずデジタルの始動から停止までを振り返りました。
次回は<第6ブロック>を詳しくみていきましょう。
役判定は前回お伝えしていますから、その後の次回デジタル始動までについて。
前回はステップ進行についてお話しました。
これはデジタルの回転(変動)を制御しているもので、デジタルの停止はまた別な話です。
デジタルの始動から停止までの解説をしようと思いますが、今回は共通する部分の概略にとどめておきまして、さらに役判定(機種ごとに違う役)についてまとめます。
デジタル始動のスタート地点を設けます。
保留がある場合は一連の動作の区切りを恣意的にスタート地点とします。保留がない場合はスタートチャッカーに球が入ることで一連の動作がスタートします。
<第1ブロック>
スタート地点。
保留の有無にかかわりなく、スタートチャッカーに球が入ると保留のカウントをプラス1。
そのうえで、保留数のチェック。
5以上だったら4に修正。よって、回転中+保留3個がマックス。
例外は⑤BRAVT-Zで、6以上だったら5に修正。回転中+最大保留4個。
この後、ストップボタン非タッチ時の回転タイマーをセット(タイマーB)。
<第2ブロック>
割り込みごとにステップ進行。
ベタ押し(・適当にタッチ)・非タッチでこのブロックの滞在時間が変わる。
このブロックが終了するとストップボタンの受け付けは終了。
その際、「左デジタルの停止時間」「中デジタルの停止時間」「右デジタルの停止時間」を決定。
<第3ブロック>
「左デジタルの停止時間」を消化するまで割り込みごとにステップ進行→消化後左デジタル停止。
④BRAVT-Jと⑥BRA15-Jのみ、このブロック終了時に「中デジタルの停止時間」を再決定。
<第4ブロック>
「中デジタルの停止時間」を消化するまで割り込みごとにステップ進行→消化後中デジタル停止。
④BRAVT-Jと⑥BRA15-Jのみ、このブロック終了時に「右デジタルの停止時間」を再決定。
<第5ブロック>
「右デジタルの停止時間」を消化するまで割り込みごとにステップ進行→消化後右デジタル停止。
そして役判定。
<第6ブロック>
(ハズレも含めて)成立した役に応じた処理を行う。
終了後、スタート地点へ。
細かな数値関連やタイミング等は次回お伝えする予定です。
<第2ブロック>で左中右それぞれの停止時間を決定しています。
この決定に、前に触れた乱数(的なもの)がかかわってきます。
後のデジパチでは「スタートチャッカーに球が入った時の乱数値と当たりデータを参照比較する」という手法で判定を行うのが主流となりますが、このブラボーは違います。
乱数はデジタルの停止時間を決定する要素の1つとして参照されます。
そして、停止時間に則ってデジタルが全て停止したら、その時のデジタル表示を見て、役が成立しているかどうかをチェックするのです。
では<第5ブロック>の役判定に焦点を当てます。
機種ごとに「役」が微妙に異なるので、正直なところまったく頭には入っていません。
プログラムを見ながら記事を書いています。
おかしいと思ったら遠慮なくご指摘を。
「3」「7」いずれかの3つ揃い
⓪BRAVT-A … 大当たり(30.76秒×10R)
①BRAVT-B … 大当たり(30.76秒×10R)
②BRAVT-C … 大当たり(30.76秒×10R)
③BRAVT-F … 大当たり(30.76秒×10R)
④BRAVT-J … 大当たり(30.76秒×10R)
⑤BRAVT-Z … 大当たり(30.69秒×10R)
⑥BRA15-J … 大当たり(15.12秒×10R)
⑦BRA15-K … 大当たり(15.12秒×10R)
「3」「7」以外の3つ揃い
⓪BRAVT-A … 小当たり(10.25秒)
①BRAVT-B … 小当たり(10.25秒)
②BRAVT-C … 中当たり(6.15秒×10R)
③BRAVT-F … 小当たり(10.25秒)
④BRAVT-J … 小当たり(10.25秒)
⑤BRAVT-Z … 小当たり(10.18秒)
⑥BRA15-J … 小当たり(10.25秒)
⑦BRA15-K … 小当たり(10.18秒)
「3」「7」の2つ揃い
⓪BRAVT-A … 小当たり(10.25秒)
①BRAVT-B … 小当たり(10.25秒)
②BRAVT-C … 小当たり(10.25秒)
③BRAVT-F … 小当たり(10.25秒)
④BRAVT-J … 小当たり(10.25秒)
⑤BRAVT-Z … 小当たり(5.12秒)
⑥BRA15-J … 小当たり(10.25秒)
⑦BRA15-K … 小当たり(3.58秒)
上記以外
⓪BRAVT-A … おまけ(0.71秒)
①BRAVT-B … ハズレ
②BRAVT-C … おまけ(0.71秒)
③BRAVT-F … ハズレ
④BRAVT-J … ハズレ
⑤BRAVT-Z … ハズレ
⑥BRA15-J … ハズレ
⑦BRA15-K … ハズレ
⑦BRA15-Kの基板ケースだったかに「15秒機」みたいなシールが貼ってあったようです。
だからといってアタッカーの開放時間がぴったり15秒であるとは言い切れませんが、ぴったりであると仮定して時間を割り出しました。
前にどこかで割り込み周期は0.0042秒と言いましたが、もう少しだけ細かくいうと、0.0041666・・・秒です。
四捨五入しての0・0042秒なので、上記の時間は気持ち長めに記載してあることをご理解ください。