【问题标题】:Can't figure out how to write interrupt handler for Z80 using SDCC不知道如何使用 SDCC 为 Z80 编写中断处理程序
【发布时间】:2017-06-04 20:45:42
【问题描述】:

我正在用 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

任何有使用 SDCC 开发 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。

【问题讨论】:

    标签: interrupt z80 sdcc


    【解决方案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 就可以了)或将其省略,因此编译器将自行选择合适的值。

    【讨论】:

    • 由于堆栈溢出评论限制而更新了上述问题:(
    • 评论不适用于发布长代码示例。提供更多信息的正确方法确实是扩展问题。
    猜你喜欢
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 2014-08-03
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    相关资源
    最近更新 更多