カピバラ父さんのプログラミング処方箋~スーパーバイザーモード

「スーパーバイザーモード」という響きに、何か中二病的な魅力を感じますが、 これは「ユーザーモード」と対をなす、68000CPUの動作状態のことです。

「特権モード」とも呼ばれ、ユーザモードにかかっている制限を受けない、 68000CPUの真の実力を発揮できるモードと考えておけばよいでしょう。

安全装置の外し方

_SUPER   equ  $ff20


    clr.l   -(sp)
    DOS     _SUPER
    move.l  d0,(sp)

	:

    DOS      _SUPER
    addq.l   #4,sp

スタックにロングワードでゼロを積んで、DOSコール _SUPERを呼び出すと、 スーパーバイザーモードになります。

コール後にd0レジスタに戻ってきた値(前のSSP)は、後でユーザモードに戻すときに使います

どこかに保存しておくのですが、ちょうどスタックトップに先程ゼロを積んでいた場所があるので、 そこに置くと良いです。スタック補正は、敢えてしません。

2回めの_SUPERでは、スタックトップに先のSSP値が残っていますので、 そのままDOSコールを行い、その後にスタック補正をしています。

スーパーバイザーモードを使う理由

ユーザーモードのプログラムは、アクセスできるメモリ範囲に制限があります。 具体的には、OSがロードされている場所やそのワークエリア、それにVRAMやIOポートのアドレスです。

プログラムでこのあたりにアクセスしたいときには、DOSコールやIOCSコールを使うこともできます。

ただ、ゲームプログラムで頻繁にVRAMをアクセスするときには、システムコールを介さず直接操作したほうが効率的で、 また、X68000を使いこなしている感が強く得られます。

必要な場面で一時的にスーパーバイザーモードに切り替えるか、 終始スーパーバイザーモードで動作するかは、プログラマの判断です。

なお、割込み処理は自動的にスーパーバイザーモードですので、切り替え不要です。

このほか、スーパーバイザーモードでしか実行できない命令(特権命令)という、中二病万歳な機能がありますが、 ゲーム制作に必須ではないので割愛します。


プログラミング処方箋へ

Copyright©2026 カピバラ父さん