User Tag List

Страница 12 из 38 ПерваяПервая ... 8910111213141516 ... ПоследняяПоследняя
Показано с 111 по 120 из 377

Тема: Ищу Си для Z80

  1. #111

    Регистрация
    21.12.2005
    Адрес
    Kyiv/Ukraine
    Сообщений
    415
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sayman Посмотреть сообщение
    транно, но при попытке собрать данный crt0, компилятор выдаёт несколько ошибок на строки типа:
    Попробуйте добавить три строчки:
    .globl l__INITIALIZER
    .globl s__INITIALIZED
    .globl s__INITIALIZER

    т.е. у меня так (начало crt файла)
    .module crt0
    .globl _main

    .globl l__INITIALIZER
    .globl s__INITIALIZED
    .globl s__INITIALIZER

    .area _HEADER (ABS)
    ;;
    .org 0x5000
    jp init
    ;

    init:


    Информация из форума по sdcc, почему не пофиксили не знаю.
    V6Z80P - Back for Good

  2. #112

    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,280
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    да, это я потом тоже нашёл. но вот что не могу понять и нигде не нахожу, это алгоритм по которому crt0 вообще прикручивается к компилируемому файлу. такое ощущение, что он прикручивается уже после main где или вообще где то в самом конце. пытаюсь сделать так, чтобы при сборке первыми байтами в файле бл заголовок ехе файла от спринтера. не лезет... что-то не так делаю или...?
    Последний раз редактировалось Sayman; 19.03.2015 в 15:51.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  3. #113

    Регистрация
    21.12.2005
    Адрес
    Kyiv/Ukraine
    Сообщений
    415
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    crt0 должен быть первым в списке линкуемых модулей.
    Т.к. crt0 содержит порядок следования сегментов, он должен быть строго первым, в коммандной строке, когда вызывается линкер.

    Если линкеру первым файлом не дать crt0, то порядок сегметов скорее всего не будет соблюден. Это заметно только если смотреть map файл.

    Эта инфа, про такие грабли, уже была много раз в форумах, но это нигде особо не написано в доках.




    http://develissimo.com/forum/topic/3703/
    Последний раз редактировалось Valen; 19.03.2015 в 16:26.
    V6Z80P - Back for Good

  4. #114

    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,280
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Valen Посмотреть сообщение
    crt0 должен быть первым в списке линкуемых модулей.
    Т.к. crt0 содержит порядок следования сегментов, он должен быть строго первым, в коммандной строке, когда вызывается линкер.

    Если линкеру первым файлом не дать crt0, то порядок сегметов скорее всего не будет соблюден. Это заметно только если смотреть map файл.

    Эта инфа, про такие грабли, уже была много раз в форумах, но это нигде особо не написано в доках.




    http://develissimo.com/forum/topic/3703/
    вот кусок из evosdk
    Код:
    sdcc -mz80 --code-loc 0x0000 --data-loc 0x0000 --no-std-crt0 -I..\evosdk ..\evosdk\crt0.rel ..\evosdk\evo.rel --opt-code-speed main.c -o %temp%\out.ihx
    а вот сам crt0
    Код:
    	.module crt0
    	.globl	_main
    	.globl	l__INITIALIZER
    	.globl	s__INITIALIZED
    	.globl	s__INITIALIZER
            .globl	s__GSINIT
    
            
    	.area _HEADER (ABS)
    
    	.org    0x8100-512	;--code-loc 0x0006
    ;init:
    ;	call s__GSINIT
    ;	jp   __pre_main
            
            .area _CODE
    ; заголовок для запуска в досе спринтера
                  .db 0x45,0x58,0x45
    	.db 0
    	.dw 0x200
    	.dw 0
    	.dw 0
    	.dw 0
    	.dw 0
    	.dw 0
    	.dw __pre_main
    	.dw __pre_main
    	.dw 0xbfff
    	.ds 490
    ;---------------------------------        
    __pre_main:
    	push de
    	ld de,#_HEAP_start
    	ld (_heap_top),de
    	pop de
    	call _main
    	di
    	halt
    
    	;; Ordering of segments for the linker.
    	.area	_HOME
    	.area	_CODE
    	.area	_INITIALIZER
    	.area   _GSINIT
    	.area   _GSFINAL
    
    	.area	_DATA
    	.area	_INITIALIZED
    	.area	_BSEG
    	.area   _BSS
    	.area   _HEAP 
    	.area	_DATA
    
    _heap_top::
    	.dw 0
    
    	.area   _GSINIT
    gsinit::
    
    	.area   _GSFINAL
    	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: 
    	ret
    
    	.area	_HEAP
    
    _HEAP_start::
    при компиляции простого тестового main.c, его код при компиляции становится первым, после него только уже crt0.
    при этом в строке компиляции в батнике параметры типа --code-loc должен указывать на 0x8100. т.е. в заголовке бинарника первые 512 байт досом будут откушены, код следующий за ним как раз и должен начинаться с 8100. а там соответственно должно быть бла бла call main и сам main должен быть ниже. при компиляции древнющим hi-tech-c всё так и есть. только он под цпм и файлы создаёт с кратностью 128байт..не удобна совершенно.
    и ещё, там в crt0 часть именуемая как .area header (abs) после сборки из ihx или hex файлов в bin тупо исчезает. для получения бинарника делаю так:
    Код:
    packihx "%temp%\out.ihx" > "%temp%\out.hex"
    hex2bin -p 0 -s some_addr "%temp%\out.hex"
    Последний раз редактировалось Sayman; 19.03.2015 в 16:49.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  5. #115

    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,581
    Спасибо Благодарностей отдано 
    64
    Спасибо Благодарностей получено 
    112
    Поблагодарили
    97 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Для сборки SDCC с самописным crt0, который должен идти первым в коде и в котором делалось org 100H (ибо для CP/M) я использовал такие ключи:
    Код:
    --code-loc 0x0198 --data-loc 0
    где 98H (100H+98H=198H) - некий офсет как раз на размер кода crt0.

    При этом объектные модули перечислялись последовательно, crt0 - первым.

    Сам crt0 был примерно таким (в комментах "0x170" там от Конами/MSX остался, я переписывал кое что и у меня поэтому вырос до 0x198 ):

    Скрытый текст


    Код:
    	;--- crt0.s for MSX-DOS - by Konami Man, 11/2004
    	;    Advanced version: allows "int main(char** argv, int argc)",
    	;    the returned value will be passed to _TERM on DOS 2,
    	;    argv is always 0x100 (the startup code memory is recycled).
            ;    Overhead: 112 bytes.
    	;
            ;    Compile programs with --code-loc 0x170 --data-loc X
            ;    X=0  -> global vars will be placed immediately after code
            ;    X!=0 -> global vars will be placed at address X
            ;            (make sure that X>0x100+code size)
    
    	.globl	_main
    
    	.area _HEADER (ABS)
    
            .org    0x0100  ;MSX-DOS .COM programs start address
    
            ;--- Step 1: Initialize globals
    
    init:   ld	hl,#initb
    	push	hl
    	ld	hl,#gsinit-1
    inita:	inc	hl
    	ld	a,(hl)
    	inc	a
    	jr	z,inita
    	jp	(hl)
    
            ;--- Step 2: Build the parameter pointers table on 0x100,
            ;    and terminate each parameter with 0.
            ;    MSX-DOS places the command line length at 0x80 (one byte),
            ;    and the command line itself at 0x81 (up to 127 characters).
    
    initb:  ld	hl,(#6)
    	ld	sp,hl		; set SP = TPA top 
    	dec	h		; HL=SP-256
    	ex	de,hl		; de=parloop destination
    
            ;* Check if there are any parameters at all
    	ld      a,(#0x80)
            or      a
            ld      c,#0
            jr      z,cont
            
            ;* Terminate command line with 0
            ;  (DOS 2 does this automatically but DOS 1 does not)
            
            ld      hl,#0x81
            ld      bc,(#0x80)
            ld      b,h		; #0
            add     hl,bc
            ld      (hl),b		; #0
            
            ;* Copy the command line processing code to 0xC000 and
            ;  execute it from there, this way the memory of the original code
            ;  can be recycled for the parameter pointers table.
            ;  (The space from 0x100 up to "cont" can be used,
            ;   this is room for about 40 parameters.
            ;   No real world application will handle so many parameters.)
     
            ld      hl,#cont        ;To continue execution at "cont"
            push    hl              ;when the routine RETs
    	push	de		;next ret = jmp parloop
           
            ld      hl,#parloop
            ld      c,#parloopend-#parloop	; bc
            ldir				; BC=0
            
            ;* Initialize registers and jump to the loop routine
            
            ld      hl,#0x81        ;Command line pointer
    ;       ld      c,#0            ;Number of params found
            ld      ix,#0x100       ;Params table pointer
            
    	ret 
           
            ;>>> Command line processing routine begin
            
            ;* Loop over the command line: skip spaces
            
    parloop: ld      a,(hl)
            or      a       ;Command line end found?
            ret     z
    
            cp      #32
            jr      nz,parfnd
            inc     hl
            jr      parloop
    
            ;* Parameter found: add its address to params table...
    
    parfnd: ld      (ix),l
            ld      1(ix),h
            inc     ix
            inc     ix
            inc     c
            
            ld      a,c     ;protection against too many parameters
            cp      #40
            ret     nc
            
            ;* ...and skip chars until finding a space or command line end
            
    parloop2:       ld      a,(hl)
            or      a       ;Command line end found?
            ret     z
            
            sub     a,#32
            jr      nz,nospc        ;If space found, set it to 0
                                    ;(string terminator)...
            ld      (hl),a		;#0
            inc     hl
            jr      parloop         ;...and return to space skipping loop
    
    nospc:  inc     hl
            jr      parloop2
    
    parloopend:
            
            ;>>> Command line processing routine end
            
            ;* Command line processing done. Here, C=number of parameters.
    
    cont:   ld	hl,#_HEAP_start
    	ld	(_heap_top),hl
    	ld      hl,#0x100
            ld      b,l	;#0
            push    bc      ;Pass info as parameters to "main"
            push    hl
    
            ;--- Step 3: Call the "main" function
    	call    _main
    
            ;--- Step 4: Program termination.
            ;    Termination code for DOS 2 was returned on L.
                    
            ld      c,#0x62   ;DOS 2 function for program termination (_TERM)
            ld      b,l
            call    5      ;On DOS 2 this terminates; on DOS 1 this returns...
            ld      c,#0x0
            jp      5      ;...and then this one terminates
                           ;(DOS 1 function for program termination).
    
            ;--- Program code and data (global vars) start here
    
    	;* Place data after program code, and data init code after data
    
    	.area	_CODE
    
    _bios::				; uchar bios(int FuncNo, int Param)
    _bioshl::			; int bioshl(int FuncNo, int Param)
    	ld      hl,#2
    	ld	d,h		; d=0
    	add     hl,sp
    	ld	e,(hl)		; Func No
    	inc	hl
    	inc	hl
    	ld	c,(hl)
    	inc	hl
    	ld	b,(hl)		; Parameter
    	ld	hl,(#1)
    	add	hl,de
    	add	hl,de
    	add	hl,de
    	ld	a,#8		
    	cp	e
    	jr	nz,abios
    	jp	(hl)		; return HL (16 bit)
    abios:  ld	de,#bbios
    	push	de
    	jp	(hl)
    bbios:	ld	l,a		; return A (8 bit)
    	ret
    
    	.area	_DATA
    _heap_top::
    	.dw 0
    
    gsinit: .area   _GSINIT
    
            .area   _GSFINAL
            ret
    
    	;* These doesn't seem to be necessary... (?)
    
            ;.area  _OVERLAY
    	;.area	_HOME
            ;.area  _BSS
    	.area	_HEAP
    
    _HEAP_start::
    [свернуть]


    ---------- Post added at 18:43 ---------- Previous post was at 18:25 ----------

    А вообче, связываться с SDCC - обрекать себя на фейл, причем который приходит неожиданно и после кучи потраченных дней.
    Последний раз редактировалось Error404; 19.03.2015 в 18:40.
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

  6. #116

    Регистрация
    21.12.2005
    Адрес
    Kyiv/Ukraine
    Сообщений
    415
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sayman Посмотреть сообщение
    sdcc -mz80 --code-loc 0x0000 --data-loc 0x0000 --no-std-crt0 -I..\evosdk ..\evosdk\crt0.rel ..\evosdk\evo.rel --opt-code-speed main.c -o %temp%\out.ihx
    Строка правильная,
    не знаю в чём проблема...

    P.S.
    У меня между .area _HEADER (ABS) и .area _HOME нет объявления никаких других .area
    У вас же там есть .area _CODE, попробуйте удалить одну строку .area _CODE.



    ; jp __pre_main

    .area _CODE удалить эту строку
    ; заголовок для запуска в досе спринтера
    Последний раз редактировалось Valen; 19.03.2015 в 20:06.
    V6Z80P - Back for Good

  7. #117

    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,280
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Error404,
    А вообче, связываться с SDCC - обрекать себя на фейл, причем который приходит неожиданно и после кучи потраченных дней.
    да ну как сказать. есть же народ который пользуется и вполне себе доволен. Хайтех, конечно, хороший компилятор, но уж сильно бесит как он толкает тупые конструкции в код. Например, просто пачка, целая серия jp для перехода на нужный адрес. Он их делает штук 5. Ещё раздражает, как он после вызова каких-то функций/процедур, после call func толкает ld h,h ld l,l. Не понимаю, зачем он это делает. оптимизатор у него не работает, значит получить оптимизацию по скорости или размеру не получится. С другой стороны, если не прокатит с sdcc, то видимо да, остаётся только юзать эмуль цпм и гонять хайтеха. вариант с z88dk - ну его в баню.
    кстати, при компиляции получается набор файлов, среди которых ihx. чем ты его в бинар перегоняешь?
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  8. #118

    Регистрация
    27.01.2005
    Сообщений
    924
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    193
    Поблагодарили
    154 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ТУТ немного примеров на SDCC http://zx-pk.ru/showthread.php?t=23473 от меня.
    Многофайловая компиляция, библиотеки.

  9. #119

    Регистрация
    21.12.2005
    Адрес
    Kyiv/Ukraine
    Сообщений
    415
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sayman Посмотреть сообщение
    среди которых ihx. чем ты его в бинар перегоняешь?

    srec_cat $SOURCE -intel -offset -0x5000 -o $TARGET -binary
    http://srecord.sourceforge.net/
    V6Z80P - Back for Good

  10. #120

    Регистрация
    27.01.2005
    Сообщений
    924
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    193
    Поблагодарили
    154 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Есть утилита HEX2BIN. Очень простая и хорошая.

    ТУТ должна быть http://zx-pk.ru/showthread.php?t=20047
    Последний раз редактировалось SfS; 19.03.2015 в 20:18.

Страница 12 из 38 ПерваяПервая ... 8910111213141516 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •