gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:12:49 29 4
gpt4 key购买 nike

我正在为 Z80 开发 C 程序并使用 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 位置。

最佳答案

要使用自定义 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 会很好)或将其省略,因此编译器会自行选择合适的值。

关于interrupt - 无法弄清楚如何使用 SDCC 为 Z80 编写中断处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44358613/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com