Commodore C64开发中如何通过KickC实现PAL与新旧NTSC机型检测?
背景信息
我目前正在使用处于Beta版的KickC为Commodore C64开发一套编程API,方便后续开发小型程序、应用甚至游戏;过程中我需要实现一种检测代码运行环境的方法,判断当前运行的是PAL制式还是NTSC制式机器,若为NTSC机器还需区分版本,因为旧版NTSC C64比新版少一条扫描线。
多方求助后,Robin Harbron给我提供了一段可在搭载CMD SuperCPU(我的最终目标机型)的设备上正常运行的代码片段。由于他提供的是汇编代码,我基本保留了原有逻辑,通过KickC的ASM指令引入,具体实现如下:
/** * 该初始化函数会判断机器类型,并给全局变量getMachineType赋值,赋值规则如下: * 37 代表PAL制式 * 5 代表旧版NTSC * 6 代表新版NTSC * 0(或其他任意值)代表未知机型 * * 为保证安全,0xc000位置的初始值会先存入累加器再压入栈,在getMachineType全局变量赋值完成后会恢复原数值 * * @author Robin Harbron */ void setMachineType() { asm { lda $c000 pha sei __br1: lda $d011 bmi __br1 __br2: lda $d011 bpl __br2 __br3: lda $d012 bit $d011 bpl __ex1 sta $c000 bmi __br3 __ex1: cli } getMachineType = peek(0xc000); asm { pla sta $c000 } }
我在代码顶部全局声明了getMachineType变量,代码如下:
unsigned byte getMachineType;
当前我使用的peek()函数实现如下:
/** * 从指定内存地址读取单字节数据并返回 */ unsigned char peek(unsigned short location) { unsigned char* memory = (char*)location; unsigned char returnByte = *memory; return returnByte; }
通过上述实现我可以判断运行程序的主机可用扫描线数量,进而更轻松地开发兼容PAL和NTSC制式的可执行文件。
KickC可从CSDb平台下载,它依托Kick Assembler完成构建和汇编操作。
内容的提问来源于stack exchange,提问作者Shaun Bebbers
相关产品推荐
相关产品推荐

