video.inc 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766
  1. (*
  2. $Id: video.inc 25 2007-12-10 21:06:46Z p4p3r0 $
  3. ------------------------------------------------------------------------------
  4. Copyright (C) 2005
  5. Jason Rogers (dovoto)
  6. Dave Murphy (WinterMute)
  7. This software is provided 'as-is', without any express or implied
  8. warranty. In no event will the authors be held liable for any
  9. damages arising from the use of this software.
  10. Permission is granted to anyone to use this software for any
  11. purpose, including commercial applications, and to alter it and
  12. redistribute it freely, subject to the following restrictions:
  13. 1. The origin of this software must not be misrepresented; you
  14. must not claim that you wrote the original software. If you use
  15. this software in a product, an acknowledgment in the product
  16. documentation would be appreciated but is not required.
  17. 2. Altered source versions must be plainly marked as such, and
  18. must not be misrepresented as being the original software.
  19. 3. This notice may not be removed or altered from any source
  20. distribution.
  21. ------------------------------------------------------------------------------
  22. Conversion by Legolas (http://itaprogaming.free.fr) for freepascal compiler
  23. (http://www.freepascal.org)
  24. Copyright (C) 2006 Francesco Lombardi
  25. Check http://sourceforge.net/projects/libndsfpc for updates
  26. ------------------------------------------------------------------------------
  27. $Log$
  28. *)
  29. {$ifndef ARM9}
  30. {$error Video is only available on the ARM9}
  31. {$endif ARM9}
  32. {$ifdef NDS_IMPLEMENTATION}
  33. function RGB15(r, g, b: cint): cuint16;
  34. begin
  35. RGB15 := ((r) or ((g) shl 5) or ((b) shl 10));
  36. end;
  37. function RGB5(r, g, b: cint): cuint16;
  38. begin
  39. RGB5 := ((r) or ((g) shl 5) or ((b) shl 10));
  40. end;
  41. function RGB8(r, g, b: cint): cuint8;
  42. begin
  43. RGB8 := (((r) shr 3) or (((g) shr 3) shl 5) or (((b) shr 3) shl 10));
  44. end;
  45. {$endif NDS_IMPLEMENTATION}
  46. {$ifdef NDS_INTERFACE}
  47. const
  48. SCREEN_HEIGHT = 192;
  49. SCREEN_WIDTH = 256;
  50. // Vram Control
  51. VRAM_CR : pcuint32 = pointer($04000240);
  52. VRAM_A_CR : pcuint8 = pointer($04000240);
  53. VRAM_B_CR : pcuint8 = pointer($04000241);
  54. VRAM_C_CR : pcuint8 = pointer($04000242);
  55. VRAM_D_CR : pcuint8 = pointer($04000243);
  56. VRAM_E_CR : pcuint8 = pointer($04000244);
  57. VRAM_F_CR : pcuint8 = pointer($04000245);
  58. VRAM_G_CR : pcuint8 = pointer($04000246);
  59. WRAM_CR : pcuint8 = pointer($04000247);
  60. VRAM_H_CR : pcuint8 = pointer($04000248);
  61. VRAM_I_CR : pcuint8 = pointer($04000249);
  62. VRAM_ENABLE = (1 shl 7);
  63. {$endif NDS_INTERFACE}
  64. {$ifdef NDS_IMPLEMENTATION}
  65. function VRAM_OFFSET(n: cint): cint; inline;
  66. begin
  67. VRAM_OFFSET := ((n) shl 3);
  68. end;
  69. {$endif NDS_IMPLEMENTATION}
  70. {$ifdef NDS_INTERFACE}
  71. type
  72. VRAM_A_TYPE = cint;
  73. const
  74. VRAM_A_LCD : VRAM_A_TYPE = 0;
  75. VRAM_A_MAIN_BG : VRAM_A_TYPE = 1;
  76. VRAM_A_MAIN_BG_0x06000000 : VRAM_A_TYPE = 1 or (0 shl 3);
  77. VRAM_A_MAIN_BG_0x06020000 : VRAM_A_TYPE = 1 or (1 shl 3);
  78. VRAM_A_MAIN_BG_0x06040000 : VRAM_A_TYPE = 1 or (2 shl 3);
  79. VRAM_A_MAIN_BG_0x06060000 : VRAM_A_TYPE = 1 or (3 shl 3);
  80. VRAM_A_MAIN_SPRITE : VRAM_A_TYPE = 2;
  81. VRAM_A_MAIN_SPRITE_0x06400000 : VRAM_A_TYPE = 2;
  82. VRAM_A_MAIN_SPRITE_0x06420000 : VRAM_A_TYPE = 2 or (1 shl 3);
  83. VRAM_A_TEXTURE : VRAM_A_TYPE = 3;
  84. VRAM_A_TEXTURE_SLOT0 : VRAM_A_TYPE = 3 or (0 shl 3);
  85. VRAM_A_TEXTURE_SLOT1 : VRAM_A_TYPE = 3 or (1 shl 3);
  86. VRAM_A_TEXTURE_SLOT2 : VRAM_A_TYPE = 3 or (2 shl 3);
  87. VRAM_A_TEXTURE_SLOT3 : VRAM_A_TYPE = 3 or (3 shl 3);
  88. type
  89. VRAM_B_TYPE = cint;
  90. const
  91. VRAM_B_LCD : VRAM_B_TYPE = 0;
  92. VRAM_B_MAIN_BG : VRAM_B_TYPE = 1 or (1 shl 3);
  93. VRAM_B_MAIN_BG_0x06000000 : VRAM_B_TYPE = 1 or (0 shl 3);
  94. VRAM_B_MAIN_BG_0x06020000 : VRAM_B_TYPE = 1 or (1 shl 3);
  95. VRAM_B_MAIN_BG_0x06040000 : VRAM_B_TYPE = 1 or (2 shl 3);
  96. VRAM_B_MAIN_BG_0x06060000 : VRAM_B_TYPE = 1 or (3 shl 3);
  97. VRAM_B_MAIN_SPRITE : VRAM_B_TYPE = 2 or (1 shl 3);
  98. VRAM_B_MAIN_SPRITE_0x06400000 : VRAM_B_TYPE = 2;
  99. VRAM_B_MAIN_SPRITE_0x06420000 : VRAM_B_TYPE = 2 or (1 shl 3);
  100. VRAM_B_TEXTURE : VRAM_B_TYPE = 3 or (1 shl 3);
  101. VRAM_B_TEXTURE_SLOT0 : VRAM_B_TYPE = 3 or (0 shl 3);
  102. VRAM_B_TEXTURE_SLOT1 : VRAM_B_TYPE = 3 or (1 shl 3);
  103. VRAM_B_TEXTURE_SLOT2 : VRAM_B_TYPE = 3 or (2 shl 3);
  104. VRAM_B_TEXTURE_SLOT3 : VRAM_B_TYPE = 3 or (3 shl 3);
  105. type
  106. VRAM_C_TYPE = cint;
  107. const
  108. VRAM_C_LCD : VRAM_C_TYPE = 0;
  109. VRAM_C_MAIN_BG : VRAM_C_TYPE = 1 or (2 shl 3);
  110. VRAM_C_MAIN_BG_0x06000000 : VRAM_C_TYPE = 1 or (0 shl 3);
  111. VRAM_C_MAIN_BG_0x06020000 : VRAM_C_TYPE = 1 or (1 shl 3);
  112. VRAM_C_MAIN_BG_0x06040000 : VRAM_C_TYPE = 1 or (2 shl 3);
  113. VRAM_C_MAIN_BG_0x06060000 : VRAM_C_TYPE = 1 or (3 shl 3);
  114. VRAM_C_ARM7 : VRAM_C_TYPE = 2;
  115. VRAM_C_ARM7_0x06000000 : VRAM_C_TYPE = 2;
  116. VRAM_C_ARM7_0x06020000 : VRAM_C_TYPE = 2 or (1 shl 3);
  117. VRAM_C_SUB_BG : VRAM_C_TYPE = 4;
  118. VRAM_C_SUB_BG_0x06200000 : VRAM_C_TYPE = 4 or (0 shl 3);
  119. VRAM_C_SUB_BG_0x06220000 : VRAM_C_TYPE = 4 or (1 shl 3);
  120. VRAM_C_SUB_BG_0x06240000 : VRAM_C_TYPE = 4 or (2 shl 3);
  121. VRAM_C_SUB_BG_0x06260000 : VRAM_C_TYPE = 4 or (3 shl 3);
  122. VRAM_C_TEXTURE : VRAM_C_TYPE = 3 or (2 shl 3);
  123. VRAM_C_TEXTURE_SLOT0 : VRAM_C_TYPE = 3 or (0 shl 3);
  124. VRAM_C_TEXTURE_SLOT1 : VRAM_C_TYPE = 3 or (1 shl 3);
  125. VRAM_C_TEXTURE_SLOT2 : VRAM_C_TYPE = 3 or (2 shl 3);
  126. VRAM_C_TEXTURE_SLOT3 : VRAM_C_TYPE = 3 or (3 shl 3);
  127. type
  128. VRAM_D_TYPE = cint;
  129. const
  130. VRAM_D_LCD : VRAM_D_TYPE = 0;
  131. VRAM_D_MAIN_BG : VRAM_D_TYPE = 1 or (3 shl 3);
  132. VRAM_D_MAIN_BG_0x06000000 : VRAM_D_TYPE = 1 or (0 shl 3);
  133. VRAM_D_MAIN_BG_0x06020000 : VRAM_D_TYPE = 1 or (1 shl 3);
  134. VRAM_D_MAIN_BG_0x06040000 : VRAM_D_TYPE = 1 or (2 shl 3);
  135. VRAM_D_MAIN_BG_0x06060000 : VRAM_D_TYPE = 1 or (3 shl 3);
  136. VRAM_D_ARM7 : VRAM_D_TYPE = 2 or (1 shl 3);
  137. VRAM_D_ARM7_0x06000000 : VRAM_D_TYPE = 2;
  138. VRAM_D_ARM7_0x06020000 : VRAM_D_TYPE = 2 or (1 shl 3);
  139. VRAM_D_SUB_SPRITE : VRAM_D_TYPE = 4;
  140. VRAM_D_TEXTURE : VRAM_D_TYPE = 3 or (3 shl 3);
  141. VRAM_D_TEXTURE_SLOT0 : VRAM_D_TYPE = 3 or (0 shl 3);
  142. VRAM_D_TEXTURE_SLOT1 : VRAM_D_TYPE = 3 or (1 shl 3);
  143. VRAM_D_TEXTURE_SLOT2 : VRAM_D_TYPE = 3 or (2 shl 3);
  144. VRAM_D_TEXTURE_SLOT3 : VRAM_D_TYPE = 3 or (3 shl 3);
  145. type
  146. VRAM_E_TYPE = cint;
  147. const
  148. VRAM_E_LCD : VRAM_E_TYPE = 0;
  149. VRAM_E_MAIN_BG : VRAM_E_TYPE = 1;
  150. VRAM_E_MAIN_SPRITE : VRAM_E_TYPE = 2;
  151. VRAM_E_TEX_PALETTE : VRAM_E_TYPE = 3;
  152. VRAM_E_BG_EXT_PALETTE : VRAM_E_TYPE = 4;
  153. VRAM_E_OBJ_EXT_PALETTE : VRAM_E_TYPE = 5;
  154. type
  155. VRAM_F_TYPE = cint;
  156. const
  157. VRAM_F_LCD : VRAM_F_TYPE = 0;
  158. VRAM_F_MAIN_BG : VRAM_F_TYPE = 1;
  159. VRAM_F_MAIN_SPRITE : VRAM_F_TYPE = 2;
  160. VRAM_F_MAIN_SPRITE_0x06000000 : VRAM_F_TYPE = 2;
  161. VRAM_F_MAIN_SPRITE_0x06004000 : VRAM_F_TYPE = 2 or (1 shl 3);
  162. VRAM_F_MAIN_SPRITE_0x06010000 : VRAM_F_TYPE = 2 or (2 shl 3);
  163. VRAM_F_MAIN_SPRITE_0x06014000 : VRAM_F_TYPE = 2 or (3 shl 3);
  164. VRAM_F_TEX_PALETTE : VRAM_F_TYPE = 3;
  165. VRAM_F_BG_EXT_PALETTE : VRAM_F_TYPE = 4;
  166. VRAM_F_OBJ_EXT_PALETTE : VRAM_F_TYPE = 5;
  167. type
  168. VRAM_G_TYPE = cint;
  169. const
  170. VRAM_G_LCD : VRAM_G_TYPE = 0;
  171. VRAM_G_MAIN_BG : VRAM_G_TYPE = 1;
  172. VRAM_G_MAIN_SPRITE : VRAM_G_TYPE = 2;
  173. VRAM_G_MAIN_SPRITE_0x06000000 : VRAM_G_TYPE = 2;
  174. VRAM_G_MAIN_SPRITE_0x06004000 : VRAM_G_TYPE = 2 or (1 shl 3);
  175. VRAM_G_MAIN_SPRITE_0x06010000 : VRAM_G_TYPE = 2 or (2 shl 3);
  176. VRAM_G_MAIN_SPRITE_0x06014000 : VRAM_G_TYPE = 2 or (3 shl 3);
  177. VRAM_G_TEX_PALETTE : VRAM_G_TYPE = 3;
  178. VRAM_G_BG_EXT_PALETTE : VRAM_G_TYPE = 4;
  179. VRAM_G_OBJ_EXT_PALETTE : VRAM_G_TYPE = 5;
  180. type
  181. VRAM_H_TYPE = cint;
  182. const
  183. VRAM_H_LCD : VRAM_H_TYPE = 0;
  184. VRAM_H_SUB_BG : VRAM_H_TYPE = 1;
  185. VRAM_H_SUB_BG_EXT_PALETTE : VRAM_H_TYPE = 2;
  186. type
  187. VRAM_I_TYPE = cint;
  188. const
  189. VRAM_I_LCD : VRAM_I_TYPE = 0;
  190. VRAM_I_SUB_BG : VRAM_I_TYPE = 1;
  191. VRAM_I_SUB_SPRITE : VRAM_I_TYPE = 2;
  192. VRAM_I_SUB_SPRITE_EXT_PALETTE : VRAM_I_TYPE = 3;
  193. type
  194. TPalette = array [0..255] of cuint16;
  195. TExtPalette = array [0..15] of TPalette;
  196. PPalette = ^TPalette;
  197. PExtPalette = ^TExtPalette;
  198. var
  199. VRAM_E_EXT_PALETTE : PExtPalette absolute VRAM_E;
  200. VRAM_F_EXT_PALETTE : PExtPalette absolute VRAM_F;
  201. VRAM_G_EXT_PALETTE : PExtPalette absolute VRAM_G;
  202. VRAM_H_EXT_PALETTE : PExtPalette absolute VRAM_H;
  203. function vramSetMainBanks(a: VRAM_A_TYPE; b: VRAM_B_TYPE; c: VRAM_C_TYPE; d: VRAM_D_TYPE): cuint32; cdecl; external;
  204. procedure vramRestoreMainBanks(vramTemp: cuint32); cdecl; external;
  205. procedure vramSetBankA(a: VRAM_A_TYPE); cdecl; external;
  206. procedure vramSetBankB(b: VRAM_B_TYPE); cdecl; external;
  207. procedure vramSetBankC(c: VRAM_C_TYPE); cdecl; external;
  208. procedure vramSetBankD(d: VRAM_D_TYPE); cdecl; external;
  209. procedure vramSetBankE(e: VRAM_E_TYPE); cdecl; external;
  210. procedure vramSetBankF(f: VRAM_F_TYPE); cdecl; external;
  211. procedure vramSetBankG(g: VRAM_G_TYPE); cdecl; external;
  212. procedure vramSetBankH(h: VRAM_H_TYPE); cdecl; external;
  213. procedure vramSetBankI(i: VRAM_I_TYPE); cdecl; external;
  214. // Display control registers
  215. const
  216. DISPLAY_CR : pcuint32 = pointer($04000000);
  217. SUB_DISPLAY_CR : pcuint32 = pointer($04001000);
  218. MODE_0_2D = $10000;
  219. MODE_1_2D = $10001;
  220. MODE_2_2D = $10002;
  221. MODE_3_2D = $10003;
  222. MODE_4_2D = $10004;
  223. MODE_5_2D = $10005;
  224. // main display only
  225. MODE_6_2D = $10006;
  226. MODE_FIFO = (3 shl 16);
  227. ENABLE_3D = (1 shl 3);
  228. DISPLAY_BG0_ACTIVE = (1 shl 8);
  229. DISPLAY_BG1_ACTIVE = (1 shl 9);
  230. DISPLAY_BG2_ACTIVE = (1 shl 10);
  231. DISPLAY_BG3_ACTIVE = (1 shl 11);
  232. DISPLAY_SPR_ACTIVE = (1 shl 12);
  233. DISPLAY_WIN0_ON = (1 shl 13);
  234. DISPLAY_WIN1_ON = (1 shl 14);
  235. DISPLAY_SPR_WIN_ON = (1 shl 15);
  236. // Main display only
  237. MODE_0_3D = (MODE_0_2D or DISPLAY_BG0_ACTIVE or ENABLE_3D);
  238. MODE_1_3D = (MODE_1_2D or DISPLAY_BG0_ACTIVE or ENABLE_3D);
  239. MODE_2_3D = (MODE_2_2D or DISPLAY_BG0_ACTIVE or ENABLE_3D);
  240. MODE_3_3D = (MODE_3_2D or DISPLAY_BG0_ACTIVE or ENABLE_3D);
  241. MODE_4_3D = (MODE_4_2D or DISPLAY_BG0_ACTIVE or ENABLE_3D);
  242. MODE_5_3D = (MODE_5_2D or DISPLAY_BG0_ACTIVE or ENABLE_3D);
  243. MODE_6_3D = (MODE_6_2D or DISPLAY_BG0_ACTIVE or ENABLE_3D);
  244. MODE_FB0 = ($00020000);
  245. MODE_FB1 = ($00060000);
  246. MODE_FB2 = ($000A0000);
  247. MODE_FB3 = ($000E0000);
  248. DISPLAY_SPR_HBLANK = (1 shl 23);
  249. DISPLAY_SPR_1D_LAYOUT = (1 shl 4);
  250. DISPLAY_SPR_1D = (1 shl 4);
  251. DISPLAY_SPR_2D = (0 shl 4);
  252. DISPLAY_SPR_1D_BMP = (4 shl 4);
  253. DISPLAY_SPR_2D_BMP_128 = (0 shl 4);
  254. DISPLAY_SPR_2D_BMP_256 = (2 shl 4);
  255. DISPLAY_SPR_1D_SIZE_32 = (0 shl 20);
  256. DISPLAY_SPR_1D_SIZE_64 = (1 shl 20);
  257. DISPLAY_SPR_1D_SIZE_128 = (2 shl 20);
  258. DISPLAY_SPR_1D_SIZE_256 = (3 shl 20);
  259. DISPLAY_SPR_1D_BMP_SIZE_128 = (0 shl 22);
  260. DISPLAY_SPR_1D_BMP_SIZE_256 = (1 shl 22);
  261. DISPLAY_SPR_EXT_PALETTE = (1 shl 31);
  262. DISPLAY_BG_EXT_PALETTE = (1 shl 30);
  263. DISPLAY_SCREEN_OFF = (1 shl 7);
  264. {$endif NDS_INTERFACE}
  265. {$ifdef NDS_IMPLEMENTATION}
  266. function DISPLAY_CHAR_BASE(n: cuint32): cuint32; inline;
  267. begin
  268. DISPLAY_CHAR_BASE := ((n) and 7) shl 24;
  269. end;
  270. function DISPLAY_SCREEN_BASE(n: cuint32): cuint32; inline;
  271. begin
  272. DISPLAY_SCREEN_BASE := ((n) and 7) shl 27;
  273. end;
  274. procedure videoSetMode(mode: cuint32); inline;
  275. begin
  276. DISPLAY_CR^ := mode;
  277. end;
  278. procedure videoSetModeSub(mode: cuint32); inline;
  279. begin
  280. SUB_DISPLAY_CR^ := mode;
  281. end;
  282. {$endif NDS_IMPLEMENTATION}
  283. {$ifdef NDS_INTERFACE}
  284. const
  285. BRIGHTNESS : pcuint16 = pointer($0400006C);
  286. SUB_BRIGHTNESS : pcuint16 = pointer($0400106C);
  287. BGCTRL : pcuint16 = pointer($04000008);
  288. BG0_CR : pcuint16 = pointer($04000008);
  289. BG1_CR : pcuint16 = pointer($0400000A);
  290. BG2_CR : pcuint16 = pointer($0400000C);
  291. BG3_CR : pcuint16 = pointer($0400000E);
  292. BGCTRL_SUB : pcuint16 = pointer($04001008);
  293. SUB_BG0_CR : pcuint16 = pointer($04001008);
  294. SUB_BG1_CR : pcuint16 = pointer($0400100A);
  295. SUB_BG2_CR : pcuint16 = pointer($0400100C);
  296. SUB_BG3_CR : pcuint16 = pointer($0400100E);
  297. BG_256_COLOR = (1 shl 7);
  298. BG_16_COLOR = (0);
  299. BG_MOSAIC_ON = (1 shl 6);
  300. BG_MOSAIC_OFF = (0);
  301. {$endif NDS_INTERFACE}
  302. {$ifdef NDS_IMPLEMENTATION}
  303. function BG_PRIORITY(n: cint): cint; inline;
  304. begin
  305. BG_PRIORITY := (n);
  306. end;
  307. {$endif NDS_IMPLEMENTATION}
  308. {$ifdef NDS_INTERFACE}
  309. const
  310. BG_PRIORITY_0 = (0);
  311. BG_PRIORITY_1 = (1);
  312. BG_PRIORITY_2 = (2);
  313. BG_PRIORITY_3 = (3);
  314. {$endif NDS_INTERFACE}
  315. {$ifdef NDS_IMPLEMENTATION}
  316. function BG_TILE_BASE(base: cint): cint; inline;
  317. begin
  318. BG_TILE_BASE := ((base) shl 2);
  319. end;
  320. function BG_MAP_BASE(base: cint): cint; inline;
  321. begin
  322. BG_MAP_BASE := ((base) shl 8);
  323. end;
  324. function BG_BMP_BASE(base: cint): cint; inline;
  325. begin
  326. BG_BMP_BASE := ((base) shl 8);
  327. end;
  328. function BG_MAP_RAM(base: cint): cint; inline;
  329. begin
  330. BG_MAP_RAM := (((base) * $800) + $06000000);
  331. end;
  332. function BG_MAP_RAM_SUB(base: cint): cint; inline;
  333. begin
  334. BG_MAP_RAM_SUB := (((base) * $800) + $06200000);
  335. end;
  336. function BG_TILE_RAM(base: cint): cint; inline;
  337. begin
  338. BG_TILE_RAM := (((base) * $4000) + $06000000);
  339. end;
  340. function BG_TILE_RAM_SUB(base: cint): cint; inline;
  341. begin
  342. BG_TILE_RAM_SUB := (((base) * $4000) + $06200000);
  343. end;
  344. function BG_BMP_RAM(base: cint): cint; inline;
  345. begin
  346. BG_BMP_RAM := (((base) * $4000) + $06000000);
  347. end;
  348. function BG_BMP_RAM_SUB(base: cint): cint; inline;
  349. begin
  350. BG_BMP_RAM_SUB := (((base) * $4000) + $06200000);
  351. end;
  352. {$endif NDS_IMPLEMENTATION}
  353. {$ifdef NDS_INTERFACE}
  354. const
  355. BG_WRAP_OFF = (0);
  356. BG_WRAP_ON = (1 shl 13);
  357. BG_32x32 = (0 shl 14);
  358. BG_64x32 = (1 shl 14);
  359. BG_32x64 = (2 shl 14);
  360. BG_64x64 = (3 shl 14);
  361. BG_RS_16x16 = (0 shl 14);
  362. BG_RS_32x32 = (1 shl 14);
  363. BG_RS_64x64 = (2 shl 14);
  364. BG_RS_128x128 = (3 shl 14);
  365. BG_BMP8_128x128 = (BG_RS_16x16 or BG_256_COLOR);
  366. BG_BMP8_256x256 = (BG_RS_32x32 or BG_256_COLOR);
  367. BG_BMP8_512x256 = (BG_RS_64x64 or BG_256_COLOR);
  368. BG_BMP8_512x512 = (BG_RS_128x128 or BG_256_COLOR);
  369. BG_BMP8_1024x512 = (1 shl 14);
  370. BG_BMP8_512x1024 = 0;
  371. BG_BMP16_128x128 = (BG_RS_16x16 or BG_256_COLOR or (1 shl 2));
  372. BG_BMP16_256x256 = (BG_RS_32x32 or BG_256_COLOR or (1 shl 2));
  373. BG_BMP16_512x256 = (BG_RS_64x64 or BG_256_COLOR or (1 shl 2));
  374. BG_BMP16_512x512 = (BG_RS_128x128 or BG_256_COLOR or (1 shl 2));
  375. BG_PALETTE_SLOT0 = 0;
  376. BG_PALETTE_SLOT1 = 0;
  377. BG_PALETTE_SLOT2 = (1 shl 13);
  378. BG_PALETTE_SLOT3 = (1 shl 13);
  379. type
  380. bg_scroll = record
  381. x: cuint16;
  382. y: cuint16;
  383. end;
  384. Tbg_scroll = bg_scroll;
  385. Pbg_scroll = ^bg_scroll;
  386. bg_rotation = record
  387. xdx: cuint16;
  388. xdy: cuint16;
  389. ydx: cuint16;
  390. ydy: cuint16;
  391. centerX: cuint32;
  392. centerY: cuint32;
  393. end;
  394. Tbg_rotation = bg_rotation;
  395. Pbg_rotation = ^bg_rotation;
  396. bg_attribute = record
  397. control: array [0..3] of cuint16;
  398. scroll: array [0..3] of bg_scroll;
  399. bg2_rotation: bg_rotation;
  400. bg3_rotation: bg_rotation;
  401. end;
  402. Tbg_attribute = bg_attribute;
  403. Pbg_attribute = ^bg_attribute;
  404. const
  405. BACKGROUND : Pbg_attribute = pointer($04000008);
  406. BACKGROUND_SUB : Pbg_attribute = pointer($04001008);
  407. BG_OFFSET : Pbg_scroll = pointer($04000010);
  408. BG0_X0 : pcuint16 = pointer($04000010);
  409. BG0_Y0 : pcuint16 = pointer($04000012);
  410. BG1_X0 : pcuint16 = pointer($04000014);
  411. BG1_Y0 : pcuint16 = pointer($04000016);
  412. BG2_X0 : pcuint16 = pointer($04000018);
  413. BG2_Y0 : pcuint16 = pointer($0400001A);
  414. BG3_X0 : pcuint16 = pointer($0400001C);
  415. BG3_Y0 : pcuint16 = pointer($0400001E);
  416. BG2_XDX : pcuint16 = pointer($04000020);
  417. BG2_XDY : pcuint16 = pointer($04000022);
  418. BG2_YDX : pcuint16 = pointer($04000024);
  419. BG2_YDY : pcuint16 = pointer($04000026);
  420. BG2_CX : pcuint32 = pointer($04000028);
  421. BG2_CY : pcuint32 = pointer($0400002C);
  422. BG3_XDX : pcuint16 = pointer($04000030);
  423. BG3_XDY : pcuint16 = pointer($04000032);
  424. BG3_YDX : pcuint16 = pointer($04000034);
  425. BG3_YDY : pcuint16 = pointer($04000036);
  426. BG3_CX : pcuint32 = pointer($04000038);
  427. BG3_CY : pcuint32 = pointer($0400003C);
  428. SUB_BG0_X0 : pcuint16 = pointer($04001010);
  429. SUB_BG0_Y0 : pcuint16 = pointer($04001012);
  430. SUB_BG1_X0 : pcuint16 = pointer($04001014);
  431. SUB_BG1_Y0 : pcuint16 = pointer($04001016);
  432. SUB_BG2_X0 : pcuint16 = pointer($04001018);
  433. SUB_BG2_Y0 : pcuint16 = pointer($0400101A);
  434. SUB_BG3_X0 : pcuint16 = pointer($0400101C);
  435. SUB_BG3_Y0 : pcuint16 = pointer($0400101E);
  436. SUB_BG2_XDX : pcuint16 = pointer($04001020);
  437. SUB_BG2_XDY : pcuint16 = pointer($04001022);
  438. SUB_BG2_YDX : pcuint16 = pointer($04001024);
  439. SUB_BG2_YDY : pcuint16 = pointer($04001026);
  440. SUB_BG2_CX : pcuint32 = pointer($04001028);
  441. SUB_BG2_CY : pcuint32 = pointer($0400102C);
  442. SUB_BG3_XDX : pcuint16 = pointer($04001030);
  443. SUB_BG3_XDY : pcuint16 = pointer($04001032);
  444. SUB_BG3_YDX : pcuint16 = pointer($04001034);
  445. SUB_BG3_YDY : pcuint16 = pointer($04001036);
  446. SUB_BG3_CX : pcuint32 = pointer($04001038);
  447. SUB_BG3_CY : pcuint32 = pointer($0400103C);
  448. // Window 0
  449. WIN0_X0 : pcuint8 = pointer($04000041);
  450. WIN0_X1 : pcuint8 = pointer($04000040);
  451. WIN0_Y0 : pcuint8 = pointer($04000045);
  452. WIN0_Y1 : pcuint8 = pointer($04000044);
  453. // Window 1
  454. WIN1_X0 : pcuint8 = pointer($04000042);
  455. WIN1_X1 : pcuint8 = pointer($04000043);
  456. WIN1_Y0 : pcuint8 = pointer($04000047);
  457. WIN1_Y1 : pcuint8 = pointer($04000046);
  458. WIN_IN : pcuint16 = pointer($04000048);
  459. WIN_OUT : pcuint16 = pointer($0400004A);
  460. // Window 0
  461. SUB_WIN0_X0 : pcuint8 = pointer($04001041);
  462. SUB_WIN0_X1 : pcuint8 = pointer($04001040);
  463. SUB_WIN0_Y0 : pcuint8 = pointer($04001045);
  464. SUB_WIN0_Y1 : pcuint8 = pointer($04001044);
  465. // Window 1
  466. SUB_WIN1_X0 : pcuint8 = pointer($04001042);
  467. SUB_WIN1_X1 : pcuint8 = pointer($04001043);
  468. SUB_WIN1_Y0 : pcuint8 = pointer($04001047);
  469. SUB_WIN1_Y1 : pcuint8 = pointer($04001046);
  470. SUB_WIN_IN : pcuint16 = pointer($04001048);
  471. SUB_WIN_OUT : pcuint16 = pointer($0400104A);
  472. MOSAIC_CR : pcuint16 = pointer($0400004C);
  473. SUB_MOSAIC_CR : pcuint16 = pointer($0400104C);
  474. BLEND_CR : pcuint16 = pointer($04000050);
  475. BLEND_AB : pcuint16 = pointer($04000052);
  476. BLEND_Y : pcuint16 = pointer($04000054);
  477. SUB_BLEND_CR : pcuint16 = pointer($04001050);
  478. SUB_BLEND_AB : pcuint16 = pointer($04001052);
  479. SUB_BLEND_Y : pcuint16 = pointer($04001054);
  480. BLEND_NONE = (0 shl 6);
  481. BLEND_ALPHA = (1 shl 6);
  482. BLEND_FADE_WHITE = (2 shl 6);
  483. BLEND_FADE_BLACK = (3 shl 6);
  484. BLEND_SRC_BG0 = (1 shl 0);
  485. BLEND_SRC_BG1 = (1 shl 1);
  486. BLEND_SRC_BG2 = (1 shl 2);
  487. BLEND_SRC_BG3 = (1 shl 3);
  488. BLEND_SRC_SPRITE = (1 shl 4);
  489. BLEND_SRC_BACKDROP = (1 shl 5);
  490. BLEND_DST_BG0 = (1 shl 8);
  491. BLEND_DST_BG1 = (1 shl 9);
  492. BLEND_DST_BG2 = (1 shl 10);
  493. BLEND_DST_BG3 = (1 shl 11);
  494. BLEND_DST_SPRITE = (1 shl 12);
  495. BLEND_DST_BACKDROP = (1 shl 13);
  496. // Display capture control
  497. REG_DISPCAPCNT: pcuint32 = pointer($04000064);
  498. REG_DISP_MMEM_FIFO: pcuint32 = pointer($04000068);
  499. DCAP_ENABLE = (1 shl 31);
  500. {$endif NDS_INTERFACE}
  501. {$ifdef NDS_IMPLEMENTATION}
  502. function DCAP_MODE(n: cint): cint; inline;
  503. begin
  504. DCAP_MODE := (((n) and 3) shl 29);
  505. end;
  506. function DCAP_DST(n: cint): cint; inline;
  507. begin
  508. DCAP_DST := (((n) and 3) shl 26);
  509. end;
  510. function DCAP_SRC(n: cint): cint; inline;
  511. begin
  512. DCAP_SRC := (((n) and 3) shl 24);
  513. end;
  514. function DCAP_SIZE(n: cint): cint; inline;
  515. begin
  516. DCAP_SIZE := (((n) and 3) shl 20);
  517. end;
  518. function DCAP_OFFSET(n: cint): cint; inline;
  519. begin
  520. DCAP_OFFSET := (((n) and 3) shl 18);
  521. end;
  522. function DCAP_BANK(n: cint): cint; inline;
  523. begin
  524. DCAP_BANK := (((n) and 3) shl 16);
  525. end;
  526. function DCAP_B(n: cint): cint; inline;
  527. begin
  528. DCAP_B := (((n) and $1F) shl 8);
  529. end;
  530. function DCAP_A(n: cint): cint; inline;
  531. begin
  532. DCAP_A := (((n) and $1F) shl 0);
  533. end;
  534. {$endif NDS_IMPLEMENTATION}
  535. {$ifdef NDS_INTERFACE}
  536. // 3D core control
  537. const
  538. GFX_CONTROL : pcuint16 = pointer($04000060);
  539. GFX_FIFO : pcuint32 = pointer($04000400);
  540. GFX_STATUS : pcuint32 = pointer($04000600);
  541. GFX_COLOR : pcuint32 = pointer($04000480);
  542. GFX_VERTEX10 : pcuint32 = pointer($04000490);
  543. GFX_VERTEX_XY : pcuint32 = pointer($04000494);
  544. GFX_VERTEX_XZ : pcuint32 = pointer($04000498);
  545. GFX_VERTEX_YZ : pcuint32 = pointer($0400049C);
  546. GFX_VERTEX_DIFF : pcuint32 = pointer($040004A0);
  547. GFX_VERTEX16 : pcuint32 = pointer($0400048C);
  548. GFX_TEX_COORD : pcuint32 = pointer($04000488);
  549. GFX_TEX_FORMAT : pcuint32 = pointer($040004A8);
  550. GFX_PAL_FORMAT : pcuint32 = pointer($040004AC);
  551. GFX_CLEAR_COLOR : pcuint32 = pointer($04000350);
  552. GFX_CLEAR_DEPTH : pcuint16 = pointer($04000354);
  553. GFX_LIGHT_VECTOR : pcuint32 = pointer($040004C8);
  554. GFX_LIGHT_COLOR : pcuint32 = pointer($040004CC);
  555. GFX_NORMAL : pcuint32 = pointer($04000484);
  556. GFX_DIFFUSE_AMBIENT : pcuint32 = pointer($040004C0);
  557. GFX_SPECULAR_EMISSION : pcuint32 = pointer($040004C4);
  558. GFX_SHININESS : pcuint32 = pointer($040004D0);
  559. GFX_POLY_FORMAT : pcuint32 = pointer($040004A4);
  560. GFX_ALPHA_TEST : pcuint16 = pointer($04000340);
  561. GFX_BEGIN : pcuint32 = pointer($04000500);
  562. GFX_END : pcuint32 = pointer($04000504);
  563. GFX_FLUSH : pcuint32 = pointer($04000540);
  564. GFX_VIEWPORT : pcuint32 = pointer($04000580);
  565. GFX_TOON_TABLE : pcuint16 = pointer($04000380);
  566. GFX_EDGE_TABLE : pcuint16 = pointer($04000330);
  567. GFX_FOG_COLOR : pcuint32 = pointer($04000358);
  568. GFX_FOG_OFFSET : pcuint32 = pointer($0400035C);
  569. GFX_FOG_TABLE : pcuint8 = pointer($04000360);
  570. GFX_BOX_TEST : pcint32 = pointer($040005C0);
  571. GFX_POS_TEST : pcint32 = pointer($040005C4);
  572. GFX_POS_RESULT : pcint32 = pointer($04000620);
  573. {$endif NDS_INTERFACE}
  574. {$ifdef NDS_IMPLEMENTATION}
  575. function GFX_BUSY: boolean; inline;
  576. begin
  577. GFX_BUSY := GFX_STATUS^ and (1 shl 27) <> 0;
  578. end;
  579. {$endif NDS_IMPLEMENTATION}
  580. {$ifdef NDS_INTERFACE}
  581. const
  582. GFX_VERTEX_RAM_USAGE : pcuint16 = pointer($04000606);
  583. GFX_POLYGON_RAM_USAGE : pcuint16 = pointer($04000604);
  584. GFX_CUTOFF_DEPTH : pcuint16 = pointer($04000610);
  585. // Matrix processor control
  586. MATRIX_CONTROL : pcuint32 = pointer($04000440);
  587. MATRIX_PUSH : pcuint32 = pointer($04000444);
  588. MATRIX_POP : pcuint32 = pointer($04000448);
  589. MATRIX_SCALE : pcint32 = pointer($0400046C);
  590. MATRIX_TRANSLATE : pcint32 = pointer($04000470);
  591. MATRIX_RESTORE : pcuint32 = pointer($04000450);
  592. MATRIX_STORE : pcuint32 = pointer($0400044C);
  593. MATRIX_IDENTITY : pcuint32 = pointer($04000454);
  594. MATRIX_LOAD4x4 : pcint32 = pointer($04000458);
  595. MATRIX_LOAD4x3 : pcint32 = pointer($0400045C);
  596. MATRIX_MULT4x4 : pcint32 = pointer($04000460);
  597. MATRIX_MULT4x3 : pcint32 = pointer($04000464);
  598. MATRIX_MULT3x3 : pcint32 = pointer($04000468);
  599. //matrix operation results
  600. MATRIX_READ_CLIP : pcint32 = pointer($04000640);
  601. MATRIX_READ_VECTOR : pcint32 = pointer($04000680);
  602. POINT_RESULT : pcint32 = pointer($04000620);
  603. VECTOR_RESULT : pcuint16 = pointer($04000630);
  604. {$endif NDS_INTERFACE}
  605. {$ifdef NDS_INTERFACE}
  606. function RGB15(r, g, b: cint): cuint16;
  607. function RGB5(r, g, b: cint): cuint16;
  608. function RGB8(r, g, b: cint): cuint8;
  609. function VRAM_OFFSET(n: cint): cint; inline;
  610. function DISPLAY_CHAR_BASE(n: cuint32): cuint32; inline;
  611. function DISPLAY_SCREEN_BASE(n: cuint32): cuint32; inline;
  612. procedure videoSetMode(mode: cuint32); inline;
  613. procedure videoSetModeSub(mode: cuint32); inline;
  614. function BG_PRIORITY(n: cint): cint; inline;
  615. function BG_TILE_BASE(base: cint): cint; inline;
  616. function BG_MAP_BASE(base: cint): cint; inline;
  617. function BG_BMP_BASE(base: cint): cint; inline;
  618. function BG_MAP_RAM(base: cint): cint; inline;
  619. function BG_MAP_RAM_SUB(base: cint): cint; inline;
  620. function BG_TILE_RAM(base: cint): cint; inline;
  621. function BG_TILE_RAM_SUB(base: cint): cint; inline;
  622. function BG_BMP_RAM(base: cint): cint; inline;
  623. function BG_BMP_RAM_SUB(base: cint): cint; inline;
  624. function DCAP_MODE(n: cint): cint; inline;
  625. function DCAP_DST(n: cint): cint; inline;
  626. function DCAP_SRC(n: cint): cint; inline;
  627. function DCAP_SIZE(n: cint): cint; inline;
  628. function DCAP_OFFSET(n: cint): cint; inline;
  629. function DCAP_BANK(n: cint): cint; inline;
  630. function DCAP_B(n: cint): cint; inline;
  631. function DCAP_A(n: cint): cint; inline;
  632. function GFX_BUSY: boolean; inline;
  633. {$endif NDS_INTERFACE}