ロザンヌの信号出力処理

アーケードゲーム基板専用多機能連射装置:R-03N(ロザンヌ)の中の人、duefukuと申します。これからロザンヌのことを不定期でちょこちょこ書いていこうと思いますのでどうぞよろしくお願いします。
ゲーム基板に関してある程度知識がないと意味不明かもしれませんが何となく伝わったらいいなーと。


で、初っ端からいきなりですが最重要である基板への信号出力処理について説明します。ユーザーのコンパネ操作をロザンヌで把握して基板へ信号を出力する処理ですが、大まかな流れは以下のようになっています。(※図中のms=ミリ秒:1/1000秒です)

◆ ロザンヌver.2までの処理

  1. 基板の垂直同期信号(VSync)の立ち下がりをきっかけに一定時間のカウント開始
  2. 一定時間経過したらコンパネ状態(レバーやボタンの入力状態)をチェック
  3. 設定内容とコンパネ状態から基板への出力を計算
  4. 計算終わり次第計算結果に基づき基板へ信号を出力

f:id:duefuku:20210228121924p:plain

一定時間待つ理由は、色んな基板に対して相性問題の起こりにくいタイミングで出力するためです。またVSync立ち下がり時点ではなく一定時間後にコンパネ状態をチェックする理由は、ギリギリまで待ってなるべく出力処理と近づけた方が良いと考えたからです。

◆ 出力タイミングの調整

ロザンヌver.3からは基板へ信号を出力するタイミングを調整できるようになりましたが、これは以下の通りです。

  1. 基板の垂直同期信号(VSync)の立ち下がりをきっかけに0.1msタイマーのカウント開始
  2. 0.1msタイマーのカウントを繰り返し、出力タイミングに到達したら3へ移行
  3. コンパネ状態をチェック
  4. 設定内容とコンパネから基板への出力を計算
  5. 計算終わり次第計算結果に基づき基板へ信号を出力

f:id:duefuku:20210228122012p:plain

この図のように0.1msタイマーの繰り返し回数をユーザー側で設定可能とすることで、0.1ms刻みで出力タイミングを調整できるようになりました。
一方、ここでもver.2までと同様に出力の計算が終わり次第基板へ信号を出力しています。設定内容によっては出力の計算にかかる時間が変動するため、このやり方では基板へ信号を出力するタイミングが安定せず1ms程度前後します。ここにまだ改善の余地があります。

◆ ロザンヌver.3以降の処理(最終版)

そこで最終的にver.3以降では出力タイミングを安定させるために以下のようにしています。

  1. 基板の垂直同期信号(VSync)の立ち下がりをきっかけに0.1msタイマーのカウント開始
  2. 0.1msタイマーのカウントを繰り返し、出力タイミングに到達したら3へ移行
  3. 2msタイマーのカウント開始
  4. コンパネ状態をチェック
  5. 設定内容とコンパネ状態から基板への出力を計算
  6. 2ms経過したら計算結果に基づき基板へ信号を出力

f:id:duefuku:20210228122034p:plain

出力の計算にかかる時間は設定内容で変動するものの、最長でも2ms以内には収まります。そこで計算開始から2ms経過したら基板へ出力するよう2msタイマーを使うことで、出力タイミングを安定させることが出来ました。このため上の図で出力タイミングの設定値を0にしても実際に出力されるのは2ms後となります。出力タイミングの最速が2msなのはこう言う事情です。本当は2msをもっと縮めたかったのですが、色んな機能を詰め込んだ影響もあり私にはこれが限界でした。


ロザンヌの信号出力処理は大体こんな感じです。この様な処理をするには汎用ロジックICでは難しいためマイコンを使用してソフトウェア(C言語)で実現していますが、それなりに安定して連射できているようです。


今回はここまでにします。最後まで読んでいただきありがとうございました!次の記事はいつになることやら...