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

时间:2017-06-04 20:45:42

标签: interrupt z80 sdcc

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

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

任何有SD80 Z80开发经验的人都可以提供一些指导吗?

编辑: 还没有到那里。我的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的位置上面。

1 个答案:

答案 0 :(得分:1)

要使用自定义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会没问题)或将其保留,所以编译器会自己选择一个合适的值。