Сообщение от
Sayman
да, это я потом тоже нашёл. но вот что не могу понять и нигде не нахожу, это алгоритм по которому crt0 вообще прикручивается к компилируемому файлу. такое ощущение, что он прикручивается уже после main где или вообще где то в самом конце. пытаюсь сделать так, чтобы при сборке первыми байтами в файле бл заголовок ехе файла от спринтера. не лезет... что-то не так делаю или...?
Пляши, Sayman
Решил я твою проблему. Даже скрипт не понадобился.
Проблема была в том, что ты хедер exe-файла не в ту секцию положил, а нужно, непосредственно ПЕРЕД меткой 'init:'.
Вот так:
Код:
; CRT startup module for Sprinter DOS executable by Amixgris. 22.03.2015.
.module crt0
.globl _main
.area _HEADER (ABS)
.org 0x7f00 ;--code-loc = 0x8100 + 0x20 = 0x8120
; воообще для получения значения --code-loc нужно к адресу запуска прибавить
; размер стартапа от метки init до конца процедуры _exit. 0x20 - прибавлено с запасом.
.ascii 'EXE'
.db 0
.dw 0x200
.dw 0
.dw 0
.dw 0
.dw 0
.dw 0
.dw init
.dw init
.dw 0xc000
.ds 490
init:
;; Initialise global variables
; ld sp,#0x0000
call gsinit
call _main
jp _exit
_exit::
1$:
halt
jr 1$
.area _HOME
.area _CODE
.area _INITIALIZER
.area _GSINIT
.area _GSFINAL
.area _DATA
.area _INITIALIZED
.area _BSEG
.area _BSS
.area _HEAP
.area _CODE
.area _GSINIT
gsinit::
ld bc, #l__INITIALIZER
ld a, b
or a, c
jr Z, gsinit_next
ld de, #s__INITIALIZED
ld hl, #s__INITIALIZER
ldir
gsinit_next:
.area _GSFINAL
ret
Далее. Если у тебя Спринтер запускает код с 0x8100, то ПОЧЕМУ ты значение --code-loc выставляешь в 0x0000?! code-loc должен начинаться ЗА процедурой инициализации, а не перед ней. Здесь инит занимает 12 байт, т.о. codе-lock = 0x7f00 + 0x200 + 0x0c = 0x810c. В этом свете, мне кажется, что "в лоб" адаптировать evo-sdk на Sprinter нельзя - она компилится с 0x0000. А твой екзешник не может с 0x0000 стартовать.
Но ты можешь надергать оттуда процедур, и что-нибудь написать, чтоб уместилось с 0x8100 до 0xc000, включая стэк.
Компилить exe для Sprinter DOS надо так:
Один раз компилим crt0-файл, чтобы получить "crt0.rel":
Код:
sdasz80 -g -o crt0.s
Затем каждый раз:
Код:
sdcc -c - mz80 my_exe_for_Sprinter.c
sdcc -mz80 --code-loc 0x8120 --data-loc 0x0000 --no-std-crt0 crt0.rel my_exe_for_Sprinter
hex2bin my_exe_for_Sprinter.ihx
Переименуешь расширение с bin на exe, и будет тебе счастье
Да, оформление выхода в DOS оставляю за тобой. Пока там вечный цикл.