支持雷叔.......



雷精灵
2009-03-19 16:45:34

[i=s] 本帖最后由 niubo_ 于 2010-7-12 08:46 编辑 [/i]

[code]
int main(void){
irqSet(IRQ_HBLANK,HBlank);
irqEnable(IRQ_HBLANK);

/**Main Screen*/

vramSetBankF(VRAM_F_LCD);
dmaCopy((void*)Pokemon_Pal_bin,(void*)(VRAM_F+256),Pokemon_Pal_bin_size);
vramSetBankF(VRAM_F_BG_EXT_PALETTE);
videoSetMode(MODE_0_2D|DISPLAY_BG0_ACTIVE|DISPLAY_BG1_ACTIVE|DISPLAY_BG2_ACTIVE|DISPLAY_BG3_ACTIVE|DISPLAY_BG_EXT_PALETTE);
vramSetBankA(VRAM_A_MAIN_BG_0x06000000);

dmaCopy((void*)Pokemon_Map_bin,(void*)(SCREEN_BASE_BLOCK(31)),Pokemon_Map_bin_size);
int i=0;
for(i=0;i>1;i++){
BG_MAP_RAM(31)[i]|=(1<<12);
}
dmaCopy((void*)Pokemon_Tiles_bin,(void*)(CHAR_BASE_BLOCK(0)),Pokemon_Tiles_bin_size);

bgInit(0,BgType_Text8bpp,BgSize_B8_512x256,31,0);

/**Sub Screen*/
//
// vramSetBankH(VRAM_H_LCD);
// dmaCopy((void*)Pokemon_Pal_bin,(void*)VRAM_H,Pokemon_Pal_bin_size);
// vramSetBankH(VRAM_H_SUB_BG_EXT_PALETTE);
// videoSetModeSub(MODE_0_2D|DISPLAY_BG0_ACTIVE|DISPLAY_BG1_ACTIVE|DISPLAY_BG2_ACTIVE|DISPLAY_BG3_ACTIVE|DISPLAY_BG_EXT_PALETTE);
// vramSetBankC(VRAM_C_SUB_BG_0x06200000);
//
// dmaCopy((void*)Pokemon_Map_bin,(void*)(SCREEN_BASE_BLOCK_SUB(31)),Pokemon_Map_bin_size);
// dmaCopy((void*)Pokemon_Tiles_bin,(void*)(CHAR_BASE_BLOCK_SUB(0)),Pokemon_Tiles_bin_size);
//// dmaCopy((void*)Pokemon_Pal_bin,(void*)BG_PALETTE_SUB,Pokemon_Pal_bin_size);
//
// bgInitSub(0,BgType_Text8bpp,BgSize_B8_512x256,31,0);

int Frame=0;

while(TRUE){
swiWaitForVBlank();
// // gfx特效
// Frame++;
// bgScroll(0,0,0);
// if(Frame%8==0)x[0]++;
// if(Frame%4==0)x[1]++;
// if(Frame%2==0)x[2]++;
// if(Frame%2==0)x[4]+=2;else x[4]++;
// if(Frame%8==0)x[5]+=4;else x[5]+=2;
}
return 0;
}
[/code][attach]1024[/attach][attach]1025[/attach]

从上面的代码我们发现一件很邪恶的事情,由于Extended Palette没有直接地址,因此只能将Extended Palette载入到某一个Bank中,然后设置该Bank为扩展调色盘模式。
光彦:但是DS中一共有9个Bank啊!我到底要放到哪里呢?
灰原:(还是那副爱理不理的死相)去看GBATEK帮助文档或者video.h。那上面有对每一个Bank的详细描述。
元太:啊!看到了!E、F、G都有VRAM_x_BG_EXT_PALETTE这样的定义。
步美:那也就是说,这三个Bank都可以用来载入扩展调色盘!
灰原:嗯。完全正确。
光彦:原来如此!啊!Bank H有VRAM_H_SUB_BG_EXT_PALETTE这个定义……看来Bank H是用来给副引擎实现扩展调色盘的。
灰原:不仅如此,只有Bank H才有这个定义,这说明,对于副引擎来说,扩展调色盘只能被载入到Bank H中。
步美:噢!难怪上面被屏蔽的代码中,副引擎是使用Bank H作为扩展调色盘……

唐三藏:(缓缓转过头来,温柔地盯着你)少年侦探团的几个小鬼头明白了。你明白了吗?
你:(掏匕首)啊……我受不了了!

现在,确定了扩展调色盘应该载入到什么地方,那么,我们就把理论实际化吧。从上面的代码我们又发现一件邪恶的事情,载入调色盘的时候关于这个顺序和方式……
灰原:工藤,你仔细观察一下这个现场,犯罪嫌疑人的手法非常不符合常理……
柯南:(一边沉思一边分析)嗯……首先就是这个vramSetBankF(VRAM_F_LCD);。犯罪嫌疑人首先将打算设置为扩展调色盘的Bank置为LCD模式,然后将数据载入Bank,再将Bank重新设置为扩展调色盘模式……嗯,这简直太奇怪了!
服部:假如我是犯罪嫌疑人的话,我才不会绕了一个弯。
柯南:但是犯罪嫌疑人就确实这么做了!而且成功了!难道他做的这个绕弯的举动都是无意义的吗?
毛利:狗屁!我们测试一下不就行了?警部大人,帮我一个忙……
目暮:噢!好的,毛利老弟。

于是那个天才的小五郎写下来如下代码:[code]
vramSetBankF(VRAM_F_BG_EXT_PALETTE);
dmaCopy((void*)Pokemon_Pal_bin,(void*)(VRAM_F+256),Pokemon_Pal_bin_size);
videoSetMode(MODE_0_2D|DISPLAY_BG0_ACTIVE|DISPLAY_BG1_ACTIVE|DISPLAY_BG2_ACTIVE|DISPLAY_BG3_ACTIVE|DISPLAY_BG_EXT_PALETTE);
vramSetBankA(VRAM_A_MAIN_BG_0x06000000);

dmaCopy((void*)Pokemon_Map_bin,(void*)(SCREEN_BASE_BLOCK(31)),Pokemon_Map_bin_size);
int i=0;
for(i=0;i>1;i++){
BG_MAP_RAM(31)|=(1<<12);
}
dmaCopy((void*)Pokemon_Tiles_bin,(void*)(CHAR_BASE_BLOCK(0)),Pokemon_Tiles_bin_size);

bgInit(0,BgType_Text8bpp,BgSize_B8_512x256,31,0);
[/code]结果得到了一个黑屏!

毛利:なんだと?怎么会这样?(突然间身子软了下来,扭啊扭的如同惯例一样正巧坐到了沙发上并摆出了一幅极严肃的表情)
目暮:哦哦!沉睡的小五郎!
毛利:警部大人,我全都明白了!我们都被犯罪嫌疑人的障眼法欺骗了!
众人:什么?
毛利:犯罪嫌疑人做出首先设置Bank为LCD,再载入资源,再设置Bank为扩展调色盘这种绕弯的举动,不是故意的,而是被迫的!
目暮:什么?难道犯罪嫌疑人是无辜的?
毛利:我们知道,DS使用Bank这种机制进行动态映射,但是,我们都忽略了一个最基本的事实——DS只不过是GBA穿了个马甲。
服部:工藤……不,毛利叔叔,这和犯罪嫌疑人的手法有什么关系吗?
毛利:有。我们先来温习一下GBA。GBA中,调色盘的地址是多少?不管它是多少,GBA中,调色盘是有固定地址的。
众人:没错。
毛利:但是DS不一样!DS的每个Bank虽然有固定地址,但是一旦映射成别的模式之后,地址就被隐藏了!
众人:没错。
毛利:所以,如果要往某个Bank中写数据的话,你会怎么做?
目暮:DMA或者memcpy或者随便什么方法,将源地址和目标地址当成参数传递……(立刻被毛利打断)
毛利:你知道目标地址吗?注意看,只要设置成扩展调色盘模式之后,地址就被隐藏了。
众人:啊啊!原来如此!
毛利:所以,犯罪嫌疑人首先Bank设置为LCD模式。因为这种模式下可以直写内存。然后写数据。最后再将这个Bank转成扩展调色盘模式~~~~犯罪嫌疑人如此用心良苦的行为,就是在避免因为Bank映射而带来的地址隐藏。
目暮:哦……干得好啊,毛利老弟!幸亏毛利老弟的高明的推理,我们差点诬陷了一个无辜的人!
毛利:(睁眼)哎?啊……当然啦!我可是名侦探的毛利小五郎啊!啊哈哈哈哈~~~~(扯着嗓子大笑)
灰原:(如同鬼魅一般突然出现,冷冷地)等一下!(全场静寂)
毛利:这小女孩是谁啊?
灰原:(严肃的表情)毛利侦探……(被毛利打断:是“名”侦探!)毛利名侦探,根据你的说法,不能直接将Bank设置为扩展调色盘。因为此时地址被隐藏,无法传输数据。
毛利:是的。
灰原:好吧,我们就拿你刚才写的那个代码来看。很明显,你是直接设置为扩展调色盘模式,然后将数据传输到所谓的“已经被隐藏了地址的”VRAM_F里面。打开模拟器,你看看数据是不是已经被传递进来了?

[img]http://www.yayabo.cn/attachments/month_0903/20090319_0dfb4a3bec146564e435HSY71jbYftvG.png[/img]

毛利:哎?
灰原:(毫不留情面)你的推理失败了。
毛利:那……那你怎么解释为什么会黑屏?
灰原:(哑口无言)……
毛利:总……总之,就是这样没错!模拟器嘛,和真机是不一样的。(突然间)是的!我们要以真机为准!
众人:……


掌叔
2009-03-19 21:11:38

雷叔对于NDS的研究还是蛮有见地的。很欣赏他这种邪恶的研究精神……


whm3d
2009-03-19 21:45:25

支持雷叔(凑字数)


306526500
2009-03-20 20:22:14

厉害!
我还只是一个刚入门的新手呢


moxiagy
2009-04-30 23:34:57

还没入门呢~J2ME到是入门了


Isword
2009-05-07 20:23:07

雷叔永远那么雷~:)


meng_aq
2009-06-14 14:07:25

哎!
想当时我解决扩展调色板的时候,
把掌机开发之家的资料翻了个遍,结果还是没找到。
最后还是老老事实的看GBATEK,不过我英语不过关啊!(众人无语。。。)
不过好在我还有NO

支持雷叔为大家造福!!!


a851381980
2009-12-22 09:59:53

强人!说真的,我没看懂。


ls353326790
2010-07-03 09:12:47

即没看懂,也不明白雷叔是谁?