无法弄清楚如何使用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
会好),或者将其忽略,因此编译器会自行选择合适的值。
非常感谢!我会给它一个镜头并回报。 – ajcrm125
由于堆栈溢出而导致上述更新问题的注释限制:( – ajcrm125
注释不适用于发布长代码示例。提供更多信息的正确方法的确是为了扩展问题。 – Konamiman