PDA

Просмотр полной версии : Библиотека Си для Апогея.



vinxru
16.12.2012, 00:06
Я тут придумал грамотно оформить функции для компилятора 8080. И сразу встал вопрос с названиями. Общих функций у стандартной библиотеки Си и у Апогея оказалось на так много.

Пока что вот моё предложение. Мои мысли. Принимаю критику :)

Мне нравится писать loadTape, но если подобная функция есть в Си, то пишем её как в Си. То есть исключительно маленькими буквами и хрен поймешь что. (_tcscmp например)



// Коды клавиш

#define KEY_LEFT 8
#define KEY_RIGHT 0x18
#define KEY_UP 0x19
#define KEY_DOWN 0x1A
#define KEY_SPACE 0x20

// BIOS компьютера 86РК

char reboot() = "86rk/reboot.c"; // F800 Перезагрузка
char getch() = "86rk/getch.c"; // F803 Ввод символа с клавиатуры с ожиданием
char getTape(char syncFlag) = "86rk/gettape.c"; // F806 Чтение байта с магнитофона (FF - с поиском синхробайта, 08 - без поиска синхробайта)
void putch(char c) = "86rk/putch.c"; // F809 Вывод символа на экран
void putTape(char c) = "86rk/puttape.c"; // F80C Запись байта на магнитофон
char kbhit() = "86rk/kbhit.c"; // F812 Опрос состояния клавиатуры (FF - ни одна клавиша не нажата)
void puthex(char) = "86rk/puthex.c"; // F815 Вывод на экран 16-ричного числа
void puts(const char*) = "86rk/puts.c"; // F818 Вывод на экран текстовой строки
char bioskey() = "86rk/bioskey.c"; // F81B Опрос состояния клавиатуры 2 (FF - ни одна клавиша не нажата, FE - нажата клавиша РУС/ЛАТ, иначе A - код клавиши)
int wherexy() = "86rk/wherexy.c"; // F81E Запрос положения курсора(Н - номер строк, L - номер позиции)
char getCharFromCursor() = "86rk/getcharfromcursor.c"; // F821 Запрос символа под курсором
void loadTape(void* start) = "86rk/loadtape.c"; // F824 Чтение блока с магнитофона (НЕ ВСЕ АРГУМЕНТЫ ВОЗВРАЩАЮТСЯ)
void saveTape(void* start, void* end, int crc) = "86rk/savetape.c"; // F827 Вывод блока на магнитофон
int crcTape(void* start, void* end) = "86rk/crctape.c"; // F82A Подсчет контрольной суммы блока
void initVideo() = "86rk/initvideo.c"; // F82D Инициализация видеоконтроллера
int getMemTop() = "86rk/getmemtop.c"; // F830 Запрос верхней границы доступной памяти
void setMemTop(int) = "86rk/setmemtop.c"; // F833 Установка верхней границы доступной памяти

// Расширение BIOS компьютера Апогей БК01

void putTapeMSX(char c) = "apogey/puttapemsx.c"; // F003 Запись байта в формате MSX на магнитофон
int getTapeMSX() = "apogey/gettapemsx.c"; // F006 Чтение байта в формате MSX с магнитофона (если была ошибка, то H=1)
void saveTapeMSX(void* start, void* end) = "apogey/savetapemsx.c"; // F009 Запись блока в формате MSX на магнитофон
char loadTapeMSX(void* start, void* end) = "apogey/loadtapemsx.c"; // F00С Чтение блока в формате MSX с магнитофона (если была ошибока, то результат не ноль)
void putTapeLongMarkerMSX() = "apogey/puttapelongmarkermsx.c"; // F00F Запись длинного маркера MSX
void putTapeShortMarkerMSX() = "apogey/puttapeshortmarkermsx.c"; // F012 Запись коротного маркера MSX
void getTapeLongMarkerMSX() = "apogey/gettapelongmarkermsx.c"; // F015 Чтение длинного маркера MSX

// Эмуляция стандартной библиотеки Си

char wherex() = "86rk/wherex.c"; // F81E Положение курсора по оси X = (char)wherexy()
char wherey() = "86rk/wherey.c"; // F81E Положение курсора по оси Y = (char)(wherexy()>>8)
void gotoxy(char,char) = "86rk/gotoxy.c"; // F809 Переместить курсор в коодринаты = putch(0x1B, 'Y', y+0x20, x+0x20)
void clrscr() = "86rk/clrscr.c"; // F809 Очистить экран = putch(0x1F)




#define SET_SOUND(CH, FREQ) { ((uchar*)0xEC00)[CH] = (uchar)(FREQ); ((uchar*)0xEC00)[CH] = (FREQ)>>8; }

#define MUTE_SOUND(CH) { *(uchar*)0xEC03 = ((CH)==0 ? 0x3E : ((CH)==1 ? 0x7E : 0xBE)); }




void apogeyScreen0 () = "apogey/apogeyscreen0.c"; // 64x25, атрибут это пробел, BPL=78, без EOL, с межстрочным отступом, без экономии, совместим с монитором
void apogeyScreen0b() = "apogey/apogeyscreen0b.c"; // 64x25, 0-5 скрытых атрибут, BPL=78, EOL, с межстрочным отступом, без экономии, совместим с монитором
void apogeyScreen1 () = "apogey/apogeyscreen1.c"; // 64x25, атрибут это пробел, BPL=78, без EOL, совместим с монитором, без экономии
void apogeyScreen1b() = "apogey/apogeyscreen1b.c"; // 64x25, 0-5 скрытых атрибут, BPL=78, EOL, совместим с монитором, без экономии
void apogeyScreen2a() = "apogey/apogeyscreen2a.c"; // 64x30, атрибут это пробел, BPL=75, EOL
void apogeyScreen2b() = "apogey/apogeyscreen2b.c"; // 64x30, 0-5 скрытых атрибут, BPL=78, EOL, использует основное ОЗУ
void apogeyScreen2c() = "apogey/apogeyscreen2c.c"; // 64x30, 16 скрытых атрибут, BPL=94, без EOL, использует основное ОЗУ
void apogeyScreen3a() = "apogey/apogeyscreen3a.c"; // 64x51, атрибут это пробел, BPL=75, EOL, использует основное ОЗУ
void apogeyScreen3b() = "apogey/apogeyscreen3b.c"; // 64x51, 1-5 скрытых атрибут, BPL=78, EOL, использует основное ОЗУ
void apogeyScreen3c() = "apogey/apogeyscreen3c.c"; // 64x51, 16 скрытых атрибут, BPL=94, без EOL, использует основное ОЗУ

// функции вывода текста на экран

void print(uchar x, uchar y, char* text) = "apogey/print.c";
void printn(uchar x, uchar y, char* text, uchar len) = "apogey/printn.c";
void printcn(uchar x, uchar y, char c, uchar len) = "apogey/printcn.c";

// Ожидание КСИ

void waitHorzSync() = "apogey/waithorzsync.c";

SpecialistMK87
16.12.2012, 06:25
чаще всего в Си названия функций делают маленькими буквами, слова разделяются подчеркиваниями
например, load_tape()
слова желательно не сокращать или сокращать понятно

vinxru
16.12.2012, 14:10
ИМХО name_name больше относится к ядру Linux. Ядро же Windows использует имена NameName.

А в библиотеках стандартного Си нет почти ни подчеркаваний в центре, ни заглавных букв.

SpecialistMK87
16.12.2012, 16:58
четких стандартов нет, все на усмотрение автора. На фирмах обычно выпускают стандарт предприятия с требованиями - в том числе выбирают NameName или name_name :) Чтобы код сотрудников легче сопровождать было
У меня лежит два неисправных Апогея, появилась желание поскорее починить. А под какой компилятор библиотеки?

vinxru
16.12.2012, 17:21
Под свой. Я его сильно оптимизирую под 8080 архитектуру, поэтому даже в Си есть некоторые отличия.