HP 50g и C++

Пакет HPGCC для разработки программ калькуляторов серии HP 48, HP 49, HP 50g на языке Си может также с небольшими изменениями настроек использоваться для программирования на C++.

Вначале необходимо скачать и установить пакет для разработки (http://sourceforge.net/projects/hpgcc/). В него входят компиляторы GNU, библиотеки, заголовочные файлы, исходники и собственно простая среда разработки на базе Programmer Notepad. Качаем здесь: Windows, Linux.

Предположим, вы установили пакет в каталог C:\HPGCC. В корне лежит файл "Default_Makefile". Сделаем его резервную копию, затем запустим нашу среду (Start -> HPGCC 2.0 for Windows -> HPGCC Programmer's Notepad) и откроем в ней Default_Makefile-файл. Делаем замену ".c" на ".cpp", а к опциям компилятора (строка 66, ARM_ELF_CFLAGS=...) добавляем "-fno-rtti -fno-exceptions" и сохраняем.

Создаем в среде новый файл, скопируем в него текст из примера "Hello, world!" (examples\hiworld.c). Сделаем небольшие изменения: обернем include главного заголовочного файла.

#ifdef __cplusplus
#define size_t long unsigned int
extern "C" {
#endif
#include <hpgcc49.h>		// the standard HP lib
#ifdef __cplusplus
}
#endif

Разумеется, есть способы поэлегантнее, например, внести эту обвязку в отдельный заголовочный файл вроде hpcpp.h, включая его в свои исходники. В рамках нашего обзора это не столь уж и важно.

Сохраняем файл под именем, например, hello2.cpp и жмем Ctrl+F7. Компиляция и сборка проходят успешно.

Теперь проверим "сиплюсплюснутость". Добавим перед основной функцией простенький класс.

class MyClass
{
public:
	MyClass() {}
	void SayHello()  { printf("Hello, World!"); }
};

Однако, попытка компоновки вызывает ошибку: не определены основные операторы работы с памятью в Си++: new и delete.

Это понятно, т.к. компоновать нужно с С++-библиотеками типа libsupc++.a или libstdc++.a. Первая из них доступна на том же сайте HPGCC, но пока не входит в пакет и является неофициальной.

Тем не менее, разработчики подсказывают, что если просто руками добавить соответствующие операторы, то выделение памяти будет работать и в существующем пакете.

Добавляем операторы перед нашим классом. Полный текст программы будет выглядеть так.

#define TINY_PRINTF

#ifdef __cplusplus
#define size_t long unsigned int
extern "C" {
#endif
#include <hpgcc49.h>		// the standard HP lib
#ifdef __cplusplus
}
#endif

void * operator new(size_t size)
{
	void *ptr = malloc(size);
	return ptr;
}

void * operator new[](size_t size)
{
	void *ptr = malloc(size);
	return ptr;
}

void operator delete(void *p)
{
	free(p);
}


class MyClass
{
public:
    MyClass() {}
    void SayHello()  {printf("Hello, World!");}
};

int main(void)
{
    clear_screen();
    MyClass *hello = new MyClass();
    hello->SayHello();
    WAIT_CANCEL;  // loop until ON pressed
    delete hello;
}

После компиляции и компоновки в каталоге исходного файла должен появиться "hello2.hp" для выполнения на конечном устройстве.

Если физического устройства нет, можно воспользоваться мощным эмулятором ПМК серии HP-48/49/50 под названием Debug4x, детально показывающим даже внешний вид калькулятора. Его можно загрузить на сайте разработчиков (англ.яз.): http://www.debug4x.com. Эмулятор, кстати, написан на Delphi.

Комментарии

Интересно. Еще не пробовал на своем 50g? ..

Да, работает. Сначала единовременно загружаем монитор - библиотеку SETUP.BIN, потом в ней набираешь имя программки и запускаешь. К сожалению, не смог сделать скриншот, т.к. клавиша ON задействована в качестве выхода.

Однако, сам факт работы C++-программы на калькуляторе радует :) Можно программировать общую логику в привычном стиле MVC (model и controller), а интерфейс (view) реализовывать специфично для каждого устройства.

P.S. Размер "Hello World" получился 6402 байта. В файле замечен многочисленный мусор типа кучи строк "HP-GCC ROCKS! http://hpgcc.org" :) Наверняка опциями компилятора можно все это убрать и оптимизировтаь по размеру раза в три, хотя для HP-50 6 Кбайт и за размер не считается.

6 Кб за Hello World - ну, терпимо :). Скорее всего, дальнейший рост размера программ будет не такой большой.

А какой будет размер кода без printf? (например, что-нибудь типа
int c,a = 1, b = 2;
c = a + b;

Без printf, но с классом (заменел printf на твой кусок кода) размер 4778 байт.

Разумеется, последующий рост будет нелинейным, т.к. вначале компонуются куски из базовых библиотек, многократно потом используемые.

P.S. Hello из примеров компилируется на чистом си с установками по умолчанию в 6326 байт. Т.е. overhead плюсов практически никакой. Не мудрено, т.к. отключены RTTI и Exceptions

Ждём. Собственно, я написал, что ждём хотя бы одной полезной переносимой программы. :-) Но читайте тред полностью, он интересен.

Комментарий был перемещен и теперь находится здесь.

Пусть ожидающие оставят конкретные заявки. Оформлять их следует по ГОСТ 34.602-89

HP-48/49/50 поддерживает уникод? Чтобы по-русски писать в сообщениях

Насколько я знаю, поддержки юникода нет, используется обычная ASCII-система из 255 символов. Таблицу символов текущего шрифта можно посмотреть командой RSHIFT CHARS. Сам шрифт можно выбрать в настройках: 3 встроенных системных разных размеров или загрузить из файла. Встроенные базовые функции работы с символами и строкам также имеются на уровне входного пользовательского языка (User RPL). На системном (System RPL) есть команды управления шрифтами.

Нет. Не поддерживает Unicode. Более того, даже русского алфавита там нет.

Комментарий был перемещен и теперь находится здесь.

сайт hpgcc.org помер.

У проекта есть меcто на SF: http://sourceforge.net/projects/hpgcc/

Так там только файлы компилятора, а все ссылки на hpgcc.org которые Вы указали в http://pmk.arbinada.com/node/459 умерли. :(

Разве? В пакет включено все: среда, компилятор и библиотеки, примеры и документация.