Помогите разобраться. Как создать хотя б хелло ворлд этой штукой.
Вид для печати
Помогите разобраться. Как создать хотя б хелло ворлд этой штукой.
хех... спасибо,не знал.Цитата:
#include <stdio.h>
main() {
printf("Hello world");
while(1) {};
}
Я про то, как скомпилировать под Z80.
Как записать допустим какое-либо значение в какую-нибудь область памяти. И тд.
этот самый printf - работает как ассемблерный call(процедура печати символа в ПЗУ) ?
---------- Post added at 23:58 ---------- Previous post was at 23:57 ----------
там куча бинарников в папке, а что с ними делать...хз... как настроить компоновщик...
Обычно под С это прямо не требуется, там идёт работа с переменными и указателями.Цитата:
Как записать допустим какое-либо значение в какую-нибудь область памяти
Но если очень надо:
*(char*)0xAAAA =0x55; // Записываем 55h по адресу ААААh
насчёт того как скомпилить - не скажу, кури документацию.
чёйто не требуется? Под контроллеры пишешь - постоянно так делаешь. Особливо под те, что порты и память не различают - ARM. Да и для AVR тоже можно.
Только там обычно делают грамотно.
Определяют макрос типа:
#define MEMORY_REGISTER (*(unsigned char*)0xABCD)
А потом можно записать в эту ячейку:
MEMORY_REGISTER = 5;
Или считать значение ячейки:
unsigned char d = MEMORY_REGISTER;
Например (для спека) очистка экрана:
Это учёбный пример, быстрее и короче очистить экран так:Код:#define SCREEN ((unsigned char*)0x4000)
#define SCREENL 6912
void cls(){
unsigned char* begin_scr = SCREEN;
unsigned int i;
for(i=0; i<SCREENL; i++){
*(begin_scr++) = 0;
}
}
Код:#include <string.h>
memset((void*)0x4000, 0, 6192);
Не обязательно. printf выводит символы при помощи функции putchar. Напиши свой putchar и будет вывод куда угодно и как угодно:)
Я б с радостью бы написАл. Но я не знаю как компилировать этой штукой.
И не знаю компилирует ли она в асм или непосредственно в машинный код.
Вот и решил спросить тех, кто знаком с данным компилятором.
---------- Post added at 07:22 ---------- Previous post was at 07:21 ----------
Именно про такой "хыллоу ворлд" я спрашивал.
ALKO, покопайся в исходниках EvoSDK. там на этом SDCC игры можно писать ;) и часть необходимых функций для работы на спеке реализована (правда с упором на 16С и прочие фенечки Эвы и АТМ).
с чего так долго? трудно писать код на z80?
есть исходники как минимум двух игр: xonix (идет в комплекте) и innsmouth
Практически любой компилятор си компилирует в асм, а потом ассемблирует полученное каким-нибудь ассемблером. Промежуточный ассемблерный листинг можно вытащить (ключ -S), но ассемблер у sdcc свой, и по синтаксису он несовместим ни с одним из известных мне спектрумских.
Не сработает, у sdcc нет либы для поддержки спектрума.Цитата:
printf
Я в какой-то теме писал когда-то простой хелло ворлд, счас поищу.
Вот - http://zx.pk.ru/showpost.php?p=471807&postcount=7
скажите для начала, какой из этих экзешников запускать, что б вписать туда код?
и как скомпилировать?
sz80.exe
sdldz80.exe
sdasz80.exe
notepad.exe
см. мою ссылку, там есть командная строка на компиляциюЦитата:
и как скомпилировать?
---------- Post added at 18:38 ---------- Previous post was at 18:33 ----------
что помню из отличий:
"xor a, a" вместо "xor a", "or a,c" вместо "or c" (то же для or, and, add, adc etc)
все числа начинаются с # - #0x01, #19
это все легко менять sed'ом, но там еще какие-то метки тоже предваряются #, с этим похуже
Чего-то он ругается.
http://piccy_.info/view3/3470895/3d3...af06e7fea9c05/
Скорее всего ты держишь файл блокнотом или чем-то.
Тьху ты блин. У тебя файл на рабочем столе. А запускаешь компилятор из левой папки. Он ищет файл в текущем каталоге, и не находит.
Скопируй файл куда-то, типа D:/sourse/helloword1/ . Потом из папки где лежат исходники вызови ту строку.
Папку с компилятором пропиши в пути (если он вызывается и так - то не надо).
так-с... скомпилировал.
Но утилиты hex2bin там нету.
вот результат компиляции.
Скрытый текст
Код:;--------------------------------------------------------
; File Created by SDCC : free open source ANSI-C Compiler
; Version 3.1.0 #7066 (Nov 22 2011) (MINGW32)
; This file was generated Fri Sep 14 18:46:58 2012
;--------------------------------------------------------
.module hello
.optsdcc -mz80
;--------------------------------------------------------
; Public variables in this module
;--------------------------------------------------------
.globl _cls
;--------------------------------------------------------
; special function registers
;--------------------------------------------------------
;--------------------------------------------------------
; ram data
;--------------------------------------------------------
.area _DATA
;--------------------------------------------------------
; overlayable items in ram
;--------------------------------------------------------
.area _OVERLAY
;--------------------------------------------------------
; external initialized ram data
;--------------------------------------------------------
;--------------------------------------------------------
; global & static initialisations
;--------------------------------------------------------
.area _HOME
.area _GSINIT
.area _GSFINAL
.area _GSINIT
;--------------------------------------------------------
; Home
;--------------------------------------------------------
.area _HOME
.area _HOME
;--------------------------------------------------------
; code
;--------------------------------------------------------
.area _CODE
;hello.c:4: void cls(){
; ---------------------------------
; Function cls
; ---------------------------------
_cls_start::
_cls:
;hello.c:7: for(i=0; i<SCREENL; i++){
ld de,#0x4000
ld bc,#0x1B00
00103$:
;hello.c:8: *(begin_scr++) = 2;
ld a,#0x02
ld (de),a
inc de
dec bc
;hello.c:7: for(i=0; i<SCREENL; i++){
ld a,b
or a,c
jr NZ,00103$
ret
_cls_end::
.area _CODE
.area _CABS
[свернуть]
Что делать дальше?
Удалить директивы и запихивать в эмулятор этот блок
?Скрытый текст
ld de,#0x4000
ld bc,#0x1B00
00103$:
;hello.c:8: *(begin_scr++) = 2;
ld a,#0x02
ld (de),a
inc de
dec bc
;hello.c:7: for(i=0; i<SCREENL; i++){
ld a,b
or a,c
jr NZ,00103$
ret[свернуть]
---------- Post added at 18:59 ---------- Previous post was at 18:55 ----------
только вот это jr NZ,00103$ мне не нравится... нужно строго указывать org для данной проги.
---------- Post added at 19:04 ---------- Previous post was at 18:59 ----------
ещё в таком присвоении значения регистровым парам асм-компилятор(emuZwin'a) находит синтаксическую ошибку
Меняю наЦитата:
ld de,#0x4000
ld bc,#0x1B00
- всё равно не правильно.Цитата:
ld de,H4000
ld bc,H1B00
нет там ORG как класса, весь код на выходе релоцируемый
размещает по нужным адресам его линкер, и --code-loc=0x9c40 в команде компиляции - это как раз указание линкеру куда класть код
hex2bin под винду вот - http://gnuwin32.sourceforge.net/packages/hex2bin.htm
бинарник получился. но для чего он нужен?
При открытии эмулятором срабатывает usr0.
их-хи-их-ихииихии....
ALKO, не слушайте их, это закоренелые... эмммм... спектрумисты ;) Они не сказали Вам, что для SDCC в поставке среды ZXDev есть прекрасная библиотека Basic, которая отлично подходит для новичков. Она реализует практически все команды Spectrum-Basic: BORDER, INK, PAPER, CLS, PLOT, DRAW, PRINT, PAUSE, RND, BEEP, POKE/PEEK и т.д.
Поэтому единственно правильный способ для новичка приступить к изучению SDCC:
- Качаем ZXDev, запускаем BlackBox.exe
- Открываем File->Open->ZXDev/Mod/TinyHello.odc
- Нажимаем F11 (компиляция)
- Запускаем ZXDev/TinyHello.bat (линковка)
- Открываем TinyHello.trd в любимом эмуле. Это будет первая ваша программа в чистом машинном коде размером в 45 байт!
- Забываем Си как страшный сон, начинаем изучать Оберон...
В настройках - компиляторы, там есть кнопка автодетект, сам путя найдет. Еще лучше прописать путь к SDCC bin в PATH, для постбилдинг удобно, что бы из Code::Blocks можно было сразу образы собирать и тд.
Пример проектов Сode::Blocks на C SDCC для Z80 можно посмотреть в сырках Speccy 2007 и если не ошибаюсь в Speccy2010. Там настройки можно посмотреть, как бинарник сразу делают итд.
Code::Blocks сам генерит make файлы, и пересобирает только изменившиеся файлы, удобно при тормозах SDCC 3.2
Кроме того, существует проект создания интегрированной среды SDCC+ProgrammersNotepad. Это единственный в мире :) проект для SDCC, в котором поддерживается отладчик прямо из GUI (можно на экране прошагать программу, причем с вотчами). Во всех остальных проектах интеграции реализован только вызов компилятора из редактора. Правда пока что отладчик только для режима Ориона (т.к. отладчик шагает "в реальной железке") и сама среда несколько недопилена (нету нормального make - из ГУЯ пересобирается только файл на который укажешь и то что в него явно включается по include, не поддерживается сборка библиотек и линковка с библиотеками). Но если вы убедите b2m что это вам надо, то он врядли откажет и допилит таки до варианта когда в этой среде станет можно собирать серьезные проекты (для helloword она прекрасно подходит уже сейчас) и сделает отладку "внутри Спека".
Я там педалировал тему с SDCC и Орионом, но после того как убедился что SDCC по-прежнему глючня-глючнёй, бросил. Попробуйте теперь вы.
SDCC всегда прикручивает во время линковки стандартный crt0.o файл. Это инициализатор программы. И он ВСЕГДА должен лежать с адреса 0x0000.
Опция --code-loc перемещает весь код КРОМЕ того, что содержится в crt0.o
По-хорошему - чтобы вся программа переместилась в нужные адреса необходимо написать свой crt0.o и прицепить его во время линковки.
Так что просто скомпилировать не получится.
В общем инструкция. Имеется файл. на С (например cls.c)
Имеется файл crt0.s
В файле crt0.s после ORG указываем адрес начала программы. (START)
При линковке - указываем опции --code-loc START+6 --data-loc 0.
Для нашего примера (пусть стартовый адрес - 0x8000, указываем его после ORG в файле crt0.s):
# as-z80 -o crt0.o crt0.s # создаём объектник crt0.o
# sdcc -mz80 --code-loc 0x8006 --data-loc 0 -c cls.c # создаём объектник cls.o
# sdcc -mz80 --code-loc 0x8006 --data-loc 0 --no-std-crt0 cls.o crt0.o -o cls.ihx # линкуем объектники и получаем hex
# hex2bin cls.ihx # получаем бинарник cls.bin
Далее этот бинарник надо загрузить по адресу 0x8000 в спектрум и перейти по этому адресу.
Во вложении - исходники и спиок команд для борки примера в README
читай внимательнее - я написал, что "чтобы вся программа переместилась в нужные адреса необходимо написать свой crt0.o и прицепить его во время линковки".
Эта опция откусывает crt0, но точку входа то всё равно надо задавать - так что отвертется от написания нескольких байт на асме - не удастся)
См. мой пример. Разумеется что всё это на раз автоматизируется.
---------- Post added at 18:45 ---------- Previous post was at 18:25 ----------
Да. Мой crt0 много чего не делает. Например не обнуляет секцию неинициализированных данных, не устанавливает стек и т.п. Так что дописывайте по вкусу)
правда? ты даёшь гарантию, что процедуры будут размещены в памяти именно в том порядке, как ты их описываешь? стандарт С такого не описывает.
То что такой вариант работает сейчас - я в курсе.
Но самое правильное - свой crt0.o с секцией ABS, которая гарантированно будет расположена там где сказано.
---------- Post added at 23:08 ---------- Previous post was at 22:24 ----------
Кстати, если по-нормальному использовать C - то надо как минимум make и желательно - Unix ну или на худой конец cygwin с bash и утилитами....
Иначе - гемор с автоматизацией полный.