世嘉土星在设计的时候参考了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] ;