2017-06-04 95 views
1

我正在開發一個用於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之上。

回答

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會好),或者將其忽略,因此編譯器會自行選擇合適的值。

+0

非常感謝!我會給它一個鏡頭並回報。 – ajcrm125

+0

由於堆棧溢出而導致上述更新問題的註釋限制:( – ajcrm125

+0

註釋不適用於發佈長代碼示例。提供更多信息的正確方法的確是爲了擴展問題。 – Konamiman

相關問題