无法弄清楚如何使用SDCC为Z80编写中断处理程序

问题描述:

我正在开发一个用于Z80的C程序并使用SDCC进行编译。我无法弄清楚如何为从0x0066开始的NMI中断和从0x0038开始的IM1中断创建中断处理程序。我使用这些调用:无法弄清楚如何使用SDCC为Z80编写中断处理程序

void IM1_InterruptHandler(void) __interrupt 

void NMI_InterruptHandler (void) __critical __interrupt 

和所得到的组件看起来约权,但他们不处于正确的地址。我也发现这个线程:

https://sourceforge.net/p/sdcc/feature-requests/519/

,但无法弄清楚如何使用上面的例子crt0.s中的文件与SDCC的Z80目标。 使用--use-crt开关似乎不起作用。

unknown compiler option '--use-crt=crt0.s' ignored 

任何经验丰富的Z80开发与SDCC,可以提供一些指导?

编辑: 还不完全。我crt.s文件看起来像这样:

.module crt0 
    .globl _main 
    .globl _IM1_InterruptHandler 
    .globl _NMI_InterruptHandler 

    .area _HEADER (ABS) 
    ;; Reset vector 
    .org 0 
    jp init 

    .org 0x08 
    reti 
    .org 0x10 
    reti 
    .org 0x18 
    reti 
    .org 0x20 
    reti 
    .org 0x28 
    reti 
    .org 0x30 
    reti 

    .org 0x38 
    jp _IM1_InterruptHandler 

    .org 0x66 
    jp _NMI_InterruptHandler 

    .org 0x100 
init: 
    ;; Stack at the top of memory. 
    ld sp,#0x8300 

    call _main 


    ;; Ordering of segments for the linker. 
    .area _HOME 
    .area _CODE 

    .area _DATA 

    .area _CODE 

而且我做了以下内容:

sdasz80 -l -o mycrt.rel crt0.s 
sdcc -mz80 --no-std-crt0 --code-loc 0x0000 --data-loc 0x8000 mycrt.rel ppclone_menu.c 

每一件事看起来编译就好了,但是当我打开代码在反汇编我不没有看到任何crt0代码被插入在位置0x08到0x66之上。

要使用自定义信息crt0先向您需要使用sdasz80编译它,这应该是你的SDCC安装的一部分:

sdasz80 -o crt0_int.rel crt0_int.asm 

然后编译程序添加以下的SDCC命令行:

--no-std-crt0 crt0_int.rel 

所以完整的命令行会是这样的:

sdcc --code-loc 0xWhatever --data-loc 0xWhatever -mz80 --no-std-crt0 crt0_int.rel somelibrary.lib yoursource.c 

如果您需要完整crt0文件的示例,您可以在my MSX software repository中找到一个。

编辑:你传入--code-loc 0x0000到SDCC编译源时,这将导致代码段覆盖任何在信息crt0定义。将其更改为更合适的值(因为您的crt0看起来像0x0110会好),或者将其忽略,因此编译器会自行选择合适的值。

+0

非常感谢!我会给它一个镜头并回报。 – ajcrm125

+0

由于堆栈溢出而导致上述更新问题的注释限制:( – ajcrm125

+0

注释不适用于发布长代码示例。提供更多信息的正确方法的确是为了扩展问题。 – Konamiman