You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:24:02