世嘉土星在设计的时候参考了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) ; ウィンドウチェック用加算デ