天天看點

世嘉土星系統memory mapping システムの使用するメモリのマッピングについて

世嘉土星在設計的時候參考了linux,但由于導入工具鍊過程中發現,由于增加土星的MMU,記憶體位址管理器,會顯著增加成本,且使用OS會導緻技能performance的下降,是以自己通過連結器DLT方式,由bios為IPL,實作了MMU管理功能,此篇為開發土星遊戲軟體的基礎文章,使用者自定義全局變量,靜态變量等,由DLT指定存放位址,随文附送 IDA PRO YSSLOADER,可以分析yabause的save state file

◎ システムの使用するメモリのマッピングについて

システムはスプライト、スクロールのコントロール用に WORK-HI領域の

0x40000バイトを使用しています。また、テクスチャに光源の影響を與え

る場合にグーローシェーディングを用いるため、このデータとしてVDP1の

VRAMの内264バイトを使用しています。それらの内分けと、デフォルト

の設定を以下に示します。

MAX_POLYGONS:    1786    使用できるポリゴン數

MAX_VERTICES:    2500    使用できる頂點數

MAX_TRANSFER:        20    ブランキング中の転送リクエスト數

MAX_NEST:            20    マトリクスのネスト數

slPutPolygon() は指定されたモデルで使用するポリゴン數、及び頂點數を加えた時

最大數を越える場合そのモデルは処理しません。

また、slPutSprite() , slDispSprite() , slSetSprite() は実行されるたびにポリゴン數

をひとつずつ加算し、最大數を越える場合にそのデータの処理を中止します。

(ただし、指定されたZ位置が表示範囲外の場合には加算されません)

ワークRAM:

    060C0000:    (SortList)

        スプライトコントロールデータのDMA転送用テーブルバッファ

        (MAX_POLYGONS+6)*3*4バイト = 0x5400

    060C5400:    (CLOfstBuf)

        光源の影響による発色データテーブル

        32*32 = 0x400

    060C5800:    (Zbuffer)

        ポリゴンソート用の1次バッファ(ウィンドウ0用)

        128*4 = 0x200

    060C5A00:    (Zbuffer2)

        ポリゴンソート用の1次バッファ2(ウィンドウ1用)

        128*4 = 0x200

    060C5C00:    (Zbuf_nest)

        ポリゴンソート用の2次バッファ

        256*4 = 0x400

    060C6000:    (Spritebuf)

        スプライトコントロールデータバッファ

        (MAX_POLYGONS+5)*36 = 0xFBDC

    060D5BDC:    (Spritebuf2)

        スプライトコントロールデータバッファ2

        (MAX_POLYGONS+5)*36 = 0xFBDC

    060E57B8:    (Pbuffer)

        ポリゴン演算用頂點位置バッファ

        MAX_VERTICES*16 = 0x9C40

    060EF3F8:    (CommandBuf)

        マスターからスレーブへのコマンド受渡しバッファ

        MAX_POLYGONS*32-0x1B38 = 0xC408

    060FB800:    (TransList)

        ブランキング中の転送リクエスト用のDMAコントロールテーブル

        MAX_TRANSFER*3*4バイト = 0xF0

    060FB8F0:

        スタック領域(0x4310)

    060FFC00:

        システム変數領域(GBRレジスタは常にここを指している)

        0x400バイト

システム変數は以下に示すもので、Cプログラムからも同じ名稱で読み出すことができる

    システム変數

    000:    (EventTop)    (EVENT *)    ; 先頭に登録されているイベント

    004:    (EventLast)    (EVENT *)    ; 末尾に登録されているイベント

    008:    (EventNow)    (EVENT *)    ; 実行中のイベント

    00C:    (EventCount)    (Uint16)    ; イベントの殘數

    00E:    (WorkCount)    (Uint16)    ; ワークの殘數

    010:    (MainMode)    (Uint8)        ; メインシーケンスモード

    011:    (SubMode)    (Uint8)        ; サブシーケンスモード

    012:    (SynchConst)    (Sint8)        ; ビデオ同期カウント

    013:    (SynchCount)    (Sint8)        ; ビデオ同期カウント

    014:    (UserFunction)    (void (*)())    ; ブランキング中に実行するユーザー関數

    018:    (TransCount)    (Uint16)    ; ブランキング中の転送エントリー數

    01A:    (TransRequest)    (Uint8)        ; ブランキング中の転送のリクエスト

    01B: (PauseFlag)    (Uint8)        ; スプライト、スクロールのポーズ用フラグ

     01C:    (mtptr)        (MATRIX *)    ; カレントマトリクスポインタ

    020:    (MatrixCount)    (Uint8)        ; マトリクスのネストカウント

    021:    (PrintColor)    (Uint8)        ; テキスト表示用カラーパレット

    022:    (IntCount)    (Uint16)    ; 割り込みカウント

    024:    (MsPbufPtr)    (Uint32 *)    ; 頂點座標演算バッファポインタ(Master)

    028:    (SlPbufPtr)    (Uint32 *)    ; 頂點座標演算バッファポインタ(Slave)

    02C:    (SpritePtr)    (Uint16 *)    ; スプライトデータ転送ポインタ

    030:    (MsSdataPtr)    (Uint16 *)    ; スプライトデータセットポインタ(Master)

    034:    (SlSdataPtr)    (Uint16 *)    ; スプライトデータセットポインタ(Master)

    038:    (ZbufPtr)    (void **)    ; Zバッファポインタ

    03C:    (FormTbl)    (TEXTURE *)    ; テクスチャデータテーブル

    040:    (SprbufBias)    (Uint32)    ; スプライトデータバッファ切り替え

    044:    (ComRdPtr)    (Uint32 *)    ; コマンドリードポインタ

    048:    (ComWrPtr)    (Uint32 *)    ; コマンドセットポインタ

    04C:    (MsLightVector)    (VECTOR)    ; 光源ベクトル(Master)

    058:    (SlLightVector)    (VECTOR)    ; 光源ベクトル(Master)

    064:    (ColorOffset)    (Uint8 *)    ; カラーオフセットテーブルポインタ

    068:    (MsScreenDist)    (FIXED)        ; スクリーン位置(Master)

    06C:    (SlScreenDist)    (FIXED)        ; スクリーン位置(Slave)

    070:    (MsZlimit)    (Sint16)    ; 表示リミットZ位置(Master)

    072:    (WindowNumber)    (Uint8)        ; ウィンドウ使用數

    073:    (WinUseFlag)    (Uint8)        ; ウィンドウ使用フラグ

    074:    (TotalPolygons)    (Uint16)    ; 演算ポリゴン數

    076:    (TotalVertices)    (Uint16)    ; 演算頂點數

    078:    (MsScreenLeft)    (Sint16)    ; スクリーン左位置

    07A:    (MsScreenTop)    (Sint16)    ; スクリーン上位置

    07C:    (MsScreenRight)    (Sint16)    ; スクリーン右位置

    07E:    (MsScreenBottom) (Sint16)    ; スクリーン下位置

    080:    (MsScreenSizeX)    (Uint16)    ; スクリーン橫サイズ(Master)

    082:    (MsScreenSizeY)    (Uint16)    ; スクリーン縦サイズ(Master)

    084:    (MsWindowSizeX)    (Uint16)    ; ウィンドウサイズ(Master)

    086:    (MsWindowSizeY)    (Uint16)    ; ウィンドウサイズ(Master)

    088:    (MXPolygons)    (Uint16)    ; 最大ポリゴン數

    08A:    (MXVertices)    (Uint16)    ; 最大頂點數

    08C:    (FrameSizeX)    (Uint16)    ; フレームバッファサイズ

    08E:    (FrameSizeY)    (Uint16)    ; フレームバッファサイズ

    090:    (MsWinXAdder)    (Sint16)    ; ウィンドウチェック用加算データ(Master)

    092:    (MsWinYAdder)    (Sint16)    ; ウィンドウチェック用加算データ(Master)

    094:    (SlWinXAdder)    (Uint16)    ; ウィンドウチェック用加算データ(Slave)

    096:    (SlWinYAdder)    (Uint16)    ; ウィンドウチェック用加算データ(Slave)

    098:    (MsClipXAdder)    (Sint16)    ; クリッピング用加算データ(橫)(Master)

    09A:    (MsClipYAdder)    (Sint16)    ; クリッピング用加算データ(縦)(Master)

    09C:    (SlClipXAdder)    (Sint16)    ; クリッピング用加算データ(橫)(Slave)

    09E:    (SlClipYAdder)    (Sint16)    ; クリッピング用加算データ(縦)(Slave)

    0A0:    (SlZlimit)    (Sint16)    ; 表示リミットZ位置(Slave)

    0A2:    (WinPtr)    (Uint16)    ; ウィンドウデータセットオフセット

    0A4:    (DispPolygons)    (Uint16)    ; 表示ポリゴン數

    0A6:    (DMAEndFlag)    (Uint8)        ; DMA転送終了フラグ(未使用)

    0A8:    (DMASetFlag)    (Uint8)        ; DMAテーブルセットフラグ

    0AA:    (PutCount)    (Uint16)    ; slPutPolygon(),sl...Sprite()呼び出し回數

    0AC:    (MsZdpsftcnt)    (Uint8)        ; 畫面表示リミットシフトカウンタ(Master)

    0AD:    (SlZdpsftcnt)    (Uint8)        ; 畫面表示リミットシフトカウンタ(Slave)

    0B0 : (Resolution)    (Uint8)        ; 畫面モード 

    0B1 : (NbPCMBf)    (Uint8)        ; PCMバッファの數(2000H単位)

    0B2 : (PCMBufFlag)    (Sint16)    ; PCMバッファの空き狀況フラグ

    0B4 : (SoundRdCount)    (Uint8)        ; サウンドバッファ読み出しカウンタ

    0B5 : (SoundWrCount)    (Uint8)        ; サウンドバッファエントリーカウンタ

    0B6 : (FRT_Count)    (Sint16)    ; FRTカウンタ

    0B7 : (SCUMC_ID)    (Uint8)        ; SCUメモリーコピーのチャンネルナンバー

    0B8 : (DMASt_CPU0)    (Uint8)        ; CPU D.M.A.のステータス(CH0)

    0BA : (DMASt_CPU1)    (Uint8)        ; CPU D.M.A.のステータス(CH1)

    0BB : (DMASt_SCU0)    (Uint8)        ; SCU D.M.A.のステータス(CH0)

    0BC : (DMASt_SCU1)    (Uint8)        ; SCU D.M.A.のステータス(CH1)

    0BD : (DMASt_SCU2)    (Uint8)        ; SCU D.M.A.のステータス(CH2)

    0BE : (--------)    (Uint16)    ; システム予約

    0C0:    (VDP2_TVMD)    (Uint16)    ; TV畫面モード

    0C2:    (VDP2_EXTEN)    (Uint16)    ; 外部信号イネーブル

    0C4:    (VDP2_TVSTAT)    (Uint16)    ; 畫面ステータス

    0C6:    (VDP2_VRSIZE)    (Uint16)    ; VRAMサイズ

    0C8:    (VDP2_HCNT)    (Uint16)    ; Hカウンター

    0CA:    (VDP2_VCNT)    (Uint16)    ; Vカウンター

    0CE:    (VDP2_RAMCTL)    (Uint16)    ; RAMコントロール

    0D0:    (VDP2_CYCA0L)    (Uint16)    ; VRAMサイクルパターン(バンクA0、T0ー3)

    0D2:    (VDP2_CYCA0U)    (Uint16)    ; VRAMサイクルパターン(バンクA0、T4ー7)

    0D4:    (VDP2_CYCA1L)    (Uint16)    ; VRAMサイクルパターン(バンクA1、T0ー3)

    0D6:    (VDP2_CYCA1U)    (Uint16)    ; VRAMサイクルパターン(バンクA1、T4ー7)

    0D8:    (VDP2_CYCB0L)    (Uint16)    ; VRAMサイクルパターン(バンクB0、T0ー3)

    0DA:    (VDP2_CYCB0U)    (Uint16)    ; VRAMサイクルパターン(バンクB0、T4ー7)

    0DC:    (VDP2_CYCB1L)    (Uint16)    ; VRAMサイクルパターン(バンクB1、T0ー3)

    0DE:    (VDP2_CYCB1U)    (Uint16)    ; VRAMサイクルパターン(バンクB1、T4ー7)

    0E0:    (VDP2_BGON)    (Uint16)    ; 畫面表示イネーブル

    0E2:    (VDP2_MZCTL)    (Uint16)    ; モザイクコントロール

    0E4:    (VDP2_SFSEL)    (Uint16)    ; 特殊機能コードセレクト

    0E6:    (VDP2_SFCODE)    (Uint16)    ; 特殊機能コード

    0E8:    (VDP2_CHCTLA)    (Uint16)    ; キャラクタコントロール(NBG0、NBG1)

    0EA:    (VDP2_CHCTLB)    (Uint16)    ; キャラクタコントロール(NBG2、NBG3、RBG0)

    0EC:    (VDP2_BMPNA)    (Uint16)    ; ビットマップパレットナンバー(NBG0、1)

    0EE:    (VDP2_BMPNB)    (Uint16)    ; ビットマップパレットナンバー(RBG0)

    0F0:    (VDP2_PNCN0)    (Uint16)    ; パターンネームコントロール(NBG0)

    0F2:    (VDP2_PNCN1)    (Uint16)    ; パターンネームコントロール(NBG1)

    0F4:    (VDP2_PNCN2)    (Uint16)    ; パターンネームコントロール(NBG2)

    0F6:    (VDP2_PNCN3)    (Uint16)    ; パターンネームコントロール(NBG3)

    0F8:    (VDP2_PNCR)    (Uint16)    ; パターンネームコントロール(RBG0)

    0FA:    (VDP2_PLSZ)    (Uint16)    ; プレーンサイズ

    0FC:    (VDP2_MPOFN)    (Uint16)    ; マップオフセット(NBG0ー3)

    0FE:    (VDP2_MPOFR)    (Uint16)    ; マップオフセット(回転パラメータA、B)

    100:    (VDP2_MPABN0)    (Uint16)    ; マップ(NBG0プレーンA、B)

    102:    (VDP2_MPCDN0)    (Uint16)    ; マップ(NBG0プレーンC、D)

    104:    (VDP2_MPABN1)    (Uint16)    ; マップ(NBG1プレーンA、B)

    106:    (VDP2_MPCDN1)    (Uint16)    ; マップ(NBG1プレーンC、D)

    108:    (VDP2_MPABN2)    (Uint16)    ; マップ(NBG2プレーンA、B)

    10A:    (VDP2_MPCDN2)    (Uint16)    ; マップ(NBG2プレーンC、D)

    10C:    (VDP2_MPABN3)    (Uint16)    ; マップ(NBG3プレーンA、B)

    10E:    (VDP2_MPCDN3)    (Uint16)    ; マップ(NBG3プレーンC、D)

    110:    (VDP2_MPABRA)    (Uint16)    ; マップ(回転パラメータAプレーンA、B)

    112:    (VDP2_MPCDRA)    (Uint16)    ; マップ(回転パラメータAプレーンC、D)

    114:    (VDP2_MPEFRA)    (Uint16)    ; マップ(回転パラメータAプレーンE、F)

    116:    (VDP2_MPGHRA)    (Uint16)    ; マップ(回転パラメータAプレーンG、H)

    118:    (VDP2_MPIJRA)    (Uint16)    ; マップ(回転パラメータAプレーンI、J)

    11A:    (VDP2_MPKLRA)    (Uint16)    ; マップ(回転パラメータAプレーンK、L)

    11C:    (VDP2_MPMNRA)    (Uint16)    ; マップ(回転パラメータAプレーンM、N)

    11E:    (VDP2_MPOPRA)    (Uint16)    ; マップ(回転パラメータAプレーンO、P)

    120:    (VDP2_MPABRB)    (Uint16)    ; マップ(回転パラメータBプレーンA、B)

    122:    (VDP2_MPCDRB)    (Uint16)    ; マップ(回転パラメータBプレーンC、D)

    124:    (VDP2_MPEFRB)    (Uint16)    ; マップ(回転パラメータBプレーンE、F)

    126:    (VDP2_MPGHRB)    (Uint16)    ; マップ(回転パラメータBプレーンG、H)

    128:    (VDP2_MPIJRB)    (Uint16)    ; マップ(回転パラメータBプレーンI、J)

    12A:    (VDP2_MPKLRB)    (Uint16)    ; マップ(回転パラメータBプレーンK、L)

    12C:    (VDP2_MPMNRB)    (Uint16)    ; マップ(回転パラメータBプレーンM、N)

    12E:    (VDP2_MPOPRB)    (Uint16)    ; マップ(回転パラメータBプレーンO、P)

    130:    (VDP2_SCXN0)    (FIXED)        ; 畫面スクロール値(NBG0、水準方向固定小數)

    130:     (VDP2_SCXIN0)    (Sint16)    ; 畫面スクロール値(NBG0、水準方向整數部)

    132:     (VDP2_SCXDN0)    (Uint16)    ; 畫面スクロール値(NBG0、水準方向小數部)

    134:    (VDP2_SCYN0)    (FIXED)        ; 畫面スクロール値(NBG0、垂直方向固定小數)

    134:     (VDP2_SCYIN0)    (Uint16)    ; 畫面スクロール値(NBG0、垂直方向整數部)

    136:     (VDP2_SCYDN0)    (Uint16)    ; 畫面スクロール値(NBG0、垂直方向小數部)

    138:    (VDP2_ZMXN0)    (FIXED)        ; 座標増分(NBG0、水準方向固定小數)

    138:     (VDP2_ZMXIN0)    (Uint16)    ; 座標増分(NBG0、水準方向整數部)

    13A:     (VDP2_ZMXDN0)    (Uint16)    ; 座標増分(NBG0、水準方向小數部)

    13C:    (VDP2_ZMYN0)    (FIXED)        ; 座標増分(NBG0、垂直方向固定小數)

    13C:     (VDP2_ZMYIN0)    (Uint16)    ; 座標増分(NBG0、垂直方向整數部)

    13E:     (VDP2_ZMYDN0)    (Uint16)    ; 座標増分(NBG0、垂直方向小數部)

    140:    (VDP2_SCXN1)    (FIXED)        ; 畫面スクロール値(NBG1、水準方向固定小數)

    140:     (VDP2_SCXIN1)    (Uint16)    ; 畫面スクロール値(NBG1、水準方向整數部)

    142:     (VDP2_SCXDN1)    (Uint16)    ; 畫面スクロール値(NBG1、水準方向小數部)

    144:    (VDP2_SCYN1)    (FIXED)        ; 畫面スクロール値(NBG1、垂直方向固定小數)

    144:     (VDP2_SCYIN1)    (Uint16)    ; 畫面スクロール値(NBG1、垂直方向整數部)

    146:     (VDP2_SCYDN1)    (Uint16)    ; 畫面スクロール値(NBG1、垂直方向小數部)

    148:    (VDP2_ZMXN1)    (FIXED)        ; 座標増分(NBG1、水準方向固定小數)

    148:     (VDP2_ZMXIN1)    (Uint16)    ; 座標増分(NBG1、水準方向整數部)

    14A:     (VDP2_ZMXDN1)    (Uint16)    ; 座標増分(NBG1、水準方向小數部)

    14C:    (VDP2_ZMYN1)    (FIXED)        ; 座標増分(NBG1、垂直方向固定小數)

    14C:     (VDP2_ZMYIN1)    (Uint16)    ; 座標増分(NBG1、垂直方向整數部)

    14E:     (VDP2_ZMYDN1)    (Uint16)    ; 座標増分(NBG1、垂直方向小數部)

    150:    (VDP2_SCXN2)    (Uint16)    ; 畫面スクロール値(NBG2、水準方向)

    152:    (VDP2_SCYN2)    (Uint16)    ; 畫面スクロール値(NBG2、垂直方向)

    154:    (VDP2_SCXN3)    (Uint16)    ; 畫面スクロール値(NBG3、水準方向)

    156:    (VDP2_SCYN3)    (Uint16)    ; 畫面スクロール値(NBG3、垂直方向)

    158:    (VDP2_ZMCTL)    (Uint16)    ; 縮小イネーブル

    15A:    (VDP2_SCRCTL)    (Uint16)    ; ライン&縦セルスクロールコントロール

    15C:    (VDP2_VCSTA)    (Uint16 *)    ; 縦セルスクロールテーブルアドレス

    160:    (VDP2_LSTA0)    (Sint16 *)    ; NBG0用ラインスクロールテーブルアドレス

    164:    (VDP2_LSTA1)    (Sint16 *)    ; NBG1用ラインスクロールテーブルアドレス

    168:    (VDP2_LCTA)    (Uint16 *)    ; ラインカラー畫面テーブルアドレス

    16C:    (VDP2_BKTA)    (Uint16 *)    ; バック畫面テーブルアドレス

    170:    (VDP2_RPMD)    (Uint16)    ; 回転パラメータモード

    172:    (VDP2_RPRCTL)    (Uint16)    ; 回転パラメータリードコントロール

    174:    (VDP2_KTCTL)    (Uint16)    ; 係數テーブルコントロール

    176:    (VDP2_KTAOF)    (Uint16)    ; 係數テーブルアドレスオフセット

    178:    (VDP2_OVPNRA)    (Uint16)    ; 畫面オーバーパターンネーム

    17A:    (VDP2_OVPNRB)    (Uint16)    ; 畫面オーバーパターンネーム

    17C:    (VDP2_RPTA)    (Sint32 *)    ; 回転パラメータテーブルアドレス

    180:    (VDP2_WPSX0)    (Uint16)    ; ウィンドウポジション(H start)

    182:    (VDP2_WPSY0)    (Uint16)    ; ウィンドウポジション(V start)

    184:    (VDP2_WPEX0)    (Uint16)    ; ウィンドウポジション(H stop)

    186:    (VDP2_WPEY0)    (Uint16)    ; ウィンドウポジション(V stop)

    188:    (VDP2_WPSX1)    (Uint16)    ; ウィンドウポジション(H start)

    18A:    (VDP2_WPSY1)    (Uint16)    ; ウィンドウポジション(V start)

    18C:    (VDP2_WPEX1)    (Uint16)    ; ウィンドウポジション(H stop)

    18E:    (VDP2_WPEY1)    (Uint16)    ; ウィンドウポジション(V stop)

    190:    (VDP2_WCTLA)    (Uint16)    ; ウィンドウコントロール

    192:    (VDP2_WCTLB)    (Uint16)    ; ウィンドウコントロール

    194:    (VDP2_WCTLC)    (Uint16)    ; ウィンドウコントロール

    196:    (VDP2_WCTLD)    (Uint16)    ; ウィンドウコントロール

    198:    (VDP2_LWTA0)    (Uint16 *)    ; ラインウィンドウテーブルアドレス

    19C:    (VDP2_LWTA1)    (Uint16 *)    ; ラインウィンドウテーブルアドレス

    1A0:    (VDP2_SPCTL)    (Uint16)    ; スプライトコントロール

    1A2:    (VDP2_SDCTL)    (Uint16)    ; シャドウコントロール

    1A4:    (VDP2_CRAOFA)    (Uint16)    ; カラーRAMアドレスオフセット(NBG0ー3)

    1A6:    (VDP2_CRAOFB)    (Uint16)    ; カラーRAMアドレスオフセット(RBG0、スプライト)

    1A8:    (VDP2_LNCLEN)    (Uint16)    ; ラインカラー畫面イネーブル

    1AA:    (VDP2_SFPRMD)    (Uint16)    ; 特殊プライオリティモード

    1AC:    (VDP2_CCCTL)    (Uint16)    ; カラー演算コントロール

    1AE:    (VDP2_SFCCMD)    (Uint16)    ; 特殊カラー演算モード

    1B0:    (VDP2_PRISA)    (Uint16)    ; プライオリティナンバー

    1B2:    (VDP2_PRISB)    (Uint16)    ; プライオリティナンバー

    1B4:    (VDP2_PRISC)    (Uint16)    ; プライオリティナンバー

    1B6:    (VDP2_PRISD)    (Uint16)    ; プライオリティナンバー

    1B8:    (VDP2_PRINA)    (Uint16)    ; プライオリティナンバー

    1BA:    (VDP2_PRINB)    (Uint16)    ; プライオリティナンバー

    1BC:    (VDP2_PRIR)    (Uint16)    ; プライオリティナンバー

    1BE: (--------)    (Uint16)    ; システム予約

    1C0:    (VDP2_CCRSA)    (Uint16)    ; カラー演算割合(スプライト0、1)

    1C2:    (VDP2_CCRSB)    (Uint16)    ; カラー演算割合(スプライト2、3)

    1C4:    (VDP2_CCRSC)    (Uint16)    ; カラー演算割合(スプライト4、5)

    1C6:    (VDP2_CCRSD)    (Uint16)    ; カラー演算割合(スプライト6、7)

    1C8:    (VDP2_CCRNA)    (Uint16)    ; カラー演算割合(NBG0、1)

    1CA:    (VDP2_CCRNB)    (Uint16)    ; カラー演算割合(NBG2、3)

    1CC:    (VDP2_CCRR)    (Uint16)    ; カラー演算割合(RGB0)

    1CE:    (VDP2_CCRLB)    (Uint16)    ; カラー演算割合(ラインカラー畫面、バック畫面)

    1D0:    (VDP2_CLOFEN)    (Uint16)    ; カラーオフセットイネーブル

    1D2:    (VDP2_CLOFSL)    (Uint16)    ; カラーオフセットセレクト

    1D4:    (VDP2_COAR)    (Uint16)    ; カラーオフセットA(Red)

    1D6:    (VDP2_COAG)    (Uint16)    ; カラーオフセットA(Green)

    1D8:    (VDP2_COAB)    (Uint16)    ; カラーオフセットA(Blue)

    1DA:    (VDP2_COBR)    (Uint16)    ; カラーオフセットB(Red)

    1DC:    (VDP2_COBG)    (Uint16)    ; カラーオフセットB(Green)

    1DE:    (VDP2_COBB)    (Uint16)    ; カラーオフセットB(Blue)

    1E0:    (ScrRotPtr)    (ROTSCROLL *)    ; 操作する回転パラメータのアドレス

    1E4:    (nbg0_char_adr)    (void *)    ; NBG0用CGアドレス

    1E8:    (nbg1_char_adr)    (void *)    ; NBG1用CGアドレス

    1EC:    (nbg2_char_adr)    (void *)    ; NBG2用CGアドレス

    1F0:    (nbg3_char_adr)    (void *)    ; NBG3用CGアドレス

    1F4:    (ra_char_adr)    (void *)    ; RBG0(パラメータA)用CGアドレス

    1F8:    (rb_char_adr)    (void *)    ; RBG0(パラメータB)用CGアドレス

    1FC:    (nbg0_page_adr)    (void *)    ; NBG0用パターンネームアドレス

    200:    (nbg1_page_adr)    (void *)    ; NBG1用パターンネームアドレス

    204:    (nbg2_page_adr)    (void *)    ; NBG2用パターンネームアドレス

    208:    (nbg3_page_adr)    (void *)    ; NBG3用パターンネームアドレス

    20C:    (ra_page_adr)    (void *)    ; RBG0(パラメータA)用パターンネームアドレス

    210:    (rb_page_adr)    (void *)    ; RBG0(パラメータB)用パターンネームアドレス

    214:    (rpara_vram_adr)(void *)    ; 回転パラメータセットアドレス

    218:    (k_table_adr)    (void *)    ; 係數テーブルセットアドレス

    21C:    (RotScrParA)    (ROTSCROLL)    ; 回転パラメータA

    284:    (RotScrParB)    (ROTSCROLL)    ; 回転パラメータB

    2EC: (Nbg2_PosX)    (FIXED)        ; NBG2 表示位置 (X)

    2F0: (Nbg2_PosY)    (FIXED)        ; NBG2 表示位置 (Y)

    2F4: (Nbg3_PosX)    (FIXED)        ; NBG3 表示位置 (X)

    2F8: (Nbg3_PosY)    (FIXED)        ; NBG3 表示位置 (Y)

    2FC:    (Window_data)    (Uint16[22])    ; ウィンドウコントロールデータバッファ(2つ分)

    328:    (Center_data)    (Uint16[10])    ; ウィンドウ中心コントロールデータバッファ(2つ分)

    33C:    (RandWork)    (Uint32)    ; 亂數生成用ワーク

    340: (CDReadExec)    (void*())    ; CD読み込みサーバー関數

    344: (DMA_TRANS)    (Uint32[10])    ; CPU D.M.A. パラメータ

    36C: (SOUND)        (void*[3])    ; サウンドバッファポインタ

    378: (PERIPHERAL)    (Uint32[12])    ; ペリフェラルコントロールデータ

○ VDP1_VRAM

    0x25C00000から始まるVDP1のVRAMで先頭と末尾の領域はシステムによって

  使用されているため、ユーザーは使用できない。

  25C00000: スプライトコントロールコマンド

    (MAX_POLYGON + 6) * 32 = 0xE1C0

  25C7FF00: グーローシェーディングテーブル

    2*4*33 = 0x108(264)

○ VDP2_VRAM

    0x25E00000から始まるVDP2のVRAMはシステム初期化の際、以下の様に

  區分されている。

  25E00000: VDP2_VRAM_A0

    回転スクロール用CGデータ

  25E20000: VDP2_VRAM_A1

    回転スクロール用係數データ及び、回転パラメータ

  25E40000: VDP2_VRAM_B0

    回転スクロール用パターンネームデータ

  25E60000: VDP2_VRAM_B1

    ノーマルスクロール用データ

    この領域はCGとパターンネームが共有している。

    25E60000~25E67FFF    (NBG0及びNBG1用CGデータ)

    25E68000~25E75FFF    (NBG1用CGデータ)

    25E76000~25E77FFF    (NBG0用パターンネームデータ1ページ)

    25E78000~25E7FFFF    (NBG1用パターンネームデータ4ページ)

  CGはどのスクロールも256色モードでパターンネームは1ワード/セルになっている。

  NBG0は各セルごとに反転のフラグを持つ10ビットモードで、他の面は反転を面ごとに

  使用する12ビットモードとなっている。

  カラーRAMは16ビット2048色モードで、オフセットは使用していない。

  バック面は単色で、25E3FFFEにカラーデータ(0000)を入れている。

 06000000 : +---------------------------+

        | Boot ROM BIOS functions    |

 06000800 : +---------------------------+

        | Slave CPU Stack Area    |

 06001000 : +---------------------------+

        | Master CPU default Stack    |

 06002000 : +---------------------------+

        | ???            |

 06004000 : +---------------------------+

        |                |

        | User Program & Data    |

        |                |

 060C0000 : +---------------------------+

        |                |

        | SortList    (5400)        |

        |                |

 060C5400 : +---------------------------+

        | TransList    (F0)        |

 060C54F0 : +---------------------------+

        | Zbuffer    (200)        |

 060C56F0 : +---------------------------+

        | Zbuffer2    (200)        |

 060C58F0 : +---------------------------+

        | Zbuf_nest    (400)        |

 060C5CF0 : +---------------------------+

        |                |

        | Spritebuf    (FBDC)        |

        |                |

 060D58CC : +---------------------------+

        |                |

        | Spritebuf2(FBDC)        |

        |                |

 060E54A8 : +---------------------------+

        |                |

        | Pbuffer    (9C40)        |

        |                |

 060EF0E8 : +---------------------------+

        | CLOfstBuf    (400)        |

 060EF4E8 : +---------------------------+

        |                |

        | CommandBuf(DF40)        |

        |                |

 060FD428 : +---------------------------+

        |                |

        | Stack Area(27D8)        |

        |                |

 060FFC00 : +---------------------------+

        | SystemWork(400)        |

 06100000 : +---------------------------+

 25C00000 : +---------------------------+

        |                |

        | SpriteCommand(E1C0)    |

        |                |

 25C0E1C0 : +---------------------------+

        |                |

        | Free (for User)        |

        |                |

 25C7FEF8 : +---------------------------+

        | Gouraud table(108)    |

 25C80000 : +---------------------------+

 25E00000 : +---------------------------+

        |                |

        | RBG0 CG (2048chars)    |

        |                |

 25E20000 : +---------------------------+

        |                |

        | RBG0 K table        |

        |                |

 25E40000 : +---------------------------+

        |                |

        | RBG0 Map (16pages)    |

        |                |

 25E60000 : +---------------------------+

        | NBG0 , NBG1 CG (512 chars)|

 25E68000 : +- - - - - - - - - - - - - -+

        | NBG1 CG (+896chars)    |

 25E76000 : +---------------------------+

        | NBG0 Map (1page)        |

 25E78000 : +---------------------------+

        | NBG1 Map (4pages)        |

 25E80000 : +---------------------------+

;---------------------------------------------------------------------------

◎ システムワークRAM領域のカスタマイズについて

060FFC00から始まるシステム変數領域はシステムで固定されていますが、

ワークRAMとして使用される領域(デフォルトでは 060C0000~)について

は、以下に示す変數をユーザーが定義することによりカスタマイズ可能です。

(ただし、一部を変更する場合でも全ての変數を設定するようにして下さい)

    void*   MasterStack = (void*)0x60ffc00 ;    

    void*   SlaveStack  = (void*)0x6001e00 ;    

    Uint16  MaxVertices = 2500 ;        

    Uint16  MaxPolygons = 1786 ;        

    Uint16  EventSize = 0x80 ;            

    Uint16  WorkSize = 0x40 ;            

    Uint16  MaxEvents = 64 ;            

    Uint16  MaxWorks = 256 ;            

    void*   SortList = (void*)0x60c0000 ;    

    Uint32  SortListSize = 0x5400 ;        

    void*   TransList = (void*)0x60fb800 ;    

    void*   Zbuffer = (void*)0x60c5800 ;    

    void*   SpriteBuf (void*)0x60c6000 ;    

    Uint32  SpriteBufSize = 0x1f7b8 ;        

    void*   Pbuffer = (void*)0x60e57b8 ;    

    void*   CLOfstBuf = (void*)0x60c5400 ;    

    void*   CommandBuf = (void*)0x60ef3f8 ;    

    void*   PCM_Work = (void*)0x25a78000 ;    

    Uint32  PCM_WkSize = 0x8000 ;        

    EVENT  EventBuf[MAX_EVENTS] ;    

    WORK   WorkBuf[MAX_WORKS] ;        

    EVENT* RemainEvent[MAX_EVENTS] ;    

    WORK*  RemainWork[MAX_WORKS] ;    

それぞれの領域の設定は以下の注意點を必ず守るようにして下さい。

(1) SortList と TransList は SCU D.M.A.を間接モードで使用するため、

     テーブルのサイズを越える2のべき乗數で領域調整するようにして下さい。

     SortList は スプライト(ポリゴン)データ及び、ウィンドウ等のデータの

     転送にも使用するため、表示される最大スプライト數 + 6個分のエントリー

     を確保して下さい。

     ひとつのエントリーにつき12バイトのテーブルを使用します。

     例えば、1000スプライト表示する場合には

    (1000+6) * 12 = 12072(2F28H) となりますので、

     4000Hバウンダリのアドレスに設定する。

     また、TransList はブランキング中の転送リクエストに使用され20エント

     リーまでとなっていますので、

    20 * 12 = 240(F0H) バイト必要ですので、

     100H バウンダリのアドレスに設定して下さい。

(2) Zbuffer , CLOfstBuf は サイズが固定で 4バイトバウンダリのアドレスに

     設定して下さい。

(3) CommandBuf は 表示制禦関數(slPutPolygon , slDispSprite等)の実行回數

     * 80バイト + 100H ぐらいのサイズを確保して下さい。

     実行関數が特定できる場合には 次の表を參考にバッファサイズを設定して

     下さい。

    slPutPolygon    72バイト

    slDispPolygon    16バイト

    slPutSprite    36バイト

    slDispSprite    36バイト

    slSetSprite    16バイト

    slPerspective      8バイト

    slWindow    20バイト

    slLight        16バイト

    slZdspLevel      4バイト

     この他にシステムが各フレームごとにファンクションを送っているため、

     その分の餘裕を見るようにして下さい。

(4) SpriteBuf は スプライトコントロールデータをセットするバッファで、

     各フレームで前半と後半とを切替えながら使用します。

     したがって、(実際に表示されるスプライト(ポリゴン)數 + 5個) * 36

     バイト * 2バンク 分のバッファが必要になります。

(5) Pbuffer は ポリゴンモデルを表示する際に座標変換、透視変換の演算用の

     バッファとして使用する領域で、slPutPolygon , slDispPolygon を使用し

     ないアプリケーションでは必要ありませんので、他のバッファと重複しても

     問題はありません。

(6) MaxPolygons , MaxVertices は 表示制禦関數を実行する際にバッファオー

     バーをチェックするために使用しますが、実際に表示される數ではなく、

     エントリーされている數に対してチェックを行なっていますので、

     MaxPolygons に関しては 必ずしも SortListSize , SpriteBufSize と合って

     いる必要はありません。

(7) PCM_Work はサウンドCPUの領域で、サイズが 2000H単位となります

     ので、サウンド擔當者と相談の上設定して下さい。

以下に ワークRAMの設定を行なうサンプル(workarea.c)を示します。

#include  "sl_def.h"

#define        SystemWork        0x060ffc00    

#define        _Byte_            sizeof(Uint8)

#define        _Word_            sizeof(Uint16)

#define        _LongWord_        sizeof(Uint32)

#define        _Sprite_        (sizeof(Uint16) * 18)

#define        AdjWork(pt,sz,ct)    (pt + (sz) * (ct))

#define        MAX_VERTICES         500

#define        MAX_POLYGONS         100

#define        WORK_AREA        0x060f0000

    enum workarea{

    sort_list  = WORK_AREA ,

    zbuffer    = AdjWork(sort_list  , _LongWord_ * 3 , MAX_POLYGONS + 6) ,

    spritebuf  = AdjWork(zbuffer    , _LongWord_ , 512) ,

    pbuffer    = AdjWork(spritebuf  , _Sprite_ , (MAX_POLYGONS + 6) * 2) ,

    clofstbuf  = AdjWork(pbuffer    , _LongWord_ * 4 , MAX_VERTICES) ,

    commandbuf = AdjWork(clofstbuf  , _Byte_ * 32 , 32) ,

    NextEntry  = AdjWork(commandbuf , _LongWord_ * 8 , MAX_POLYGONS)

    } ;

#define        PCM_Buffer        SoundRAM+0x78000

    const void*   MasterStack   = (void*)(WORK_AREA - 0x800) ;

    const void*   SlaveStack    = (void*)(WORK_AREA) ;

    const Uint16  MaxVertices   = MAX_VERTICES ;

    const Uint16  MaxPolygons   = MAX_POLYGONS ;

    const Uint16  EventSize     = sizeof(EVENT) ;

    const Uint16  WorkSize      = sizeof(WORK) ;

    const Uint16  MaxEvents     = MAX_EVENTS ;

    const Uint16  MaxWorks      = MAX_WORKS ;

    const void*   SortList      = (void*)(sort_list) ;

    const Uint32  SortListSize  = (MAX_POLYGONS + 6) * _LongWord_ * 3 ;

    const void*   Zbuffer       = (void*)(zbuffer) ;

    const void*   SpriteBuf     = (void*)(spritebuf) ;

    const Uint32  SpriteBufSize = _Sprite_ * (MAX_POLYGONS + 6) * 2 ;

    const void*   Pbuffer       = (void*)(pbuffer) ;

    const void*   CLOfstBuf     = (void*)(clofstbuf) ;

    const void*   CommandBuf    = (void*)(commandbuf) ;

    const void*   PCM_Work      = (void*)(PCM_Buffer) ;

    const Uint32  PCM_WkSize    = 0x8000 ;

    const void*   TransList     = (void*)(SystemWork - 0x0100) ;

    EVENT  EventBuf[MAX_EVENTS] ;

    WORK   WorkBuf[MAX_WORKS] ;

    EVENT* RemainEvent[MAX_EVENTS] ;

    WORK*  RemainWork[MAX_WORKS] ;