如何将 SID 文件包含到 C64 上的 cc65 程序中?

How to include a SID-File into a cc65 program on a C64?

我想在 cc65 程序中包含并播放 .sid 文件(C64 芯片音乐)。通常 sid 文件包含一个起价为 1000 美元的播放例程,我如何 link 将其添加到我的 cc65 程序中? 目前,我使用以下命令使用 cc65 编译我的代码:

cl65 -O -o C64test.prg -t c64 C64test.c

我找到了解决方案:

  1. 创建生成以下代码的 .asm 文件:

    .export _setupAndStartPlayer
    
    sid_init = 00
    sid_play = 03
    siddata = 00
    
    .segment "CODE"
    
    .proc _setupAndStartPlayer: near
            lda #[=10=]     ; select first tune
            jsr sid_init ; init music
            ; now set the new interrupt pointer
            sei
            lda #<_interrupt ; point IRQ Vector to our custom irq routine
            ldx #>_interrupt
            sta 4 ; store in 4/5
            stx 5
    
            cli ; clear interrupt disable flag
            rts     
    .endproc        
    
    .proc _interrupt
            jsr sid_play
            ;dec 53280 ; flash border to see we are live
            jmp $EA31 ; do the normal interrupt service routine
    .endproc
    
  2. 从 C:

    调用 asm 函数
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <c64.h>
    
    extern int setupAndStartPlayer();
    
    int main(void) {
            printf("Setting up player\n");
            setupAndStartPlayer();
            return 0;
    }
    
  3. 使用标准 cc65 Makefile 编译这两个文件,这会为您提供一个包含代码的 .c64 文件,但没有 SID 数据

  4. 使用 sidreloc 重新定位 SID 文件(选项 -p 定义新的起始页,在本例中 20 表示 $2000)

    ./sidreloc -r 10-1f -p 20 sidfile.sid sidfile2000.sid
    
  5. 将 SID 文件转换为 C64 .prg 使用 psid64:

    psid –n sidfile2000.sid
    
  6. Link文件sidfile2000.prg连同使用exomizer编译的C程序(数字2061是程序的起始地址, 2061 是 cc65 的默认值):

    exomizer sfx 2061 music.c64 sidfile2000.prg -o final.prg