sh-elf-gcc -ml -Wl,-Ttext,0x8c010000 -nostartfiles -nostdlib -e _start prog.c -o prog.elf -lgcc
sh-elf-objcopy -O binary prog.elf prog.bin
scramble prog.bin 1ST_READ.BIN
PS: убунту подойдет для девелопмента?
скачай DDEr4 и не парь себе мозг с линуксом. Поставишь все оттуда и сможешь программировать для дрима под Windows. Там есть примеры которые просто разобрать и изменитьпод свои нужды. Сборка программ делается через Makefile. После сборки появляется elf-файл (это универсальный формат для объектных и исполнимых файлов для разных ОС и устройств, в том числе и для Дрима), этот файл легко конвертировать через 1st_read.bin checker в bin и запустить на дриме или на эмуле.
Да токо оно кучу ошибок выдает.
Сплошные проблемы у тебя... Не судьба

Ошибки анализируешь и смотришь что их провоцирует.
Ничего там сложного нет.
Да Rio, если ты не научишься фиксить ошибки, у тебя никогда ничего не получится

Сват, ну я же не настолько дурак)) Естессно, я фиксю их. Но после двадцатого запроса в гугл, нечто на подобии, "Kallisti Os errors" или "KOS errors list", и не находя нужного ответа, уже как-то, честно, опускаются руки))
Хмм что то ты не то ищешь... Что у тебя за ошибки вообще?
Так ты ничего не скомпилишь. Если уж нужно скомпилировать отдельный файл, то используй это:
kos-cc -o prog.elf prog.c
а вообщето заходи в папку /usr/local/dc/kos/kos/examples/dreamcast
печатай:
make
Так ты соберешь примеры. Если все правильно соберется то найди пример поменьше и попробуй переделать его. Там вроде есть что-то типа Hello world вот с него и начни.
Цитата:Так ты ничего не скомпилишь.
Почему?
Цитата:kos-cc -o prog.elf prog.c
Откуда ты узнал что компилить надо именно так?
Цитата:Там вроде есть что-то типа Hello world вот с него и начни.
Конечно. Я уже пробовал. Он не работает.
1) Потому что sh-elf-gcc - это голый компилятор, который не знает где лежать хэдеры и либы, А kos-cc - это врепепер, которий создан специально для того чтобы упростить компиляцию. Узнать о нем можно посмотрев в файлы environ*.sh.
2) Так компилятся программы через gcc компилятор. Не уверен что собранная таким образом программа заработает на дриме, тем более что там еще нужно указывать кучу библиотек. Это я так для примера показал.
3) Если у тебя это не работает, то скорей всего ты не зашел в папки .../kos/kos и /kos/kos-ports и не ввел там make. Или же ты не выполнил команду source environ.sh находясь в папке .../kos/kos, которую нужно выполнять каждый раз при запуске Cygwin.
Если ничего из этого тебе не поможет то скинешь скриншот ошибки, которая возникает при попытке собрать hello.
Суда по ошибке, у тебя не загружен environ.sh
Его можно прописать в /etc/profile вместо строки:
Напиши:
Код:
cd /usr/local/dc/kos/kos
./environ.sh
После этого при запуске консоли cygwin, ты будешь находится в нужной папке с выставленными параметрами для компиляциями.
Заходишь в директорию examples/dreamcast/hello и пишешь make. Если собралось, можешь дальше экспериментировать с этим примером.
Да и кстати, если ты все устанавливал сам, а не с готового установщика, то файл environ.sh нужно взять из doc и сконфигурять в нем пути. Но судя по скриншоту он у тебя уже есть.
PHP код:
# base-files version 4.0-6
# /etc/profile: executed by the command interpreter for login shells.
# The latest version as installed by the Cygwin Setup program can
# always be found at /etc/defaults/etc/profile
# Modifying /etc/profile directly will prevent
# setup from updating it.
# System-wide profile file
# Some resources...
# Customizing Your Shell: http://www.dsl.org/cookbook/cookbook_5.html#SEC69
# Consistent BackSpace and Delete Configuration:
# http://www.ibb.net/~anne/keyboard.html
# The Linux Documentation Project: http://www.tldp.org/
# The Linux Cookbook: http://www.tldp.org/LDP/linuxcookbook/html/
# Setup some default paths. Note that this order will allow user installed
# software to override 'system' software.
# Modifying these default path settings can be done in different ways.
# To learn more about startup files, refer to your shell's man page.
PATH="/usr/local/bin:/usr/bin:${PATH}"
MANPATH="/usr/local/man:/usr/share/man:/usr/man:${MANPATH}"
INFOPATH="/usr/local/info:/usr/share/info:/usr/info:${INFOPATH}"
# Set the user id
USER="$(id -un)"
# TMP and TEMP are defined in the Windows environment. Leaving
# them set to the default Windows temporary directory or unset
# can have unexpected consequences.
unset TMP TEMP
TMP="/tmp"
TEMP="/tmp"
# Define default printer
p='/proc/registry/HKEY_CURRENT_USER/Software/Microsoft/Windows NT/CurrentVersion/Windows/Device'
if [ -e "${p}" ] ; then
read -r PRINTER < "${p}"
PRINTER=${PRINTER%%,*}
fi
unset p
# Default to removing the write permission for group and other
# (files normally created with mode 777 become 755; files created with
# mode 666 become 644)
umask 022
# Here is how HOME is set, in order of priority, when starting from Windows
# 1) From existing HOME in the Windows environment, translated to a Posix path
# 2) from /etc/passwd, if there is an entry with a non empty directory field
# 3) from HOMEDRIVE/HOMEPATH
# 4) / (root)
# If the home directory doesn't exist, create it.
if [ ! -d "${HOME}" ]; then
if mkdir -p "${HOME}"; then
echo "Copying skeleton files."
echo "These files are for the users to personalise their cygwin experience."
echo
echo "They will never be overwritten nor automatically updated."
echo
cd /etc/skel || echo "WARNING: Failed attempt to cd into /etc/skel!"
/usr/bin/find . -type f | while read f; do
fDest=${f#.}
if [ ! -e "${HOME}${fDest}" -a ! -L "${HOME}${fDest}" ]; then
/usr/bin/install -D -p -v "${f}" "${HOME}/${fDest}"
fi
done
unset fDest
else
echo "${HOME} could not be created."
{ [ -d "${TEMP}" ] && HOME="${TEMP}"; } ||
{ [ -d "${TMP}" ] && HOME="${TMP}"; } ||
{ [ -d /tmp ] && HOME=/tmp; } ||
HOME=/
echo "Setting HOME to ${HOME}."
fi
fi
# Make sure we start in home unless invoked by CHERE
if [ ! -z "${CHERE_INVOKING}" ]; then
unset CHERE_INVOKING
else
cd "${HOME}" || echo "WARNING: Failed attempt to cd into ${HOME}!"
fi
# Shell dependent settings
profile_d ()
{
saved_LC_COLLATE=${LC_COLLATE}
LC_COLLATE=C
for file in /etc/profile.d/*.$1; do
[ -e "${file}" ] && . "${file}"
done
LC_COLLATE=${saved_LC_COLLATE}
unset saved_LC_COLLATE
}
if [ ! "x${BASH_VERSION}" = "x" ]; then
HOSTNAME=$(/usr/bin/hostname)
profile_d sh
[ -f "/etc/bash.bashrc" ] && . "/etc/bash.bashrc"
elif [ ! "x${KSH_VERSION}" = "x" ]; then
typeset -l HOSTNAME=$(/usr/bin/hostname)
profile_d sh
PS1=$(print '\033]0;${PWD}\n\033[32m${USER}@${HOSTNAME} \033[33m${PWD/${HOME}/~}\033[0m\n$ ')
elif [ ! "x${ZSH_VERSION}" = "x" ]; then
HOSTNAME=$(/usr/bin/hostname)
profile_d zsh
PS1='(%n@%m)[%h] %~ %% '
elif [ ! "x${POSH_VERSION}" = "x" ]; then
HOSTNAME=$(/usr/bin/hostname)
PS1="$ "
else
HOSTNAME=$(/usr/bin/hostname)
profile_d sh
PS1="$ "
fi
export PATH MANPATH INFOPATH USER TMP TEMP PRINTER HOSTNAME PS1
# Check to see if mkpasswd/mkgroup needs to be run try and cut down the emails
# about this on the lists!
#
# The following are the conditions under which the group name special cases
# will appear (where uid and gid are the effective user and group ids
# for the current user, and pgsid is the primary group associated with the
# SID for the current user):
# mkpasswd:
# gid is not in /etc/group
# uid is not in /etc/passwd
# passwd/group_GID_clash(<gid>/<pgsid>):
# gid is not in /etc/group
# uid is in /etc/passwd
# pgsid is in /etc/group (and does not match gid)
# mkgroup:
# gid is not in /etc/group
# uid is in /etc/passwd
# pgsid is not in /etc/group
#
# If this message keeps appearing and you are sure it's a mistake (ie, don't
# email about it!), comment out the test below.
case "$(id -ng)" in
mkpasswd )
echo "Your group is currently \"mkpasswd\". This indicates that your"
echo "gid is not in /etc/group and your uid is not in /etc/passwd."
echo
echo "The /etc/passwd (and possibly /etc/group) files should be rebuilt."
echo "See the man pages for mkpasswd and mkgroup then, for example, run"
echo
echo "mkpasswd -l [-d] > /etc/passwd"
echo "mkgroup -l [-d] > /etc/group"
echo
echo "Note that the -d switch is necessary for domain users."
;;
passwd/group_GID_clash* )
echo "Your group is currently \"passwd/group_GID_clash(gid/pgsid)\". This"
echo "indicates that your gid is not in /etc/group, but the pgsid (primary "
echo "group associated with your SID) is in /etc/group."
echo
echo "The /etc/passwd (and possibly /etc/group) files should be rebuilt."
echo "See the man pages for mkpasswd and mkgroup then, for example, run"
echo
echo "mkpasswd -l [-d] > /etc/passwd"
echo "mkgroup -l [-d] > /etc/group"
echo
echo "Note that the -d switch is necessary for domain users."
;;
mkgroup )
echo "Your group is currently \"mkgroup\". This indicates that neither"
echo "your gid nor your pgsid (primary group associated with your SID)"
echo "is in /etc/group."
echo
echo "The /etc/group (and possibly /etc/passwd) files should be rebuilt."
echo "See the man pages for mkpasswd and mkgroup then, for example, run"
echo
echo "mkpasswd -l [-d] > /etc/passwd"
echo "mkgroup -l [-d] > /etc/group"
echo
echo "Note that the -d switch is necessary for domain users."
;;
esac
cd /usr/local/dc/kos/kos
source environ.sh
вот полный текст моего файла. судя по всему заданная строка в нем уже есть.
при попытке вызвать из консоли команду make пишет ругательное "command not found".
значит ты установил Cygwin не полностью. Ты устанавливал с DDEr4?
Если да то попробуй все переустановить заново, удавлив предварительно все его папки. И нужно щелкнуть при выборе компонентов Cygwin по All - Default, чтобы оно изменилось на All - Install, иначе опять не будет команды make.
Вот еще такой вопрос. Откомпайлил я hello world. В папке, соответсвенно, появилось несколько файлов, в том числе и файл hello.elf огромного (просто таки ужасающего) размера - аж целых 998 Кбайт. Что не мало, согласитесь.
Итак, что мне надо дальше с этим файлом делать? На попытки выполнить из командной строки утилиты elf2bin и scramble интерпретатор отвечает что команды не найдены.
Ну конечно он их не нашел, потому что их там нет.
Замени в Makefile строки:
PHP код:
$(TARGET): $(OBJS)
kos-cc -o $(TARGET) $(OBJS)
На эти:
PHP код:
$(TARGET): $(OBJS)
$(KOS_CC) $(KOS_CFLAGS) $(KOS_LDFLAGS) -o $(TARGET) $(KOS_START) $(OBJS) $(OBJEXTRA) $(KOS_LIBS)
$(KOS_STRIP) $(TARGET)
$(KOS_OBJCOPY) -R .stack -O binary $(TARGET) unscrambled.bin
$(KOS_BASE)/utils/scramble/scramble unscrambled.bin 1ST_READ.BIN
Если у тебя нет утилиты utils/scramble/scramble то закинь туда ее.
Размера файла пугаться не стоит, в нем есть куча ненужно инфы, которая потом удалится с помощью KOS_STRIP. Да и при конвертации в бинарник, он еще немного уменьшится.
Не понял. Еще разочек пожалуйста. Что делать с hello.elf.
Тебе ничего не придется с ним больше делать, когда ты внесешь изменения в Makefile как я сказал.