nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 06:57



Reply to topic  [ 1 post ] 
Использование SDCC для разработки программ под ZX 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
В продолжение темы Программирование на компиляторах ЯВУ для ретро ЭВМ
barsik wrote:
На форумах только и встречаются пользователи его, SDCC, ZDK88 и ещё IAR (но его трудно скачать и он платный)...

С некоторого времени z88dk перестал быть частью Debian (хотя с десяток лет назад был), а вот sdcc до сих пор остаётся одним из стандартных пакетов:
Code:
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

Пэтому я решил таки заморочиться и научиться компилировать сишные программки под ZX Spectrum на SDCC. После некоторого гугления я нашёл вот такую микродемку, написанную под SDCC с исходниками:

https://speccy.pl/archive/prod.php?id=223
Attachment:
sdcc_scroll.gif
sdcc_scroll.gif [ 4.2 KiB | Viewed 15841 times ]

Мне удалось пересобрать это в моём дебияне в том sdcc, что там есть (см. выше), но с изменённым скриптом сборки (поменял последние 2 команды - первод из HEX в BIN и создание TAP):
Code:
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 8000 tape
где bin2tap это моя программа для генерации TAP-файлов, которая использует файл tape который есть бейсик-загрузчик кодовых блоков с адреса #8000 (оба взяты из моего nedoPC SDK).

и с подправленным crt0.s (правил чтобы всё начиналось с #8000):
Code:
; 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::
(а кстати почему стек ставится в #FFFE? если надо поставить в конец памяти, то делаем LD SP,0 ведь SP всё равно декрементируется перед сохранением,
но если мы вдруг надумаем пользовательские символы UDG использовать, которые натолканы в конец памяти, то стек наверное надо поставить в #FF00)

Сишный исходник примера изобилует ассемблерными вставками типа таких:
Code:
   __asm__ (" call #3503 ");       // clear screen
...
   __asm__ (" ei ");         // enable interrupts
...
   __asm__ ("halt");      // wait for frame interrupt
или вот прямо целая функция может быть определена на асме:
Code:
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;
}

И этого в-принципе достаточно, чтобы начать что-то делать под ZX на ЯВУ :mrgreen:


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


Attachments:
crt0.zip [480 Bytes]
Downloaded 400 times

_________________
:dj: https://mastodon.social/@Shaos
03 Feb 2023 21:26
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 1 post ] 

Who is online

Users browsing this forum: No registered users and 13 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.