背景资料
我目前正在使用 KickC [测试版] 为 Commodore C64 开发一个编程 API,让我能够更轻松地开发小程序、应用程序和可能的一些游戏;我突然想到我可能需要一种方法来检查我的代码是在 PAL 还是 NTSC 机器上运行,在后一种情况下,是哪个 NTSC 机器,因为旧的 NTSC C64 的扫描线比新的 C64 版本少一个。
在寻求帮助后,Robin Harbron 给我发了一个代码片段,其中包括连接 CMD SuperCPU(我的最终目标机器)。由于他将其作为汇编发送,我不得不按原样使用大部分内容,但使用 KickC 中的 ASM 指令,如下所示:
/**
* This is the initialisation will
* determine the machine type
* by setting the getMachineType global
* as follows:
* 37 is PAL
* 5 is NTSC (old)
* 6 is NTSC (new)
* 0 (or any other value) is unknown
*
* For safety, the initial value of 0xc000
* is stored into the accumulator and
* pushed onto the stack; it is then
* restored after the getMachineType
* global is set
*
* @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()
功能是这样的:
/**
* Returns a single byte from a specific
* memory location
*/
unsigned char peek(unsigned short location) {
unsigned char* memory = (char*)location;
unsigned char returnByte = *memory;
return returnByte;
}
所以现在我可以确定运行我的程序的主机上可用的扫描行数,从而更容易地创建 PAL 和 NTSC 兼容的可执行文件。
KickC 可从CSDb.dk下载,并将使用Kick Assembler构建和组装