С некоторого времени z88dk перестал быть частью Debian (хотя с десяток лет назад был), а вот sdcc до сих пор остаётся одним из стандартных пакетов:barsik wrote:На форумах только и встречаются пользователи его, SDCC, ZDK88 и ещё IAR (но его трудно скачать и он платный)...
Code: Select all
root@amd64s:/# aptitude search sdcc
i sdcc - Small Device C Compiler
p sdcc:i386 - Small Device C Compiler
i sdcc-doc - Small Device C Compiler (documentation)
i A sdcc-libraries - Small Device C Compiler (libraries)
i sdcc-ucsim - Micro-controller simulator for SDCC
p sdcc-ucsim:i386 - Micro-controller simulator for SDCC
root@amd64s:/# aptitude show sdcc
Package: sdcc
Version: 3.5.0+dfsg-2+b1
State: installed
Automatically installed: no
Priority: optional
Section: electronics
Maintainer: Gudjon I. Gudjonsson <gudjon@gudjon.org>
Architecture: amd64
Uncompressed Size: 6,819 k
Depends: sdcc-libraries (= 3.5.0+dfsg-2), libc6 (>= 2.14), libgcc1 (>= 1:3.4), libstdc++6 (>= 5.2)
Recommends: sdcc-doc
Suggests: python, sdcc-ucsim
Conflicts: sdcc:i386
Breaks: sdcc-ucsim (< 3.5.0), sdcc-ucsim:i386 (< 3.5.0)
Replaces: sdcc-ucsim (< 3.5.0), sdcc-ucsim:i386 (< 3.5.0)
Description: Small Device C Compiler
SDCC is a C compiler for the Intel MCS51 family, HC08, PIC, GameBoy Z80, DS80S390, Z80, Z180 and STM8 microcontrollers.
This package includes the compiler, assemblers and linkers.
Homepage: http://sdcc.sourceforge.net
Tags: devel::compiler, devel::lang:c, devel::machinecode, hardware::embedded, interface::commandline, role::program,
scope::utility, works-with::software:source
После некоторого гугления я нашёл вот такую микродемку, написанную под SDCC с исходниками:
https://speccy.pl/archive/prod.php?id=223 Мне удалось пересобрать это в моём дебияне в том sdcc, что там есть (см. выше), но с изменённым скриптом сборки (поменял последние 2 команды - первод из HEX в BIN и создание TAP-файла):
Code: Select all
sdasz80 -o crt0.rel crt0.s
sdcc -mz80 --reserve-regs-iy --opt-code-speed --max-allocs-per-node 100000 --code-loc 0x800A --data-loc 0 --no-std-crt0 crt0.rel scroll.c -o scroll.ihx
objcopy -I ihex -O binary scroll.ihx scroll.bin
./bin2tap scroll.bin 32768 TAPE
и с подправленным crt0.s (правил чтобы всё начиналось с #8000):
Code: Select all
; minimal template for sdcc for zx spectrum programs
; init code starts at 0x8000
; main code starts at 0x800A
; stack is set to 0xfffe
.globl _main
.area _HEADER (ABS)
.org 0x8000 ; 10 bytes in init section
init:
di
ld sp,#0xfffe ; stack set to end of RAM
call gsinit ; sdcc init
jp _main ; just to be sure we start at main
code_and_data:
.org 0x800A
.area _CODE ; code and main function lands here
.area _DATA ; global data section
gsinit:
.area _GSINIT ; sdcc startup code
.area _GSFINAL
ret
.area _HEAP
_HEAP_start::
но если мы вдруг надумаем пользовательские символы UDG использовать, которые натолканы в конец памяти, то стек наверное надо поставить в #FF00)
Сишный исходник примера изобилует ассемблерными вставками типа таких:
Code: Select all
__asm__ (" call #3503 "); // clear screen
...
__asm__ (" ei "); // enable interrupts
...
__asm__ ("halt"); // wait for frame interrupt
Code: Select all
void srand_r() __naked {
// use R registry to be more random
__asm
ld a,r
ld hl,#_rand_c
xor a, (hl)
ld (hl),a
ret
__endasm;
}

P.S. Приаттачиваю архив с поправленным crt0.s (тут SP уже в #FF00 ставится):