|
|
发表于 2026-1-18 02:14:03
|
显示全部楼层
本帖最后由 CalcLoverHK 于 2026-1-18 02:21 编辑
其实真要说差别的话就只有两处,但刚好就是最重要的两个指令。准确来说前代的屏幕驱动是叫T6K73,基于T6K11修改而来的。ML9801A也是T6K11的其中一种分支,但是内部控制代码不同于T6K73,所以旧版monochromelib库不能有效地在G-III机型上运行。
C.Basic肯定不是直接照搬monochromelib库的,后来的版本也有针对G-III机型简单地作适配,但直到2.50版本之前有些指令在G-III机型上就只是syscall指令套壳,比DMA途径慢至少2倍。2.50版本之后才用到ML9801A的DMA代码,而这个就取自gint的代码实现。
你真想在G-III机型上使用monochromelib的话,只需要修改以下两个指令就行了:
- /* RS = 0: Register selection */
- static volatile unsigned char *sel = (void *)0xb4000000;
- /* RS = 1: Command data or vram data */
- static volatile unsigned char *cmd = (void *)0xb4010000;
- /* command() - send a command to set the value of a register
- @reg Register number
- @data Value to set in reg */
- inline static void command(unsigned char reg, unsigned char data)
- {
- *sel = reg;
- *cmd = data;
- }
- #ifdef ML_CLEAR_SCREEN
- void ML_clear_screen()
- {
- int i, j;
- for(i=0 ; i<64 ; i++)
- {
- command(8, i | 0x80);
- command(8, 4);
- *sel = 10;
- for(j=0; j<16; j++)
- *cmd = 0;
- }
- }
- #endif
- #ifdef ML_DISPLAY_VRAM
- void ML_display_vram()
- {
- unsigned char *vram = GetVRAMAddress();
- int i, j;
- for(i = 0; i < 64; i++)
- {
- command(8, i | 0x80);
- command(8, 4);
- *sel = 10;
- for(j=0; j<16; j++)
- *cmd = *vram++;
- }
- }
- #endif
复制代码 还是那句话,建议你玩玩fxSDK/gint的绘图库,卡西欧所有用过的屏幕驱动它都有相应的DMA优化,比monochromelib库更加全面。 |
|