世嘉土星在设计的时候参考了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 ;    /* Master Stack area End */
    void*   SlaveStack  = (void*)0x6001e00 ;    /* Slave Stack area End */
    Uint16  MaxVertices = 2500 ;        /* Calculatable vertice numbers */
    Uint16  MaxPolygons = 1786 ;        /* Calculatable polygon numbers */
    Uint16  EventSize = 0x80 ;            /* sizeof(EVENT) */
    Uint16  WorkSize = 0x40 ;            /* sizeof(WORK) */
    Uint16  MaxEvents = 64 ;            /* Useful Event count */
    Uint16  MaxWorks = 256 ;            /* Useful Work count */
    void*   SortList = (void*)0x60c0000 ;    /* SCU D.M.A. Table */
    Uint32  SortListSize = 0x5400 ;        /* Sprite transfer request table size */
    void*   TransList = (void*)0x60fb800 ;    /* SCU D.M.A. Table */
    void*   Zbuffer = (void*)0x60c5800 ;    /* (128 + 128 + 256) * 4 Bytes fix */
    void*   SpriteBuf (void*)0x60c6000 ;    /* Sprite control data buffer */
    Uint32  SpriteBufSize = 0x1f7b8 ;        /* Sprite control data buffer size */
    void*   Pbuffer = (void*)0x60e57b8 ;    /* Point calculate buffer */
    void*   CLOfstBuf = (void*)0x60c5400 ;    /* 32 * 32 Bytes fix */
    void*   CommandBuf = (void*)0x60ef3f8 ;    /* Command for slave CPU buffer */
    void*   PCM_Work = (void*)0x25a78000 ;    /* PCM data buffer */
    Uint32  PCM_WkSize = 0x8000 ;        /* PCM data buffer size */

EVENT  EventBuf[MAX_EVENTS] ;    /* buffer for Event use */
    WORK   WorkBuf[MAX_WORKS] ;        /* buffer for Work use */
    EVENT* RemainEvent[MAX_EVENTS] ;    /* Remain Event address buffer */
    WORK*  RemainWork[MAX_WORKS] ;    /* Remain Work address buffer */

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

(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)を示します。

/*                        */
/*  Workarea assignment customize file        */
/*        for SGL ver. 1.30        */

/*------------------------------------------------------------------------*/

#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] ;

/*------------------------------------------------------------------------*/

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

  1. 世嘉土星模拟器GIRI GIRI Loader的使用教程

    本教程适用于世嘉土星模拟器GIRI GIRI和该模拟器的前端,里面引用了一些别人提供的资料,希望对大家有帮助... 1)世嘉土星的结构-- CPU:日立SH2 RISC 32BIT 28.6MHz C ...

  2. Vulkan系列教程—VMA教程(三)—内存映射(Memory Mapping)

    文章目录 前言 一.Mapping Functions 二.Persistently mapped memory(永久Mapping) 三.Cache flush and invalidate 四.检 ...

  3. AIX系统Memory性能评估

    AIX系统Memory性能评估 一, VMM的管理简介 1.1 空闲列表维护 1.2 文件占用内存的比率维护 1.3 vmstat命令显示内存中的数据页数 二, 使用vmstat确定内存的使用情况 2 ...

  4. android 系统 (103)---系统memory使用状况

    如何抓取系统memory使用状况 当出现系统memory不足导致高优先级进程被kill等异常时,需要抓取一段时间内的memory使用情况. 一. 在使用Mali GPU平台上使用如下脚本抓取.     ...

  5. 一个Linux驱动:Simple - REALLY simple memory mapping demonstration.

    来源:LINUX设备驱动程序第三版配套源码 Table of Contents simple.c simple_load simple_unload Makefile simple.c /** Sim ...

  6. 世嘉土星和世嘉MD手柄定义,如何自制土星和MD手柄

    世嘉土星手柄定义,如何自制世嘉土星手柄 来源 Gamesx 土星手柄的控制板非常简单,两个74153芯片组合成一个定制的世嘉芯片,两条选择线用于轮询四组四个按钮,如果要制作自己的土星控制器,只需把两个 ...

  7. 原装世嘉土星手柄(Sega Saturn)转USB小板,软硬件全开源

    上次用模块制作了一个SS手柄转USB的控制器, 原装世嘉土星SS手柄(Sega Saturn)改USB接口,实现低延时USB格斗手柄_f78fk_liuyu的博客-CSDN博客_土星手柄接口 使用良好 ...

  8. Glide java.io.IOException(File unsuitable for memory mapping)

    异常信息 03-06 14:43:26.656 W/Glide ( 852): class com.bumptech.glide.load.engine.GlideException: Failed ...

  9. Prometheus TSDB (Part 3): Memory Mapping of Head Chunks from Disk

    Prometheus TSDB (Part 3): Memory Mapping of Head Chunks from Disk 本文译自Ganesh Vernekar 的 prometheus-t ...

最新文章

  1. hadoop fs命令无法使用_「大数据」「Hadoop」HDFS的配置与管理
  2. 分割 bisenetv2笔记
  3. 下列代码的执行结果是 php,执行下列代码后的结果是: $x=15; echo $x++; $y=20; echo ++y;...
  4. 计算机专业英语06章在线测试,《计算机专业英语》第06章在线测试.doc
  5. Leetcode--27. 移除元素
  6. mysql normal like_MYSQL语句
  7. 可能是全网最通俗易懂的微服务架构改造解读
  8. Enterprise Library Logging App Block的时区问题
  9. 【Axure电商原型】电商app高保真原型、移动端通用版电商app模板、用户中心、会员体系、签到、高保真商城app、rp原型、直播、运营活动、订单管理、售后退款、电商系统、购物车、高保真移动端电商
  10. springboot maven项目打jar包
  11. 软件度量五步法包括_软件交付效能度量——从吞吐量和稳定性开始
  12. echart 饼图每一块间隙_日本人用豆奶做威化饼,奶香十足、不甜腻,好吃!
  13. 编程珠玑Column11中插入排序和快排序
  14. mysql求平方根_MySQL数据库中如何求一个数的二次平方根(SQRT函数)呢?
  15. macOS更换jupyter notebook默认浏览器
  16. Shadowing Japanese Unit 5
  17. 古琴入门-古琴十大名曲-古琴教学——唐畅古琴
  18. oracle认证071和061,别只为Oracle Database 18c的发布而兴奋了, 看一看你的Oracle认证考试到期了吗?...
  19. UICollectionView 横向滑动停止的两种效果。
  20. java笔试题(一)

热门文章

  1. 论站长赚钱之七剑下天山
  2. 关闭Win10系统天气图标
  3. 重装系统(超详细教程)----大白菜教程
  4. HTML 微信 获取微信ID,在微信浏览器里获取Cookie,获取微信用户的openId
  5. Hyperledger Fabric 环境搭建报错
  6. 最新PHP对接微信支付,发起商家转账API,商家转账到零钱
  7. 中国语言地图集 c1-12,中国语言地图集介绍——网上收集整理
  8. RDKit|通过Recap和BRICS对分子拆解与合成
  9. 如何将pdf转换成ppt?
  10. Vim编辑器的使用之替换