Add full compiler toolchain, libc, examples and reference docs

First substantive commit: the entire Sprinter C compiler tree on top of
the bare README+gitignore initial commit.

What's in here:
  bin/sprinter-cc        — driver script invoking SDCC + linker + mkexe
  libc/                  — Sprinter-specific libc layer over ESTEX/BIOS
                           (conio, gfx, io, mem, stdio + headers)
  runtime/               — crt0 variants (default/small/banked/minimal)
                           + heap + bank trampolines
  toolchain/             — mkexe (SprintEXE packer, C + tests)
  examples/              — 30 demo programs (gfx, file I/O, env, time, …)
  lib/Makefile           — builds the libc archive (sprinter.lib)
  docs/                  — converted Sprinter manuals + asm reference samples
  third_party/           — solid-c reference compiler dump + sdcc setup script
  release_docs/          — packaging / release notes

gitignore overhaul:
  • Drop dangerous blanket patterns: *.asm (would hide docs/samples/*.asm)
    and *.exe (case-insensitive match was hiding third_party/solid-c/*.EXE
    on macOS APFS).  Replaced with examples/*/*.{asm,exe,…} and lib/*.lib.
  • Restore tracking of toolchain/mkexe/tests/{one,big}.bin — those are
    INPUT fixtures, not build outputs.
  • Collapse the duplicated SDCC/C/Sdcc sections into one section per
    concern (build outputs / vendored / OS-junk).
  • Add .sprinter-cc-*/, build/ (catches lib/build/ too), .claude/.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-03 16:13:21 +03:00
parent f542608b3f
commit c71e249a4e
404 changed files with 75155 additions and 58 deletions
Vendored Symlink
+1
View File
@@ -0,0 +1 @@
sdcc-4.5.0
Vendored Executable
+79
View File
@@ -0,0 +1,79 @@
#!/usr/bin/env bash
# Download and extract a vendored SDCC into third_party/sdcc-<VERSION>/.
# Idempotent: re-running with the same version is a no-op.
set -euo pipefail
VERSION="${1:-4.5.0}"
here="$(cd "$(dirname "$0")" && pwd)"
cd "$here"
uname_s=$(uname -s)
uname_m=$(uname -m)
case "$uname_s" in
Darwin)
archive="sdcc-${VERSION}-x86_64-apple-macosx.tar.bz2"
sf_dir="sdcc-macos-amd64"
if [ "$uname_m" = "arm64" ]; then
echo "Note: macOS binary is x86_64; on Apple Silicon it runs via Rosetta 2."
if ! /usr/bin/arch -x86_64 /usr/bin/true 2>/dev/null; then
echo
echo "Rosetta 2 is not installed. Install it with:"
echo " softwareupdate --install-rosetta --agree-to-license"
echo
echo "Then re-run this script."
exit 4
fi
fi
;;
Linux)
archive="sdcc-${VERSION}-amd64-unknown-linux2.5.tar.bz2"
sf_dir="sdcc-linux-amd64"
;;
*)
echo "Unsupported host OS: $uname_s" >&2
exit 2
;;
esac
dest="sdcc-${VERSION}"
if [ -d "$dest" ] && [ -x "$dest/bin/sdcc" ]; then
echo "SDCC ${VERSION} already vendored at third_party/${dest}"
else
url="https://sourceforge.net/projects/sdcc/files/${sf_dir}/${VERSION}/${archive}/download"
if [ ! -f "$archive" ]; then
echo "Downloading $archive..."
curl -fL -o "$archive.tmp" "$url"
mv "$archive.tmp" "$archive"
else
echo "Using cached $archive"
fi
echo "Extracting..."
rm -rf "$dest"
mkdir -p "$dest"
tar -xjf "$archive" --strip-components 1 -C "$dest"
fi
ln -sfn "$dest" sdcc
echo
echo "Verifying installed toolchain:"
"$here/sdcc/bin/sdcc" --version 2>&1 | head -3 || {
echo
echo "Failed to run sdcc; if you saw 'Bad CPU type' run:"
echo " softwareupdate --install-rosetta --agree-to-license"
exit 3
}
for tool in sdcc sdasz80 sdldz80 sdar sdobjcopy; do
if [ -x "$here/sdcc/bin/$tool" ]; then
echo " found: bin/$tool"
else
echo " MISSING: bin/$tool" >&2
fi
done
echo
echo "Done. Toolchain at: third_party/sdcc -> $dest"
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+22
View File
@@ -0,0 +1,22 @@
#include <stdio.h>
char buffer[4]="AAA";
//char buffer[4]={'A','A','A','A'};
void main()
{
printf("0x%02X\n", *buffer); // (1) не правильно!
printf("0x%02X\n", (char *) *buffer); // (2) правильно
}
Если массив buffer представляет собой char-элементы, то при обращении к нему,
как показано в строке (1), компилятор сгенерирует не тот код, что нам нужно.
При этом, никакой ошибки выдано не будет. Для того, чтобы компилятор сгенери-
ровал правильный код, к отдельному элементу char-массива нужно обращаться так,
как это сделано в строке (2), принудительно указав компилятору через cast-
операцию то, что нам нужно.
При обращении к массиву, состоящему из int-элементов, вышеописанных проблем
не возникает, компилятор генерирует правильный код.
Для более наглядного представления, о чем идет речь, можно просмотреть asm-
листинг, генерируемый компилятором для приведенного выше примера. Для строки
(1) компилятор не сгенерирует код "ld b,0".
+968
View File
@@ -0,0 +1,968 @@
Компилятор языка Си в системе ESTEX
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ВВЕДЕНИЕ
Одной из целей разработки оптимизирующего компилятора SOLID C было создание
инструментального средства, которое позволяет писать и саму операционную сис-
тему, и программное обеспечение для нее. Для достижения этой цели в кодогене-
ратор введены различные дополнительные средства. Так, разработаны средства
автоматического распределения регистров, благодаря которым удалось существенно
повысить эффективность объектного кода. В результате стало возможным писать
на высоко-уровневом языке (которым является Си) даже системы, работающие в
условиях жестких ограничений по памяти и реальному масштабу времени. При этом
почти полностью устранена необходимость программирования на Ассемблере.
Основная цель данного руководства - дать пользователям представление о
применении компилятора в рамках операционной системы ESTEX и некоторых
особенностях этого компилятора.
SOLID C является двухпроходным компилятором языка, преобразующим исходный
си-текст в программу на языке Ассемблера. Компилятор состоит из двух файлов
"cc1.exe" и "cc2.exe", выполняющих соответственно первый и второй проходы.
На первом проходе входной си-текст преобразуется в объектный код (т-код),
сохраняемый в файле с расширением ".tmc" (по-умолчанию). На первом проходе
производятся также диагностика ошибок и выдача предупреждающих сообщений.
На втором проходе полученный т-код преобразуется в ассемблерный листинг,
сохраняемый в файле с расширением ".asm" (по-умолчанию).
Следует отметить тот факт, что поскольку данный компилятор является оптимизи-
рующим, то время, затраченное на компиляцию си-программы возрастает от 2-х и
более раз, по сравнению с обычными (не оптимизирующими) си-компиляторами.
ГЕНЕРАТОР ОБЪЕКТНОГО КОДА
Этот компонент (cc1.exe) компилятора обеспечивает первый проход. Он произ-
водит разбор исходного си-текста, его контроль на допустимость синтаксиса
и семантики. В результате первого прохода появляется промежуточный файл с
объектным кодом, т.н. Т-код. Стандартным расширением имен файлов, содержащих
т-код, является ".tmc".
Команда запуска компилятора первого прохода имеет следующий формат:
CC1 [опция] имя_файла
Имя файла может содержать букву диска и путь, при этом максимальная длина
строки не может превышать 80 символов. Обычно для исходных си-файлов исполь-
зуется расширение ".c". Если расширение входного файла ".c", то его можно
не указывать.
Опции генератора объектного кода
-c В отличие от стандартного языка Си, компилятор SOLID C
обрабатывает гнездование (вложение) комментариев.
Данная опция отключает режим гнездования комментариев.
-dNAME Определить макро-определение с именем "NAME". Между буквой опции
и именем "NAME" пробелы не допускаются.
-e Режим переопределения выдачи сообщений в файл ошибок, имеющего
расширение ".err". Файл создается всегда по текущему пути исходного
".c" файла.
-jN Установка максимального числа ошибок компиляции. Происходит
прерывание компиляции, если число ошибок равно или превышает
"N". Между буквой опции и числом "N" пробелы не допускаются.
Например: -j30 (прерывание процесса компиляции при 30 ошибках).
-k Режим совместимости со стандартным языком Си (стандарт K&R).
Разрешает делать неявные объявления функций и параметров.
Данную опцию необходимо использовать при компиляции "чужых"
исходников.
-m Режим вывода на экран статистики по таблицам компилятора.
-oNAME Задать имя для выходного файла с т-кодом. Максимальная длина
строки полного пути (диск\каталог\имя) файла составляет
80 символов. Между буквой опции и именем "NAME" пробелы не
допускаются.
-rP:S:H Установка отношения размеров частей рабочей области компилятора:
P - пула, S - таблицы символов, H - хеш-таблицы.
По-умолчанию используется соотношение 13:6:4. В случае переполнения
какой-либо части, используйте эту опцию для назначения другого
соотношения частей рабочей области.
Между буквой опции и строкой "P:S:H" пробелы не допускаются.
-x Режим строгой совместимости с MSX-C компилятором. При этом
расширение файла т-кода меняется с ".tmc" на ".tco".
КОДОГЕНЕРАТОР
Кодогенератор (cc2.exe) выполняет второй проход компилятора. Он читает
файл с т-кодом и создает выходной файл на языке Ассемблера.
Команда запуска компилятора второго прохода имеет следующий формат:
CC2 [опция] имя_файла
Если у входного файла с т-кодом расширение не указано, то используется
стандартное расширение ".tmc". Если не указано расширение для выходного
файла - используется расширение ".asm". Максимальная длина строки
"диск\каталог\имя_файла" должна быть не более 64 символов.
Если путь расположения для выходного файла не задан, то по-умолчанию
он создается по текущему пути расположения входного файла т-кода.
Опции кодогенератора
-k Не удалять входной файл т-кода (.tmc) по завершению работы
кодогенератора.
-oNAME Задать имя для выходного asm-файла. Максимальная длина
строки полного пути (диск\каталог\имя) файла составляет
64 символа. Между буквой опции и именем "NAME" пробелы
не допускаются.
-rN Резервирование области под таблицу символов компилятора размером
N байтов (N - десятичный формат). Между буквой опции и числом "N"
пробелы не допускаются. Например: -r2000 (резервируется таблица
символов размером в 2000 байтов).
-uX Определить пост-символ "X" для имен в asm-листинге. По-умолчанию
используется символ "_". Например: -u@ (использовать пост-символ
"@" для имен в выходном asm-листинге).
-q "Тихий" режим. Индикаторы процесса компиляции "---" и "+++"
на экран не выводятся.
ОСОБЕННОСТИ КОМПИЛЯТОРА SOLID C ДЛЯ ОС ESTEX
Как было сказано выше, целью разработки данного Си-компилятора было созда-
ние продукта, с помощью которого можно было бы (пользуясь всеми преимуществами
языка высокого уровня) разрабатывать программы, удовлетворяющие жестким требо-
ваниям реального масштаба времени и ограничений на память. В данной главе опи-
саны особенности компилятора с этой точки зрения. Кроме того, здесь будут даны
рекомендации по программированию на SOLID C.
Компилятор SOLID C может работать в двух различных режимах. Один из них
является "собственным" для данного компилятора, а второй - служит для обеспе-
чения совместимости со стандартом языка Си. В этом режиме все арифметические
преобразования выполняются точно так же, как в стандартном языке Си. Самое
большое различие между этим режимом и "собственным" состоит в том, что в пос-
леднем не выполняются автоматические преобразования форматов при переходах от
типа "char" к типу "int". По-умолчанию, компилятор работает в "собственном"
режиме. Для смены режима работы компилятора служит опция "-k" на первом прохо-
де компилятора.
Собственный режим компилятора
Для данного режима характерны два новых формата: целой константы (intconst)
и символьной константы (charconst). Обычно указанные форматы используются иден-
тично с соответствующими форматами "int" и "char", однако в случаях анализа
типов операндов и выражений, и приведения их к соответствию, указанные два
формата рассматриваются как различные.
Как упоминалось выше, в этом режиме не производится автоматическое преобразо-
вание форматов при переходе от типа "char" к "int". Действуют следующие согла-
шения о преобразованиях типов:
unsigned + ? -> unsigned
int + ? -> int
char + ? -> char
intconst + ? -> intconst
charconst + ? -> charconst
Режим совместимости со стандартом языка Си
Выполняются все арифметические преобразования, действительные в рамках реа-
лизации стандартного языка Си. Единственное различие состоит в том, что компи-
лятор SOLID C интерпретирует тип "char", как значение без знака.
Для этого режима действуют следующие правила преобразования типов:
char -> int
unsigned + ? -> unsigned
int + int -> int
Рекурсивные функции
Как известно, все функции стандартного языка Си рекурсивны. В среде компи-
лятора SOLID C можно писать также и нерекурсивные функции. Для различия
функций этих двух типов введены и зарезервированы следующие ключевые слова:
"recursive" - рекурсивная и "nonrec" - нерекурсивная. Эти ключевые слова
записываются в заголовке функции перед ее именем и служат описателями режимов
ее выполнения. Это показано в следующем примере:
nonrec main()
{
printf("Hello, world!\n");
}
recursive
int factorial(n)
int n;
{
return(n > 1) ? n*factorial(n-1) : 1;
}
int max(a,b)
int a,b
{
return(a > b) ? a : b;
}
В приведенном примере даны определения: нерекурсивной функции main() и
рекурсивной функции factorial(). Для функции max() описатель режима выпол-
нения функции в явном виде не задан, поэтому она будет выполняться так, как
задано по-умолчанию. Обычно по-умолчанию задается режим выполнения функций
как рекурсивных. Однако это умолчание можно изменять с помощью следующих
предложений препроцессора:
#pragma nonrec
#pragma recursive
Первым предложением по умолчанию задается режим выполнения функций, как
нерекурсивных. Второе предложение предписывает рассматривать все функции,
как рекурсивные (если явно не оговорено противоположное).
Для случая, когда действует предложение #pragma, функция max() будет выпол-
няться согласно последнему описателю режимов "рекурсивная/нерекурсивная".
Рекомендуется давать явное указание "nonrec" кампилятору, если нужно, чтобы он
воспринимал функции как нерекурсивные. По такому указанию, компилятор гаран-
тированно сгенерирует объектный код, более короткий и более быстрый, чем в
других случаях. В обычных прикладных программах бОльшая часть функций нерекур-
сивна, поэтому в начале исходного текста следует писать предложения препроцес-
сора: #pragma nonrec
Функции с переменными параметрами
Компилятор SOLID C обрабатывает функции двух типов: с переменным числом
параметров и с фиксированным. В функциях первого типа число и представление
параметров могут изменяться, тогда как в функциях второго типа они фиксированы.
Например, функции printf, scanf и ряд других являются функциями с переменным
числом параметров. В компиляторе SOLID C функции указанных двух типов разли-
чаются с помощью специальных описателей.
Структура предложений языка изменяется с введением простых и абстрактных
описателей следующим образом:
С простым описателем:
идентификатор
(описатель)
*описатель
описатель()
описатель(.)
описатель [константное выражение]
С абстрактным описателем:
пусто
абстрактный описатель
*абстрактный описатель
абстрактный описатель()
абстрактный описатель(.)
абстрактный описатель [константное выражение]
Конструкции "описатель(.)" и "абстрактный описатель(.)" впервые введены
для обозначения функций с переменными параметрами. Конструкции "описатель()"
и "абстрактный описатель()" обозначают функции с фиксированными параметрами.
Данный метод описания функций с переменными параметрами используется в пред-
ложениях типа cast, sizeof. Например, в следующих описаниях функции func и fp
определены, как функции с переменными параметрами:
int func(.), (*fp)(.);
Перед применением функции с переменными параметрами, ее необходимо всякий раз
описывать подобным образом. В библиотеке стандартных функций имеются функции
с переменными параметрами, как например:
printf, fprintf, sprintf, scanf, fscanf, sscanf
Описания перечисленных функций содержатся в стандартном файле "stdio.h".
Вызов функции с переменными параметрами совершенно идентичен вызову функции
с фиксированными параметрами.
Эти функции не обладают мобильностью с точки зрения рабочей машины (главным
образом по методу доступа к параметрам). Отсутствие переносимости имеет место
только для самой функции с переменными параметрами. Внешняя функция, ее вызы-
вающая, является переносимой.
Определение функции с переменными параметрами должно быть записано в самом
начале, перед ее телом. Ниже приведено типичное определение функции func,
являющейся функцией с переменными параметрами:
int func(.); /* это определение обязательно должно идти в начале */
int func(nargs, args)
int nargs, args;
{
...
}
В момент вызова функции с переменными параметрами, вместо фактического
параметра подставляется его копия - осуществляется вызов по значению.
Значением параметра nargs является количество фактических параметров - фикси-
рованная величина. Благодаря ей можно установить, сколько фактических парамет-
ров реально передается в функцию с переменными параметрами со стороны вызыва-
ющей функции. Однако возможности ограничены тем, что можно знать только число
передаваемых параметров. При этом, установить тип каждого из этих параметров
невозможно.
Для того, чтобы организовать доступ к указанным параметрам, нужно описать
каждый из передаваемых при вызове функции параметров. Первый из параметров
(если он имеется) расположен по адресу массива args. Другими словами, значение
первого из параметров args присваивается идентификатору args. Второй из пара-
метров помещается по адресу, сдвинутому в сторону роста адресов памяти. Вообще
можно составить последовательность адресов:
адрес 2-го параметра = адрес args + 2
адрес 3-го параметра = адрес args + 4
В следующей таблице приведено соответствие параметров и их адресов:
________________________________________________
Номер параметра Адрес
________________________________________________
1 Адрес начала массива args
2 Адрес начала + 2
3 Адрес начала + 4
...
n Адрес начала + (n-1)*2
________________________________________________
Согласно соответствию адресов и последовательности параметров, приведенному
в таблице, можно организовать доступ к этим параметрам. Например, для того,
чтобы сослаться на первый и второй параметры типа "char", необходимо написать
в программе:
(char)args - ссылка на первый параметр типа "char"
(char)+(&args+1) - ссылка на второй параметр типа "char"
Примечание: Если в приведенном выше примере args является "int", то благодаря
описанию, значение &args преобразуется в тип "int". Адрес следующего по порядку
аргумента формируется согласно формуле &args+1, в которой константа "1" преоб-
разуется в соответствии с масштабом разрядной сетки конкретной машины: как пра-
вило, это два байта (вообще, можно определить эту величину с помощью выражения
sizeof(int*)). В конкретном случае это дает "адрес начала массива параметров
плюс два". Аналогичным образом можно организовать доступ к параметрам других
типов.
В заключение данного параграфа приведены два примера простых функций с
переменными параметрами: функция sum возвращает значение суммы переменного
числа "int" параметров. Функция cmax возвращает максимальное значение из ряда
"int" параметров в TINY (char), число которых - переменное.
#pragma nonrec
typedef char TINY;
int sum(.);
TINY cmax(.);
int sum(nargs, args)
int nargs, args
{
int i, *p;
for(i=0, p=&args; nargs --;)
i += *p++;
return i;
}
TINY cmax(nargs, args)
int nargs;
TINY args;
{
int *p, max;
for(max=0, p=(int*)&args; nargs--; p++)
if(max < (TINY)*p)
max = (TINY)*p;
return max;
}
Преобразования байтовой арифметики
Для повышения эффективности объектного кода, компилятор SOLID C выполняет
преобразования байтовой арифметики. Благодаря этой особенности, все преобразо-
вания переменных, имеющих тип "char", выполняются не со словами, а с байтами.
Поскольку процессор Z80 с восьмибитовым форматом команд выполняет эти операции
значительно быстрее, нежели другие. Байтовая арифметика особенно эффективна
при написании специальных программ, включающих байтовые преобразования.
Результаты логических операций и операций отношения
&& || ! = != > < >= <=
имеют тип "char".
Традиционно, те байтовые переменные, которые обозначают внешние кодовые
символы, специфицируются с помощью определения типа typedef в виде TINY или
BOOL. Первый определяет арифметические объекты, а второй - логические.
Определения указанных типов включены в файл стандартных заголовков "types.h".
Ниже даны несколько примеров употребления байтовых операций, на которые
следует обратить особое внимание!.
1). Переполнение и исчезновение
При выполнении байтовых арифметических операций, возможны случаи перепол-
нения или исчезновения. Например, в процессе выполнения операторов
int i;
TINY x,y;
x = 10; y = 30;
i = x * y;
вместо правильного значения 300, переменная "i" получает неправильное зна-
чение 44. Это происходит вследствие того, что в процессе выполнения умножения
по правилам байтовой арифметики теряется старший байт результата. Для того,
чтобы получить правильный результат (число 300), нужно оперировать с целыми
операндами, для чего следует специфицировать их с помощью функции cast, как
показано в следующем примере:
i = (int)x * (int)y;
Такое же явление возникает и в следующей ситуации:
i = x << 8 | y;
При выполнении операции сдвига над операндом байтовой длины, может быть
потеряна его часть вследствие переполнения. На это также нужно обратить внима-
ние. Величину "y" необходимо подставить в выражение для "i" в том же самом
виде, что и показано ниже:
i = (unsigned)x << 8 | y;
2). У типа TINY (char) отсутсвует знак числа. Переменные типа "char" исполь-
зуются без знака. Поэтому иногда возникают ситуации, в которых результат опе-
рации вычитания становится отрицательным. Поэтому, если выполнить ниже-следую-
щую программу, в переменную "i" будет записано 255:
int i;
TINY x,y;
x = 2;
y = 3;
i = x - y;
Для того, чтобы получить правильный результат, нужно выполнить эту операцию
в соответствии с типом "int":
i = (int)x - (int)y;
3). Согласование параметров
Компилятор SOLID C проводит четкое различие между типами "int" и "char".
Поэтому фактические и формальные параметры должны быть обязательно согласованы
между собой по типу. Следующий пример иллюстрирует неправильный вызов функции:
func(x)
TINY x;
{
...
}
main()
{
func(1); /* неправильный вызов функции */
}
Нужно изменить вызов следующим образом:
func((TINY)1);
Согласование параметров по типу, компилятором не проверяется. Поэтому,
следует обращать особое внимание на подобные ситуации.
Распределение регистров
Поскольку компилятор SOLID C поддерживает распределение регистровых пере-
менных, он способен генерировать более эффективный объектный код. В стандарт-
ном языке Си предусмотрено размещение непосредственно в регистрах (класс памя-
ти "register") только нескольких первых переменных из всего их множества.
(Какое именно количество регистровых переменных будет помещено в регистры,
зависит от того, какая рабочая машина будет использоваться). В отличие от
стандартного, компилятор SOLID C автоматически выполняет оптимальное распре-
деление регистров, в соответствии с потоком данных. Этим самым снята необхо-
димость обязательного указания переменных программы, как регистровых. Вопрос,
какие из переменных будут помещены в регистры, решается на уровне кодогенера-
ции. Поэтому описание "register" идентично пo смыслу описанию "auto" и никакого
другого смысла не имеет.
В каждой функции программы, первые 16 переменных простого типа становятся
кандидатами на размещение в регистрах, как переменные типов "аuto" или
"register". K числу таких простых типов относятся "int", "char", "unsigned"
и "указатель".
Средствами языка Си можно получать адреса переменных. Компилятор SOLID C
также, безусловно, располагает этими средствами. Однако, в случаях тех перемен-
ных, которые являются объектами распределения регистровой памяти, возникает
проблема. Она обусловлена тем, что как таковой "адрес" регистра не существует.
Например, если написать
int n;
n = 10;
scanf("%d", &n);
printf("%d", n);
и ввести 100, то какое значение получит переменная "n" ?. Конечно, 100.
Компилятор поместит значение переменной по заданному адресу в память, если
указать ему значение этого адреса. Следовательно, никаких проблем не возникнет,
если при вызове функции передать ей в качестве параметра адрес переменной.
Однако в примере
int n;
int *p;
p = &n;
n = 10;
*p = 100;
printf("%d", n);
возможна ситуация, когда в качестве значения переменной "n" будет индициро-
вано не 100, а 10. Между двумя предложениями, одно из которых "n=10", a другое
"printf("%d",n)", не фигурирует "&n". Поэтому компилятор не помещает "n" в па-
мять.
НЕКОТОРЫЕ ДРУГИЕ ОСОБЕННОСТИ КОМПИЛЯТОРА
Таблица представления данных различного типа
-----------------------------------------------------
Тип Разрядность Диапазон значений
-----------------------------------------------------
char 8 0..255
short 16 -32768..32767
int 16 -32768..32767
unsigned 16 0..65535
_____________________________________________________
1. В рамках компилятора SOLID C проводится идентификация переменных и
функций по первым 30-ти символам имени. Благодаря такому расширению имен,
можно использовать легко поддающиеся анализу имена переменных и функций, и
получать удобочитаемые тексты программ.
2. Позиция ошибки диагностируется по номеру ошибочной строки и начальному
символу (колонки в строке). Начальная позиция считается с 0. Таким образом,
позиция первого символа программного текста есть "нулевая строка, нулевая ко-
лонка".
3. Для указания имени включаемого файла используется предложение "#include"
препроцессора, как описано ниже:
<имя файла> - ссылка на файл, расположенный в подкаталоге "INCLUDE"
каталога компилятора.
"имя файла" - ссылка на файл, расположенный по текущему пути исходного
".c" файла.
Задание пути в имени файла не допускается. Например, если имеются предложения
#include <stdio.h>
#include "common.h"
то в первом случае сделана ссылка на стандартный файл компилятора Си, распо-
ложенного в подкаталоге с зарезервированным именем "INCLUDE" каталога SOLID C
(по-умолчанию "SOLID"), а во втором случае - на файл, расположенный по теку-
щему пути входного ".c" файла.
Следует обратить внимание на то, что имя подкаталога "INCLUDE" зарезервировано
и его не следует менять.
4. Типы long, float, double не поддерживаются, но зарезервированы. Поэтому
нельзя использовать слова "long", "float" и "double" в качестве идентифика-
торов переменных и меток.
5. Не поддерживаются битовые поля структур.
6. Некоторые ограничения в константных выражениях. Нельзя включать в
константные выражения указанных ниже типов унарную операцию "sizeof":
a) сразу после оператора "case" (в качестве метки);
b) в описателе массива в качестве его размерности.
Подобные ограничения не действуют на те константные выражения, которые
появляются в инициаторе (т.е. при инициализации).
7. Имеется отличие от стандартного языка Си по эффективным пределам имен
членов структур и объединений (struct & union). В стандартном Си одно и то же
имя члена может появляться в двух различных структурах только в случае, когда
они оба одного типа и имеют одинаковое смещение в обеих структурах. Компилятор
SOLID C воспринимает имя члена так, как принято в Паскале или в Аде. Таким об-
разом, одно и то же имя члена может появляться в разных структурах и будет
правильно обработано компилятором SOLID C.
В качестве примера рассмотрим следующее описание:
struct node {
char *word;
int count;
struct node *next;
} pool[1000], *p;
struct noad {
int atr;
struct noad *next;
} table[10], *q;
В стандартном языке Си данная запись является неправильной, потому, что имя
члена "next" появляется в двух структурах - "node" и "noad", где их типы и сме-
щения не согласованы. Однако в среде компилятора SOLID C эти записи являются
правильными.
Следует обратить внимание на следующую запись
p->next
которая описывает член типа "struct node" (потому что "p" есть указатель типа
"struct node"). Благодаря такому приему можно подбирать правильные члены путем
строгого указания их типов. Так, в операциях "." и "->" левые члены должны быть
указателями структур, включающих члены, записанные в качестве правой части этих
операций. Например:
i->count
включает "i" не как указатель типа "struct node", а как "int" (целое). Поэтому
компилятор SOLID C такую ситуацию не диагностирует. Для того, чтобы получить
такой же результат, необходимо переписать приведенное выражение следующим
образом:
((struct node *)i)->count
В приведенном выше примере для того, чтобы операция "->" была более высокого
ранга, нежели операция "cast", следует терм
(struct node *) i
заключить в скобки.
До того, пока не будет преобразован тип указателя в "int", что выполняется
с помощью функции cast, операция не может быть выполнена.
Даже при выполнении арифметических операций в случае указателей разных ти-
пов, также необходимо использовать функцию cast. Например, в случае описаний
int i;
char *p;
int *q;
операции
p = i;
if(p == i)
q = p;
if(p == q)
будут отмечены как ошибочные.
Две первые ошибочны потому, что производятся подстановки между типами указа-
теля и "int" (целого), и операции сравнения между ними. Две последние также
ошибочны, потому, что несмотря на то, что и "p", и "q" обе являются указате-
лями, но они специфицированы разными типами и поэтому компилятор отметит их,
как ошибочные.
Эти ошибки можно устранить, либо использованием функции cast, либо указанием
опции "-k" на первом проходе компилятора.
С другой стороны, разрешены преобразования типов из целого в указатель и
обратно. Это обусловлено тем, что в языке Си целая константа 0 используется
как указатель особого адреса. Например, запись
char *p;
if(p != 0)
p = 0;
не содержит ошибки.
Типы "int" и указателей нельзя смешивать в среде компилятора SOLID C. Дан-
ное соглашение вообще может считаться показателем хорошего стиля программиро-
вания, при котором отладка программы становится проще.
8. Нет автоматического преобразования между типами "указатель" и "int",
и обратно. В стандартном языке Си разрешены операции сравнения значений указа-
телей и целых (int), но в SOLID C смешивание указанных типов вызовет сообщение
об ошибке. Однако этот режим можно разрешить, указав опцию компилятора "-k"
(на первом проходе).
9. Тип "char" интерпретируется как значение без знака, т.е. может иметь
значение 0..255.
10. В рамках стандартного языка Си, в случаях появления необъявленных ранее
функций, они интерпретируются как возвращающие "int" значение. Параметры
необъявленного типа, которые вошли в список параметров, считаются "int".
Рассматриваемый здесь компилятор не позволяет использовать эти умолчания. То
есть, хороший стиль программирования предполагает описание всех идентификато-
ров до того, как на них будут выполняться ссылки - автоматические ссылки вы-
полняться не будут.
Все объявления, которые относятся к функциям стандартной библиотеки, запи-
саны в файле стандартных заголовков, поэтому любую из стандартных функций можно
использовать без объявления. Поэтому все пользовательские программы должны
содержать ссылку на файл "stdio.h" в самом начале текста, в предложении
#include <stdio.h>.
Однако, если на первом проходе компилятора указать опцию "-k", указанные
описания функций будут объявлены по-умолчанию. От этого теряется качество полу-
чаемого кода, поэтому данной опцией целесообразно пользоваться, если важно
обеспечить совместимость со стандартным языком Си.
11. В данной версии рассматриваемого компилятора не поддерживается предложе-
ние препроцессора "#if". Вполне возможно заменить указанное предложение дру-
гими: "#ifdef" или же "#ifndef". Возможны также другие варианты замены предло-
жения "#if". Рассматриваемый здесь компилятор не генерирует код тех участков
программы, выполнение которых не требуется при ее прогоне. Поэтому можно полу-
чить точно такой же результат, если применить оператор "if" вместо предложе-
ния "#if". Например, можно заменить текст одной из ниже-следующих программ на
другую:
Программа 1:
#if sizeof(FCB) != sizeof(char[36])
Open_MSX();
#else
Open_OTHER();
#endif
Программа 2:
if (sizeof(FCB) != sizeof(char[36]))
Open_MSX();
else
Open_OTHER();
12. Введена директива препроцессора "#pragma". Применяется для различных
указаний компилятору. Все предложения данного вида могут появляться в любом
месте исходной программы. Ниже, в качестве примеров приведены четыре предложе-
ния с заданием соответствующих директив компилятору:
1. #pragma optimize time
Данное указание компилятор интерпретирует так, что он старается сгенерировать
объектный код, отличающийся более высокой скоростью выполнения, нежели в слу-
чае, когда он должен быть более компактным.
2. #pragma optimize size
При таком указании, компилятор считает более важным сгенерировать компактный
объектный код, хотя бы и не очень быстрый в исполнении.
3. #pragma nonrec
Этой директивой изменяется задание по-умолчанию режима выполнения функций,
как нерекурсивных.
4. #pragma recursive
С помощью данного предложения устанавливается по-умолчанию режим выполнения
функций как рекурсивных.
13. Поскольку компилятор SOLID C поддерживает для переменных автоматическое
распределение регистров, класс памяти всегда устанавливается "auto" (автомати-
ческий).
14. Компилятор SOLID C позволяет гнездовать тексты комментариев. Эта функция
обеспечивает возможность написания больших программ, содержащих комментарии, в
теле которых, в свою очередь содержатся комментарии. Если на первом проходе
указать компилятору опцию "-c", гнездование комментариев производиться не бу-
дет, что отвечает возможностям стандартного языка Си.
ПЕРЕДАЧА ПАРАМЕТРОВ
Функции с фиксированными параметрами
В случае обычных функций (функций с фиксированными параметрами), первые три
параметра помещаются в регистры, а все последующие - в стек. Если какой-либо
из 3-х параметров имеет тип "char", он помещается в соответствующий 8-ми битный
регистр. Параметры (первые три) других типов помещаются в регистровые пары.
4-й параметр (если есть) и все последующие - помещаются в стек, в обратном по-
рядке (паскалевский способ ?). На вершину стека помещается адрес возврата.
Каждый из размещаемых в стеке параметров занимает два байта. Значение "char"
параметра помещается в младший байт, а значение старшего байта остается неопре-
деленным.
В режиме совместимости со стандартным языком Си, использование параметра типа
"char" имеет отличия: преобразование из "char" формата в "int" производится
автоматически (при этом старший байт обнуляется), после чего данные рассматри-
ваются как "другой тип".
_______________________________________________________________________
Тип параметра Первый Второй Третий Четвертый Пятый ...
_______________________________________________________________________
char A E C (SP+2) (SP+4) ...
другой тип HL DE BC (SP+2) (SP+4) ...
(SP+3) (SP+5) ...
_______________________________________________________________________
Функции с переменными параметрами
Когда вызывается функция с переменными параметрами, все параметры заталки-
ваются в стек (в обратном порядке). Число параметров, помещенных в стек, запи-
сывается в регистровую пару HL. На вершину стека помещается адрес возврата.
В "собственном" режиме, "char" параметр помещается в младший байт, значение
старшего байта остается неопределенным.
В режиме совместимости со стандартом языка Си, "char" тип автоматически
преобразуется в "int" тип (при этом старший байт обнуляется), который далее
трактуется как "другой тип".
Параметры других типов размещаются в стеке согласно правилам стандарта для
процессора Z80, а именно: первым запоминается младший байт, вторым - старший.
_______________________________________________________________________
Тип параметра Количество Первый Второй Третий ...
_______________________________________________________________________
char HL (SP+2) (SP+4) (SP+6) ...
другой тип HL (SP+2) (SP+4) (SP+6) ...
(SP+3) (SP+5) (SP+7)
_______________________________________________________________________
ВОЗВРАТ ЗНАЧЕНИЯ ФУНКЦИИ
При передаче управления вызывающей программе, функция может передавать свое
значение через регистры. При этом функция типа "char" передает значение через
регистр "A". Функции других типов передают свои значения через регистровую
пару HL.
В режиме совместимости со стандартным языком Си, возвращаемое значение всегда
передается через регистровую пару HL, даже в том случае, когда функция имеет
"char" тип.
Для возврата в вызывающую функцию двух и более значений, необходимо исполь-
зовать указатели переменных, как параметры любых других си-программ.
ПРАВИЛА ВЫЗОВА ФУНКЦИЙ
1. Во-первых, вызывающая программа оформляет параметры и помещает их в ре-
гистры или заталкивает в стек согласно правилам, описанным выше.
2. Программа вызывает функцию. Для вызова обычно используется слово "call".
3. После возврата управления функцией, параметры выталкиваются из стека
(с использованием команды "pop"). Если все параметры размещены в регистрах,
использовать команду "pop" нет необходимости. Следует отметить, что в случае
применения команды "pop", возвращаемые через регистры "A" или "HL" значения
функций не будут потеряны.
4. Значение функции возвращается через регистр "A", если функция имеет
"char" тип. Для функций другого типа, значение всегда возвращается через
регистровую пару HL.
ПЕРЕДАЧИ УПРАВЛЕНИЯ ВЫЗЫВАЕМОЙ ФУНКЦИИ
Вызываемая функция не должна разрушить содержимое указателя стека. Иными
словами, содержимое указателя стека при выходе из функции должно остаться тем
же, что и при входе в нее. Параметры, загруженные в стек, должны выталкиваться
из него вызывающей программой. Вызываемая функция может изменить значения па-
раметров (как тех, которые передаются через регистры, так и загруженных в стек).
Однако следует подчеркнуть, что в языке Си действует соглашение, в рамках кото-
рого вызов функций осуществляется по значению, поэтому даже если будут возвра-
щены измененные параметры, это никакого влияния на процесс вызова функции не
окажет.
Возвращаемое значение функции помещается в регистр "A" или в регистровую
пару HL - в зависимости от типа вызванной функции. Эти правила описаны в пре-
дыдущем разделе.
Пример 1:
В следующем примере объявлена ассемблерная функция ISDIGIT, которая возвра-
щает значение функции BOOL в регистре "A". Вызывающая функция передает параметр
"char" типа через регистр "A".
... вызывающая программа (на языке Си)...
typedef char BOOL; /* определение "char" типа как BOOL */
...
BOOL isdigit(c);
char c;
...
if (isdigit(c))
...
...
... вызываемая функция (на языке Ассемблера)...
public isdigit_
isdigit_:cp '0'
jr c,false
cp '9'+1
ret c ; цифра, вернуть true
false: xor a ; не цифра, вернуть false
ret
Пример 2:
Этот пример соответствует случаю вызова функции, написанной на Си, из ас-
семблерной процедуры.
Стандартные библиотечные функции printf и puts вызываются из ассемблерной
процедуры. Их исходные тексты находятся в исходниках библиотеки, поэтому здесь
функции printf и puts не будут описаны. Следует заметить, что поскольку функ-
ция printf - с переменными параметрами, ее параметры заталкиваются в стек.
В данном примере параметр всего один, однако в случаях двух и большего числа
параметров, они помещаются в стек в обратной последовательности. Число парамет-
ров передается в вызываемую функцию через регистровую пару HL (в приведенном
примере передается число 1). После возврата из вызываемой функции, будут выпол-
няться операции выталкивания из стека (в примере команда "pop" будет выполнена
1 раз). Следует помнить, что параметры восстанавливаются из стека вызывающей
программой, а не вызываемой.
С другой стороны, функция puts принадлежит к числу функций с фиксированными
параметрами, поэтому адрес символьной строки передается через регистровую пару
HL.
extern printf_, puts_
example: ld hl,msg
push hl ; поместить в стек адрес символьной строки
ld hl,1 ; загрузить число параметров
call printf_ ; вызов процедуры, формирующей вывод
pop hl ; выталкивание параметров из стека
;
ld hl,msg ; загрузить адрес строки
jp puts_ ; вызов функции вывода строки
msg: db 'Hello, world!',0Ah,0
РЕКОМЕНДАЦИИ ПО ПРОГРАММИРОВАНИЮ
1. Следует пользоваться нерекурсивными функциями, если нет особой необхо-
димости использовать рекурсию. Благодаря такому подходу, можно достичь более
быстрого доступа к тем локальным переменным, для которых не распределяется
регистровая память и следовательно, получить эффективный объектный код.
2. Если указан режим совместимости со стандартным языком Си (опция "-k"),
то качество объектного кода будет ниже, поэтому указание на этот режим нужно
применять только в случаях, когда требуемая совместимость на уровне стандарт-
ного языка Си нужна больше, чем эффективность кода.
3. Используйте тип "char" (с 8-битовой длиной данных) везде, где только
можно. Байтовые операции выполняются с помощью 8-битового процессора более
эффективно, чем над данными, длиной в слово (типы "int" или "unsigned").
Поэтому определяйте переменные, числовые значения которых не выходят за пре-
делы диапазона 0..255, как TINY (char).
4. При использовании 16-битовых переменных следует определять их преимущест-
венно типом "unsigned", который в этих случаях предпочтительнее, нежели "int".
Это обусловлено тем, что в процессоре Z80 выполнение операций со знаком (в част-
ности, операций сравнения величин со знаком) реализовано не лучшим образом.
5. Нежелательно установление статического режима для локальных переменных.
Переменные, определенные как статические или внешние, не подлежат загрузке в
регистровую память. Поэтому, если для повышения скорости выполнения программы
определить локальные переменные как "static", а функции как "extern", то
результат будет противоположным - эффективность объектного кода существенно
понизится. Компилятор SOLID C сам производит распределение регистров, поэтому
следует обязательно определять локальные переменные, как "auto".
ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА ЯЗЫКА
Следующие слова используются как ключевые в компиляторе SOLID C и их нельзя
использовать в качестве меток или имен переменных.
asm float signed
auto for static
break goto struct
case if switch
char int typedef
const long union
continue nonrec unsigned
default recursive void
do register volatile
double return while
else short
extern sizeof
ДИРЕКТИВЫ КОМПИЛЯТОРА
define nonrec
endif optimize
error pragma
ifdef recursive
ifndef size
include time
line undef
+2570
View File
File diff suppressed because it is too large Load Diff
+121
View File
@@ -0,0 +1,121 @@
ПРИНЦИП РАЗДЕЛЬНОЙ КОМПИЛЯЦИИ
При разработке больших программ исходный текст разделен на несколько файлов.
После того, как они отдельно друг от друга откомпилированы, их нужно скомпоно-
вать в единую программу. Здесь описан метод раздельной компиляции и отмечены
основные моменты, на которые следует обращать внимание при разработке исходного
текста.
1. Замечания к исходной программе
Имеются две серьезные проблемы раздельной компиляции и сборки больших
программ:
- ссылки на функции из других файлов
- возможность получения общих данных
Ниже дана попытка освещения этих вопросов с параллельным показом на приме-
рах. Рассмотрим следующую программу.
#include <stdio.h>
int a[10];
char b[4];
char main()
{
char sub1(),sub2();
sub1();
sub2();
printf("%d,%d,%d\n",a[0],a[3],a[9]);
printf("%c,%c,%c\n",b[0],b[1],b[2]);
}
char sub1()
{
a[0]=1;
a[3]=2;
a[9]=3;
}
char sub2()
{
b[0]='a';
b[1]='b';
b[2]='c';
}
Текст данной программы размещен в трех файлах с именами PROG1, PROG2 и
PROG3 - соответственно содержащих главную функцию и функции 1 и 2.
Точнее, в каждом из этих файлов содержатся:
PROG1.C:
#include <stdio.h>
int a[10];
char b[4];
char main()
{
:
:
}
PROG2.C:
extern int a[10];
char sub1()
{
:
:
}
PROG3.C:
extern char b[4];
char sub2()
{
:
:
}
Функция main вызывает функции sub1 и sub2, поэтому их определения необхо-
димы. Так как функции sub1 и sub2 в свою очередь никакие другие функции не
вызывают - никаких других описаний не требуется. Использование массивов "a"
и "b" также является проблемой. На идентификатор "а" ссылаются программа main
и sub1. На массив "b" ссылаются функции main и sub2. В любом из этих вариантов
между файлами должна быть установлена связь.
Для этой цели используется описатель "extern" (внешний). В первом из файлов
- PROG1.C, этот описатель отсутствует, однако в двух других файлах этот описа-
тель введен. Этот факт отражает то обстоятельство, что массивы "a" и "b" содер-
жатся в файле PROG1.C, а в других файлах этих массивов нет. Если в двух или
большем числе файлов будут стоять определения без описателей "extern", то при
сборке единой программы появятся сообщения о дублировании имен массивов. С
другой стороны, при добавлении описателя "extern" во все определения, они мо-
гут диагностироваться как неопределенные.
Следовательно, в случае организации общих данных для нескольких файлов необ-
ходимо дать определение без описателя "extern" только в одном из файлов с
текстом исходной программы. Во все другие файлы нужно поставить "extern".
2. Процедура компиляции и сборки программы
Для описанных выше текстовых файлов с исходной программой последователь-
ность команд компиляции и сборки модулей выглядит следующим образом:
cc1 prog1
cc1 prog2
cc1 prog3
cc2 prog1
cc2 prog2
cc2 prog3
as prog1
as prog2
as prog3
ld prog=prog1,prog2,prog3,clib/l/gXMAIN
В том случае, когда все части программы (все файлы) уже откомпилированы и
требуется лишь перекомпилировать одни из них (например файл PROG2.C), следует
выполнить приведенную ниже группу команд:
cc1 prog2
cc2 prog2
as prog2
ld prog=prog1,prog2,prog3,clib/l/gXMAIN
+228
View File
@@ -0,0 +1,228 @@
СОЗДАНИЕ БИБЛИОТЕК
Известны два способа создания библиотеки. Оба они будут описаны в следующих
параграфах. Первый из них, метод "а" - быстрый и легкий по исполнению, однако
к собираемым пользовательским программам прилинковываются в том числе и такие
функции, которые не обязательно будут использоваться.
В отличие от первого, способ "b" реализуется сложнее и требует большего вре-
мени, но получаемые в соответствии с ним пользовательские программы будут со-
держать в себе только те функции, которые заведомо применяются в программе.
Стандартная библиотека компилятора "clib.irl" создается именно по способу "b".
1. Простой способ создания библиотеки
Рассмотрим пример двух функций "power" и "log2":
int power(x,e)
int x,e;
{
int y;
for(y=1; e>0; e--)
y *= x;
return(y);
}
int log2(x)
int x;
{
int y;
for(y=0; x>1; x>>=1)
y++;
return(y);
}
Если эти функции помещаются в файл с именем XLIB.C, последовательность
создания библиотеки выглядит следующим образом:
cc1 xlib
cc2 xlib
as xlib
При выполнении этой последовательности будет создана библиотека с именем
XLIB.REL. Ниже приведена команда сборки программы, которая вызывает функции
из этой библиотеки:
ld prog,xlib,clib/l/gXMAIN
В этом случае нет необходимости писать ключ /l после имени библиотеки XLIB,
т.к. даже если его написать, тем не менее все функции, входящие в библиотеку
XLIB, будут скомпонованы с программой "prog".
Здесь будет описан способ включения в библиотеку программ, написанных на
Ассемблере. В качестве примеров взяты функции hex, ror и rol, помещенные в
файл ALIB.ASM:
public hex_, ror_, rol_
cseg
hex_: ; convert 0..F -> '0'..'F'
and 0Fh
add a,90h
daa
adc a,40h
daa
ret
ror_: ; ror(c,n) n bit rotate right char
inc e
rorl: dec e
ret z
rrca
jp rorl
rol_: ; rol(c,n) n bit rotate left char
inc e
roll: dec e
ret z
rlca
jp roll
Включение этих функций в библиотеку производится путем выполнения следующей
команды:
as alib.asm
Следующая команда вызывает линковку программы, как и в случае Си-программы:
ld prog,alib,clib/l/gXMAIN
Как видно из приведенных выше примеров, самый простой способ формирования
библиотеки - включение в нее тех программ, из которых компонуется программа.
Однако этот способ не совершенен, так как вызывает подключение всей библиотеки.
В следующем параграфе будет описан способ создания библиотеки, при котором
программа компонуется только из тех функций, к которым предполагаются обраще-
ния.
2. Создание полной библиотеки
2.1. Включение Си-программ в библиотеку
Здесь будет приведен тот же пример, что и выше - включение файла XLIB.C,
содержащего тексты функций POWER и LOG2 в библиотеку.
Вначале нужно "разделить" файл XLIB.C на составляющие его функции, записав
их в отдельные файлы POWER.C и LOG2.C. Далее необходимо выполнить следующие
команды:
cc1 power
cc1 log2
cc2 power
cc2 log2
as power
as log2
ol a xlib.irl power log2
При выполнении этой последовательности команд, происходит следующее:
1. Си-тексты функций транслируются в ассемблерные листинги.
2. В результате ассемблирования получаем модули с расширением ".rel".
3. С помощью библиотекаря OL из двух модулей с расширением ".rel"
создается библиотека XLIB.IRL.
После создания библиотеки XLIB.IRL, файлы POWER.REL и LOG2.REL уже не нужны
и их можно удалить.
Применение библиотеки XLIB.IRL определяется следующей командой:
ld prog,xlib/l,clib/l/gXMAIN
После имени библиотеки XLIB нужен ключ /l как указание линкеру подключить
к программе только необходимые ей функции.
При сборке программ, состоящих из большого числа файлов (функций), имеет
значение порядок расположения функций. Ниже приведены два примера: один из
них правильный, а другой неправильный.
Правильный пример:
char islower(c)
char c;
{
return('a'<=c && c<='z');
}
char toupper(c)
char c;
{
return(islower(c) ? c-'a'-'A' : c);
}
В данном примере в библиотеку включается файл X.C, состоящий из двух
функций. В этом случае функция "islower" расположена в файле X.REL перед
функцией "toupper". Поэтому при редактировании связей по ключу /l линкер
не выдаст диагностику об ошибке типа отсутствия определения.
Но если написать вначале текст функции "toupper", возникает следующий
неправильный пример:
char toupper(c)
char c;
{
char islower();
return(islower(c) ? c-'a'-'A' : c);
}
char islower(c)
char c;
{
return('a'<=c && c<='z');
}
В результате расположение модулей в библиотечном файле будет неправильным.
Подводя итоги сказанному, можно резюмировать, что для правильного порядка
расположения модулей в библиотеке нужно в исходной программе вначале писать
вызываемую функцию, а после нее - вызывающую.
2.2. Создание библиотеки модулей на Ассемблере
По сравнению с описанием включения в библиотеку, которое было дано в п.1,
здесь, файл ALIB.ASM следует предварительно разделить на следующие три файла
"hex.asm", "ror.asm" и "rol.asm":
HEX.ASM:
cseg
hex_:: and 0Fh
add a,90h
daa
adc a,40h
daa
ret
ROR.ASM:
cseg
ror_:: inc e
rorl: dec e
ret z
rrca
jp rorl
ROL.ASM:
cseg
rol_:: inc e
roll: dec e
ret z
rlca
jp roll
После того, как каждый из них будет ассемблирован и получен файл с расши-
рением ".rel", вызывается библиотекарь OL для создания библиотеки:
as hex
as ror
as rol
ol a alib.irl hex ror rol
Применение библиотеки ALIB.IRL определяется следующей командой:
ld prog,alib/l,clib/l/gXMAIN
При сборке программы, точно таким же образом, как и для сборки Си-программы
из модулей, должна соблюдаться последовательность записи исходного текста, а
именно: вызываемая функция должна быть записана прежде, а вызывающая ее, вслед
за ней.
+80
View File
@@ -0,0 +1,80 @@
Последняя редакция: 7.05.2004
IRL формат
~~~~~~~~~~
IRL-файл представляет собой индексированный REL-файл. Благодаря индекси-
рованию улучшается работа линкера. В начале IRL-файла находятся 3 байта:
db старший ;+0 (File offset >> 14) & 0x7F
db средний ;+1 (File offset >> 7) & 0x7F
db младший ;+2 (File offset 1) & 0x7F
IRL-файл состоит из 3 секций: IRL-заголовок, Символьная таблица и REL-имидж.
IRL-заголовок
~~~~~~~~~~~~~
Массив 128 байт в начале REL-файла. Используются только первые три байта,
содержащие смещение до REL-имиджа. Остальные байты установлены в ноль:
db старш,средн,0 ; Смещение до REL-имиджа. Младший байт
; всегда равен 0. Начало REL-имиджа вы-
; равнивается на границу в 128 байтов.
ds 125 ; Не используются и установлены в 0.
Чтобы вычислить смещение до REL-имиджа, надо "старший" и "средний" байты
умножить на 128. Например для файла clib.irl: 0011h * 128 = 0880h
ld h,xx ;+0
ld a,xx ;+1
;a,h,l * 128
add a,a
ld l,a
xor a
srl h
rr l
srl h
rr l
rra
;hl=ст.разряд
;a=мл.разряд
Обратите внимание, что 7-й бит первого байта всегда 0. В не индексированном
rel-файле, 7-й бит первого байта всегда 1 (первый бит записи "имя модуля").
Символьная таблица
~~~~~~~~~~~~~~~~~~
Таблица начинается со смещения +80h от начала файла и состоит из множества
символьных записей разной длины. Каждая запись имеет формат:
db ст,средн,мл ; Смещение от начала rel-имиджа до rel-модуля,
; содержащего символьную строку (имя).
db "SYMBOL" ; Символьная строка из 1..8 символов.
db 0FEh ; Конец строки.
Конец таблицы отмечается 0 в начале символьной строки:
db ст,средн,0 ; Размер REL-имиджа. Это не смещение на конец
; файла в REL-имидже, а показывает число байт
; REL-имиджа, включая выравнивание до границы
; в 128 байт.
db 0FEh ; Конец строки.
Примечание!: У irl-файлов от библиотекаря "OL", данная запись имеет формат:
db 0,0,0
db 0FFh
После этой записи, таблица выравнивается (LIB использует байт 1Ah) до следу-
ющей границы в 128 байт.
REL-имидж
~~~~~~~~~
REL-имидж всегда начинается с границы в 128 байт. Состоит из обычных rel-
данных. Чтобы преобразовать IRL-библиотеку в REL-библиотеку, надо удалить
заголовок и символьную таблицу.
+138
View File
@@ -0,0 +1,138 @@
Линкер
Линкер LD предназначен для сборки готовых программ или dll-библиотек
из отдельных объектных модулей. В качестве объектных модулей могут высту-
пать файлы rel-формата или библиотеки irl-формата (создаваемые библиотека-
рем ol.exe). Описание "rel", "irl" форматов смотрите в файлах "rel.rus" и
"irl.rus".
Строка вызова линкера имеет следующий формат:
LD [/keys] [outfile=] infile[/keys] [,infile[/keys] ...] [@ list]
где:
keys - опции линкера
outfile - имя выходного файла программы
infile - файл "rel" или "irl" формата
@ list - файл подстановок
Пример вызова линкера:
LD hello.rel
После выполнения данной команды получится файл "hello.exe".
При своей работе, линкер может создавать на диске временные файлы. Поэтому
для ускорения работы линкера рекомендуется использовать его на электронном
диске.
Опции линкера:
A использовать диск для сохранения симв. таблицы
D## адрес расположения DATA сегмента
E не вставлять EXE заголовок
Glabel задать метку 'label' в качестве стартовой
L поиск библиотечного файла (опция после имени файла)
P## адрес расположения CODE сегмента
Q вывести метки вида ?labels на экран
R## установить адрес загрузки (адрес ORG-а программы)
S вывести список меток на экран
T[type:ver] создать DLL библиотеку. Type - внутр. описание библы;
Ver - версия библы. Символ ":" разделяет параметры.
U заменить все "@" на "_" в именах меток
Y исключить DATA сегмент из выходного кода
X не создавать SYM файл
Создание DLL-библиотек
Для создания динамических библиотек служит опция "t". Обратите внимание,
что эта опция отменяет вставку exe-заголовка.
Отслеживается превышение максимального размера dll-библиотеки в 16 kB.
В этом случае линкер выдает предупреждающее сообщение, но линковка библи-
отеки не прерывается.
Создаваемые dll-библиотеки имеют сигнатуру заголовка "L1". Библиотека этого
формата отличается от формата "L0" только тем, что таблица перемещений начи-
нается сразу за концом "своего" кода.
Заголовок dll-библиотеки создается и прилинковывается автоматически, поэто-
му не надо резервировать для него место при написании ассемблерных текстов.
Более подробную информацию по dll-библиотекам смотрите в документации менед-
жера dll-библиотек.
Пример строки вызова линкера:
LD /TSymple library:0001 test.rel
где:
"Symple library" - Строка внутреннего описания библиотеки.
Строка описания может содержать пробелы.
Длина описания не должна превышать 16
символов, иначе линкер выдаст ошибку.
"0001" - Внутренний номер версии библиотеки. Может
содержать символы 0..9 и A..F (a..f).
"test.rel" - объектный файл, служащий для создания библиотеки.
Можно не указывать один из параметров (или все) опции, но символ ":" разде-
лителя параметров должен стоять всегда. В случае отсутствия описания - в
заголовке библиотеки будет стоять пустая строка. В случае отсутствия номера
версии - в заголовке будет стоять нулевой номер. Примеры вызова опции:
LD /Tsymple library: test.rel
LD /tМоя библиотека: test
LD /T:010B test.rel
LD /t:7 test
LD /t: test.rel
Обратите внимание, что строка внутреннего описания библиотеки начинается
сразу же за буквой "t" опции. Например, если написать
LD /T Example:0001 test.rel
то строка описания в заголовке библиотеки будет иметь вид " Example", т.е.
начинаться с пробела.
Файл подстановок
Файл подстановок служит для некоторой "автоматизации" процесса линковки
программ. Можно один раз создать файл подстановки и линковать программу, не
набирая каждый раз (возможно длинную) строку параметров линкера.
Файл подстановок может содержать всего одну строку агрументов или отдельные
аргументы могут начинаться с новой строки. В конце файла подстановок должна
стоять пустая строка. Размер файла подстановок ограничен до 256 байт и файл
может иметь любое имя.
Пример вызова линкера с файлами подстановок:
LD @ comp.txt
или
LD @list
Примеры файла подстановок.
Пример 1
test=prog,clib.irl/l/gxmain/x
Пример 2
test=prog,
clib.irl/l
/gxmain
/x
В данных примерах собирается программа с заданным именем "test". При лин-
ковке используется исходный объектный файл "prog.rel", библиотека "clib.irl"
и управление в программе передается на метку "xmain" (это необходимо делать
для всех программ, линкуемых с Си-библиотекой "clib.irl"). Опция "x" запре-
щает создание sym-файла.
+1217
View File
File diff suppressed because it is too large Load Diff
+1731
View File
File diff suppressed because it is too large Load Diff
+30
View File
@@ -0,0 +1,30 @@
Библиотекарь
Библиотекарь OL служит для работы с библиотеками IRL-формата. Информацию
по этому формату можно прочитать в файле "irl.rus". Строка вызова библио-
текаря имеет следующий формат:
OL <опция> <имя_библиотеки> [<имя_модуля1> <имя_модуля2> ...]
Например:
OL a mylib.irl module1 module2 module3
В данном примере в библиотеку MYLIB.IRL добавляются три новых модуля
(rel-файлы). Если файла MYLIB.IRL не существует, то создается новая
библиотека с таким именем, содержащая три указанных модуля.
Опции библиотекаря:
A - Добавить модуль(и) в библиотеку. Если указанной библиотеки
нет, она создается.
D - Вывод дампа содержимого библиотеки на экран.
E - Извлечь модуль(и) из библиотеки и сохранить его в файле.
В именах модулей можно использовать глобальные символы
"*" и "?".
L - Вывод списка модулей библиотеки на экран.
R - Переиндексация библиотеки.
T - Проверка всех модулей библиотеки на неопределенные внешние
метки.
+155
View File
@@ -0,0 +1,155 @@
Некоторые особенности пакета SOLID C для ОС Estex
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
СИ-КОМПИЛЯТОР
Коды возврата компилятора (1-й и 2-й проходы):
00h - Ok
0FFh - были errors/warnings, ошибки выделения памяти или работы с файлами.
1-й проход компилятора
1. При компиляции "чужих" исходников ставить опцию "-k".
2. В опциях: -dNAME, -jN, -oNAME и -rP:S:H пробелы не допускаются.
3. Максимальная длина строки полного пути (disk\dir\file.ext) файлов
равна 80 символов.
4. Файл "file.err" создается всегда по текущему пути входного .c файла.
5. Формат записи include-файлов только как:
#include <file.ext> - поиск ведется только в подкаталоге "INCLUDE"
расположения компилятора.
#include "file.ext" - поиск ведется только в каталоге расположения
входного .c файла.
Задание пути в имени файла не допускается!. Имя папки "INCLUDE" зарезерви-
ровано.
2-й проход компилятора
1. Позволяет компилировать несколько бОльшие исходники, по сравнению
с фирменной версией.
2. Исправлены две фирменные ошибки:
a) нельзя было указывать расширение для TMC-файлов
b) зависание при компиляции запредельно больших исходников
АССЕМБЛЕР
Примечание: Поскольку ассемблер AS совместим с ассемблером M80 фирмы Microsoft
по формату записи ассемблерных текстов - в качестве документации на AS исполь-
зуется документация ассемблера M80. Отличие ассемблера AS от M80 заключается в
том, что у AS отсутствуют некоторые команды M80 (в основном, управление вывода
листингов).
1. Максимальная длина имен (включающих букву диска и каталоги) файлов
равна 64 символа.
2. В псевдокоманде NAME('...') можно использовать также двойные (")
кавычки.
3. Имя include-файла можно указывать без расширения. В этом случае будет
использоваться расширение по-умолчанию ".asm". Это же правило действует
и для входного asm-файла.
4. Поддерживаются три варианта записи недокументированных регистров:
HX/XH LX/XL
HY/YH LY/YL
HIX/IXH LIX/IXL
5. Псевдокоманды "EQU" и "=" идентичны.
6. Максимальная длина имен глобальных меток, передаваемых в объектный
файл (rel-файл) зависит от режима работы ассемблера:
6 символов - при указании опции "-t"
8 символов - по-умолчанию
30 символов - при указании опции "-x" (расширенный rel-формат)
Следует отметить, что с объектными файлами расширенного rel-формата не
работает библиотекарь. Поэтому при компиляции библиотечных файлов, не
следует ассемблеру указывать опцию "-x".
7. Коды возврата ассемблера:
00h - Ok
0FFh - были errors/warnings, ошибки выделения памяти
или работы с файлами.
ЛИНКЕР
При линковке готовых си-программ, собираемых с библиотекой "clib.irl" необхо-
димо всегда указывать линкеру опцию "/gXMAIN". Она передает управление на
начальный startup-код си-программ. См. исходники библиотеки "clib".
1. Линкер работает только с именами входных файлов. Указание диска и пути
расположения файлов не поддерживается.
2. Исправлены фирменные глюки:
a) неверная работа с "@list" файлом
b) не отслеживались запросы на request-файлы
3. При вставке exe-заголовка, параметры равны: ORG = 4100h, Stack = 0C000h.
(Значение ORG-a может быть изменено опцией "/r").
4. Файл "list" - содержит одну ком-строку с агрументами. Отдельные аргументы
могут начинаться с новой строки. В конце файла должна стоять пустая новая
строка. Кол-во читаемых байт ограничено до 256 байт.
5. Поиск библы: сперва файл *.irl, после *.rel. Если не найден, выдается
сообщение ошибки: "файл *.rel не найден".
6. Максимальная длина имен идентификаторов - 30 символов.
7. Метки вида ?labels не выводятся в sym-файл и на экран. Становятся
"видимыми" только при опции /Q.
8. Отслеживается превышение размера 16kB для dll-библиотек (выдается
предупреждение).
9. Коды возврата линкера:
00h - Ok
0FFh - были ошибки выделения памяти или работы с файлами.
БИБЛИОТЕКАРЬ
1. Тип открываемого входного файла отслеживается не по его расширению,
а по внутреннему содержимому.
2. При создании библиотеки: если имя библиотеки совпадает с именем входного
файла, то необходимо указать расширение библиотеки, чтобы не было двойного
добавления файлов. В именах rel-файлов расширение можно не указывать. Имена
добавляемых файлов разделяются пробелами или запятыми.
3. Глобальные символы "*" и "?" поддерживаются только для режима извлечения
модулей (опция "e"). В остальных режимах необходимо указывать реальное имя
файла.
4. Задание пути поддерживается только для файла библиотеки. Для rel-файлов
указание пути не поддерживается и используется путь расположения библиотеки.
5. В опции l(ist) (список модулей библиотеки), размеры "Code size: ..." и
"Data size: ..." выводятся в десятичном формате.
6. В опциях d(ump) и l(ist) вывод на экран можно остановить/продолжить при
нажатии на любую клавишу. При нажатии на Esc - выход из режима.
7. Коды возврата библиотекаря:
00h - Ok
0FFh - были ошибки работы или операций с файлами.
+137
View File
@@ -0,0 +1,137 @@
Последняя редакция: 7.05.2004
ФОРМАТ REL-СОВМЕСТИМЫХ ОБЪЕКТНЫХ ФАЙЛОВ
Объектные файлы REL-формата фирмы Microsoft, представляют собой битовый
поток. Отдельные поля в битовом потоке не выровнены на границу байта,
кроме элементов, описанных ниже.
Использование битового потока для объектных файлов уменьшает их размер,
сводя к минимуму число обращений к диску для чтения/записи данных.
Имеются два основных типа: Абсолютный и Перемещаемый. Первый бит служит
индикатором типов. Если он равен 0, следующие 8 бит загружаются как абсо-
лютный байт. Если первый бит равен 1, следующие 2 бита определяют 4 типа:
00b Спец-элемент (описание ниже).
01b Перемещаемый Код. Значение следующих 16 бит (2 байта)
необходимо прибавить с текущему значению счетчика адреса
Кода.
10b Перемещаемые Данные. Значение следующих 16 бит (2 байта)
необходимо прибавить с текущему значению счетчика адреса
Данных.
11b Перемещаемая Общая область (код+данные). Значение следующих
16 бит (2 байта) необходимо прибавить с текущему значению
счетчика адреса Common-области.
Спец-элемент(ы) содержит:
■ контр. поле из 4-х бит номеров элементов 0..15.
■ не обязательное A-поле. Содержит 2 бита типа адресации cseg,
dseg,common (кроме абсолютного) и 2 (4 у extended REL) байта
значения.
■ не обязательное B-поле. Содержит 3 бита (5 у extended REL)
длины имени и самого имени идентификатора.
Общее представление спец-элемента:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 00b xxx yy nnnn mmmm zzz + имя идентификатора
-------------- ------------------------
A-поле B-поле
xxx 4 бита контр. поля (0..15 номера элементов, см. ниже)
yy 2 бита типа адресации (cseg/dseg/common)
nnnn 16 бит значения (адрес)
mmmm 16 бит дополнительно, при расширенном REL-формате
zzz 3 бита длины имени (5 бит при расш. REL-формате)
... имя идентификатора
Номера элементов контрольного поля
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Номера элементов только в B-поле:
0 - имя метки, на которую имеется ссылка
1 - имя блока COMMON
2 - имя прогр. модуля (program name)
3 - request-имя файла (request library search)
4 - элемент расширения. См. примечание.
Номера элементов в A-поле и B-поле:
5 - размер COMMON (элемент только для A-поля ?)
6 - внешняя цепочка:
для A-поля: адрес головной цепочки
для B-поля: внешнее имя
7 - точка входа метки:
для A-поля: адрес располож. метки
для B-поля: имя метки
Номера элементов только в A-поле:
8 - External - offset. Used for JMP and CALL to externals.
9 - External + offset. The A value will be added to the two
bytes starting at the current location counter immediately
before execution.
10 - размер области Данных.
11 - счетчик памяти сегмента (ORG cseg/dseg/common).
12 - адрес цепочки. A is head of chain, replace all entries
in chain with current location counter.
Вход последней цепочки имеет нулевой адрес.
13 - размер области Кода.
14 - конец программного модуля (end program), далее идет
выравнивание до границы байта.
Этот элемент не содержит ни A-поле, ни B-поле:
15 - конец файла
Примечание по элементу расширения:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C-поле элемента расширения имеет формат B-поля спец-элемента, но область
имени не содержит имя идентификатора, как в B-поле. Вместо него здесь
находится один байт типа (сигнатура) элемента расширения, далее следует
от 1 до 7 байт дополнительной информации.
Таким образом, каждый элемент расширения имеет формат:
1 00b 0100b zzz i jjjjjjjj
----------------
C-поле
zzz любые 3 бита (000b представляется как 8).
(001b у асма SOLID).
i 8 бит типа (сигнатура) элемента расширения.
(0FEh у асма SOLID).
jjjjjjjj zzz-1 число байт информации. Значение зависит
от типа i.
Это присутствует только в одном элементе расширения:
zzz 010b (2)
i X'35' тип (сигнатура) оверлейного сегмента COBOL
j номер COBOL-сегмента - 31h (цифровой формат номера)
Когда линкеру встречается сигнатура оверлейного сегмента, текущее число
оверлейных сегментов устанавливается в значение j+31h (симв. формат номера).
Если предварительно существующий номер сегмента не был нулевой и включена
опция /N (сохр. файл с заданным именем), то область данных записывается на
диск в файл. Имя файла равно текущему имени программы, с расширением файла -
Vxx, где "xx" две hex-цифры номера сегмента j+31h (симв. формат номера).
+129
View File
@@ -0,0 +1,129 @@
4.3 FORMAT OF LINK COMPATIBLE OBJECT FILES
NOTE
Section 4.3 is interesting
material for users who wish to
know the load format of LINK-80
relocatable object files. Most
users will want to skip this
section, as it does not contain
material neccessary to the
operation of the package.
LINK-compatible object files consist of a bit stream. Individual fields
within the bit stream are not aligned on byte boundaries, except as
noted below. Use of a bit stream for relocatable object files keeps the
size of object files to a minimum, thereby decreasing the number of
disk reads/writes.
There are two basic types of load items: Absolute and Relocatable. The
first bit of an item indicates one of these two types. If the first bit
is a 0, the following 8 bits are loaded as an absolute byte. If the
first bit is a 1, the next 2 bits are used to indicate one of four
types of relocatable items:
00 Special LINK item (see below).
01 Program Relative. Load the following 16 bits
after adding the current Program base.
10 Data Relative. Load the following 16 bits after
adding the current Data base.
11 Common relative. Load the following 16 bits
after adding the current Common base.
Special LINK items consist of the bit stream 100 followed by:
a four-bit control field
an optional A field consisting of a two-bit address type
that is the same as the two-bit field above except 00
specifies absolute address
an optional B field consisting of 3 bits that give a
symbol length and up to 8 bits for each character of the
symbol
A general representation of a special LINK item is:
1 00 xxxx yy nn zzz + characters of symbol name
-------- ---------------------------------
A field B field
xxxx Fout-bit control field (0-15 below)
yy Two-bit address type field
nn Sixteen-bit value
zzz Three-bit symbol length field
The following special types have a B-field only:
0 Entry symbol (name for search)
1 Select COMMON block
2 Program name
3 Request library search
4 Extension LINK items (see below)
The following special LINK items have both an A field and a B field:
5 Define COMMON size
6 Chain external (A is head of address chain, B is name of
external symbol)
7 Define entry point (A is address, B is name)
The following special LINK items have an A field only:
8 External - offset. Used for JMP and CALL to externals
9 External + offset. The A value will be added to the two
bytes starting at the current location counter
immediately before execution.
10 Define size of Data area (A is size)
11 Set loading location counter to A
12 Chain address. A is head of chain, replace all entries
in chain with current location counter. The last entry
in the chain has an address field of absolute zero
13 Define program size (A is size)
14 End program (forces to byte boundary)
The following special LINK item has neither an A nor a B field:
15 End file
An Extension LINK item follows the general format of a B-field-only
special LINK item, but contents of the B-field are not a symbol name.
Instead, the symbol area contains one character to identify the type of
Extension LINK item, followed by from 1 to 7 characters of additional
information.
Thus, every Extension LINK item has the format:
1 00 0100 zzz i jjjjjjjj
where
zzz may be any three bit integer (with 000 representing 8),
i is an eight bit Extension LINK item type indentifier,
and
jjjjjjjj are zzz-1 eight bit character of information whose
significance depends on i
At present, there is only one Extension LINK item:
i = X'35' COBOL overlay segment sentinel
zzz = 010 (binary)
j = COBOL segment number -49 (decimal)
When the overlay segment sentinal is encountered by the linker,
the current overlay segment number is set to the value of j+49. If
the previously existing segment number was non-zero and a /N
switch is in effect, the data area is written to disk in a file
whose name is the current program name and whose extension is Vnn,
where nn are the two hexadecimal digits representing the number
j+49 (decimal).
+28
View File
@@ -0,0 +1,28 @@
#include <stdio.h>
void func1();
void func2();
void main()
{
atexit(func1); // "Exit Function 1 called"
atexit(func2); // "Exit Function 2 called"
printf("\tMain quitting ...\n");
/*
* ‚뢥¤¥âáï:
* Main quitting ...
* Exit Function 2 called ...
* Exit Function 1 called ...
*/
}
void func1()
{
printf("\tExit Function 1 called ...\n");
}
void func2()
{
printf("\tExit Function 2 called ...\n");
}
+98
View File
@@ -0,0 +1,98 @@
/*
* BIN2C V1.0 CODED BY CHRISTIAN PADOVANO ON 17-MAY-1995
*
* this little utility translates a binary file in a useful C structure
* that can be included in a C source.
*/
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
#define BUF_LEN 1
#define LINE 9
FILE *fp, *fp1;
f_point *pos;
/* lower chars --> upper chars */
void upper_chars(buff)
char *buff;
{
char c;
for(c=0; c <= strlen(buff)-1; c++)
*(buff+c) = toupper(*(buff+c));
}
void main(argc, argv)
int argc;
char *argv[];
{
char buffer[BUF_LEN], dummy[20];
char c;
if((argc < 4))
{
puts("- <<< BIN2C V1.0 >>> by Christian Padovano -\n");
puts("Usage: Bin2C <BINARY file name> <TARGET file name> <STRUCT name>\n");
puts(" <STRUCT > = name of the C structure in the destination file name");
puts(" <TARGET > = without extension '.h' it will be added by program");
exit(0);
}
if((fp=fopen(argv[1], "rb")) == NULL)
{
cprintf("ERROR: I can't find source file %s\n", argv[1]);
exit(1);
}
strcpy(dummy, argv[2]);
strcat(dummy, ".H"); /* add suffix .h to target name */
if((fp1=fopen(dummy, "w+")) == NULL)
{
cprintf("ERROR: I can't open destination file %s\n", dummy);
exit(1);
}
strcpy(dummy, argv[3]);
upper_chars(dummy); /* lower to upper chars */
strcat(dummy, "_LEN"); /* add the suffix _LEN to the struct name */
/* for the #define stantment */
/* file size in bytes */
fseek(fp, 0, 0, SEEK_END);
pos = ftell(fp);
fseek(fp, 0, 0, SEEK_SET);
/* It writes the header information */
fprintf(fp1, "#define %s %u\n\n", dummy, pos->low);
fprintf(fp1, " static unsigned char %s[]={\n ", argv[3]);
if(ferror(fp1))
{
cprintf("ERROR writing on target file: %s\n", argv[2]);
exit(1);
}
do {
for(c=0; ((c <= LINE) && (! feof(fp))); c++)
{
fread(buffer, 1, 1, fp);
fprintf(fp1,"0x%02X", (char *) *buffer);
if(! feof(fp))
fputc(',', fp1);
}
fprintf(fp1,"\n ");
} while(! feof(fp));
fprintf(fp1,"};\n");
fclose(fp);
fclose(fp1);
}
+10
View File
@@ -0,0 +1,10 @@
#include <io.h>
FD fd;
void main()
{
fd = open("test.txt", O_RDONLY);
if((close(fd)) == -1)
perror("close failed on file");
}
+6
View File
@@ -0,0 +1,6 @@
#include <conio.h>
void main()
{
cprintf("Hello, world!\n");
}
+8
View File
@@ -0,0 +1,8 @@
#include <conio.h>
char *buffer = "Insert data disk in drive A:\n";
void main()
{
cputs(buffer);
}
+12
View File
@@ -0,0 +1,12 @@
#include <io.h>
FD fd;
void main()
{
fd = creat("test.txt", O_RDWR | O_CREAT);
if(fd == -1)
perror("create failed on file");
else
close(fd);
}
+10
View File
@@ -0,0 +1,10 @@
#include <stdio.h>
FILE *fp;
void main()
{
fp = fopen("test.txt", "r");
if((fclose(fp)) == -1)
perror("close failed on file");
}
+21
View File
@@ -0,0 +1,21 @@
#include <stdio.h>
#include <io.h>
FILE *fp;
FD fd;
main()
{
fd = open("test.txt", O_WRONLY);
if(fd == -1)
fprintf(stderr, "File test.txt not found\n");
fp = fdopen(fd, "a");
if(fp == NULL)
fprintf(stderr, "Errors in function fdopen\n");
else
{
fprintf(fp, "Hello, world !\n");
fclose(fp);
}
}
+28
View File
@@ -0,0 +1,28 @@
FEOF
#include <stdio.h> ¤«ï ®¡ê¥­¨ï ä㭪樨
int feof(FILE *fp);
ã­ªæ¨ï (ॠ«¨§®¢ ­­ ï ª ª ¬ ªà®) ®¯à¥¤¥«ï¥â, ¤®á⨣­ãâ «¨ ª®­¥æ § ¤ ­-
­®£® ä ©« . ᫨ ª®­¥æ ä ©«  (EOF) ¤®á⨣­ãâ, â® áâ ­®¢ïâáï ­¥¤®áâ㯭묨
®¯¥à æ¨¨ ç⥭¨ï, â.¥. ¯à¨ ª ¦¤®© ®¯¥à æ¨¨ ç⥭¨ï, ¡ã¤¥â ¢®§¢à é âìáï ¯à¨§-
­ ª ª®­æ  ä ©« , ¯®ª  ä ©« ­¥ ¡ã¤¥â § ªàëâ ¨«¨ ¢ë§¢ ­ë ä㭪樨 rewind,
fsetpos, fseek ¨«¨ clearerr.
᫨ ⥪ãé ï ¯®§¨æ¨ï ï¥âáï ª®­æ®¬ ä ©«  (EOF), äã­ªæ¨ï ¢®§¢à é ¥â ­¥­ã-
«¥¢®¥ §­ ç¥­¨¥. ᫨ ⥪ãé ï ¯®§¨æ¨ï ­¥ ï¥âáï ª®­æ®¬ ä ©«  - ¢®§¢à é -
¥âáï §­ ç¥­¨¥ 0. ã­ªæ¨ï feof ®è¨¡®ª ­¥ ¢®§¢à é ¥â.
#include <stdio.h>
FILE *fp;
main()
{
if((fp=fopen("file.dat", "r")) == NULL)
{
printf("Žè¨¡ª  ®âªàëâ¨ï ä ©« \n");
exit(1);
}
while(!feof(fp))
fgetc(fp);
printf("\n” ©« ¯à®ç¨â ­, ¢áâà¥â¨«áï EOF\n");
fclose(fp);
}
+22
View File
@@ -0,0 +1,22 @@
ã­ªæ¨ï ferror ¯à®¢¥àï¥â ®è¨¡ª¨ ç⥭¨ï ¨ § ¯¨á¨ § ¤ ­­®£® ä ©« .
ਠ¢®§­¨ª­®¢¥­¨¨ ®è¨¡ª¨, ¨­¤¨ª â®à ®è¨¡ª¨ ä ©«  fp ®áâ ¥âáï ãáâ -
­®¢«¥­­ë¬ ¤® â¥å ¯®à, ¯®ª  ä ©« ­¥ § ªà®¥âáï ¨«¨ ¡ã¤ã⠢맢 ­ë
ä㭪樨 rewind ¨«¨ clearerr.
á«ãç ¥ ®¡­ à㦥­¨ï ®è¨¡ª¨ ¢ ä ©«¥, äã­ªæ¨ï ferror ¢®§¢à é ¥â ­¥­ã-
«¥¢®¥ §­ ç¥­¨¥. ®§¢à é ¥¬®¥ §­ ç¥­¨¥ 0 ᢨ¤¥â¥«ìáâ¢ã¥â ®¡ ®âáãâá⢨¨
®è¨¡ª¨.
#include <stdio.h>
FILE *fp;
char *string;
/* á«¥¤ãî騩 ¯à¨¬¥à ¢¢®¤¨â ¤ ­­ë¥ ¢ ä ©« ¨ ¯à®¢¥àï¥â,
­¥ ¢®§­¨ª«  «¨ ®è¨¡ª  ¯à¨ § ¯¨á¨. ¥à¥¤ § ¯¨áìî
¤ ­­ëå ¢ ä ©«, ®­ ¤®«¦¥­ ¡ëâì ¯à¥¤¢ à¨â¥«ì­® ®âªàëâ. */
fprintf(fp, "%s\n", string);
if(ferror(fp))
{
fprintf(stderr, "Write error\n");
clearerr(fp);
}
+16
View File
@@ -0,0 +1,16 @@
#include <stdio.h>
#include <dos.h>
FIND p;
char done;
void main()
{
printf("List of directory: *.*\n");
done = ffirst("*.*", &p, FA_NORMAL | FA_ARCH | FA_DIREC);
while(!done)
{
printf("%s\n", p.ff_name);
done = fnext(&p);
}
}
+20
View File
@@ -0,0 +1,20 @@
#include <stdio.h>
void main()
{
FILE *fp;
fpos_t position;
char buffer[80];
fp = fopen("test.txt", "r");
if(fp != NULL)
{
fgetpos(fp, &position); /* get position */
fgets(buffer, 80, fp); /* read record */
fsetpos(fp, &position); /* set position */
fgets(buffer, 80, fp); /* read same record */
fclose(fp); /* close file */
}
else
printf("can't open file\n");
}
+16
View File
@@ -0,0 +1,16 @@
#include <stdio.h>
#include <dos.h>
struct ffblk p;
char done;
void main()
{
printf("List of directory: *.*\n");
done = findfirst("*.*", &p, FA_NORMAL | FA_ARCH | FA_DIREC);
while(!done)
{
printf("%s\n", p.ff_name);
done = findnext(&p);
}
}
+14
View File
@@ -0,0 +1,14 @@
#include <stdio.h>
FILE *fp;
void main(argc, argv)
int argc;
char *argv[];
{
if((fp=fopen(argv[0], "r")) == NULL)
{
fprintf(stderr,"can't open file: %s\n", argv[0]);
exit(1);
}
}
+11
View File
@@ -0,0 +1,11 @@
#include <stdio.h>
FILE *fp;
char *s = "This is string.";
void main()
{
fp = fopen("test.txt", "w");
fprintf(fp,"%s",s);
fclose(fp);
}
+21
View File
@@ -0,0 +1,21 @@
#include <stdio.h>
FILE *fp;
char *s = "Hello, world ! ;)";
main()
{
fp = fopen("test.txt", "r");
if(fp == NULL)
fprintf(stderr, "File test.txt not found\n");
fp = freopen("file.dat", "w+", fp);
if(fp == NULL)
fprintf(stderr, "Errors in function freopen\n");
else
{
fprintf(stderr, "Now data will go in file.dat\n");
fprintf(fp, "%s\n", s);
}
fclose(fp);
}
+17
View File
@@ -0,0 +1,17 @@
#include <stdio.h>
FILE *fp;
f_point *pos;
void main()
{
fp=fopen("test.txt", "r");
pos->high = 0;
pos->low = 20;
if((pos=fseek(fp, pos->high, pos->low, SEEK_SET)) == -1)
printf("Žè¨¡ª  ¯¥à¥¬¥é¥­¨ï\n");
fprintf(stdout,"\n%04X %04X", pos->high, pos->low);
fclose(fp);
}
+20
View File
@@ -0,0 +1,20 @@
#include <stdio.h>
void main()
{
FILE *fp;
fpos_t position;
char buffer[80];
fp = fopen("test.txt", "r");
if(fp != NULL)
{
fgetpos(fp, &position); /* get position */
fgets(buffer, 80, fp); /* read record */
fsetpos(fp, &position); /* set position */
fgets(buffer, 80, fp); /* read same record */
fclose(fp); /* close file */
}
else
printf("can't open file\n");
}
+18
View File
@@ -0,0 +1,18 @@
#include <stdio.h>
FILE *fp;
f_point *pos;
void main()
{
fp=fopen("test.txt", "r");
pos->high = 0;
pos->low = 20;
if((fseek(fp, pos->high, pos->low, SEEK_SET)) == -1)
printf("Žè¨¡ª  ¯¥à¥¬¥é¥­¨ï\n");
pos=ftell(fp);
fprintf(stdout,"\n%04X %04X", pos->high, pos->low);
fclose(fp);
}
+7
View File
@@ -0,0 +1,7 @@
@echo off
cc1 -m hello.c
cc2 hello.tmc
as hello.asm
ld hello,clib/l/gXMAIN /x
del hello.rel
del hello.asm
+9
View File
@@ -0,0 +1,9 @@
#include <stdio.h>
main()
{
printf("\nHello world !\n");
fprintf(stdout,"ਢ¥â ¬¨à !\n");
// fprintf(stderr,"ਢ¥â ¬¨à !\n");
}
+15
View File
@@ -0,0 +1,15 @@
#include <conio.h>
#include <dos.h>
union REGS inregs, outregs;
void main()
{
/* á«¥¤ãî騥 ®¯¥à â®àë ¢ë¡¨à îâ ⥪ãéãî ¤ âã,
¨á¯®«ì§ãï ¢ë§®¢ ä㭪樨 DOS 21h. */
inregs.h.c = 0x21;
intdos(&inregs, &outregs);
cprintf("date is %02d/%02d/%04d\n", outregs.h.d,
outregs.h.e,
outregs.x.ix);
}
+19
View File
@@ -0,0 +1,19 @@
#include <stdio.h>
#include <io.h>
FD fd;
f_point *pos;
void main()
{
fd=open("test.txt", O_RDONLY);
pos->high = 0;
pos->low = 10;
if((pos=lseek(fd, pos->high, pos->low, SEEK_SET)) == -1)
printf("Žè¨¡ª  ¯¥à¥¬¥é¥­¨ï\n");
printf("\n%04X %04X", pos->high, pos->low);
close(fd);
}
+20
View File
@@ -0,0 +1,20 @@
#include <stdio.h>
#include <io.h>
FD fd;
f_point *pos;
void main()
{
fd=open("test.txt", O_RDONLY);
pos->high = 0;
pos->low = 10;
if((lseek(fd, pos->high, pos->low, SEEK_SET)) == -1)
printf("Žè¨¡ª  ¯¥à¥¬¥é¥­¨ï\n");
pos=ltell(fd);
printf("\n%04X %04X", pos->high, pos->low);
close(fd);
}
+601
View File
@@ -0,0 +1,601 @@
/**************************************************************
lzhuf.c
written by Haruyasu Yoshizaki 11/20/1988
some minor changes 4/6/1989
comments translated by Haruhiko Okumura 4/7/1989
MSX-C PROFI adaptation by MaxWolf, Aug-Sep 1992
EOF bugfix 1st April 1993
Š®¬¯¨«ïæ¨ï:
cc1 -m -c lzh3.c
cc2 lzh3
**************************************************************/
#define EOF (-1)
int getc(), putc();
char encount(), deinc(), decount(), memmove();
#pragma nonrec
/********** LZSS compression *************/
#define N 4096 /* à §¬¥à ¡ãä¥à  */
#define F 60 /* ¯à¥¤¢ à¨â¥«ì­ë© à §¬¥à ¡ãä¥à  */
#define THRESHOLD 2
#define NIL N /* «¨áâ ¤¥à¥¢  */
extern char text_buf[N + F - 1];
static int matchposition, matchlength;
extern int lson[N + 1], rson[N + 257], dad[N + 1];
/* ¨­¨æ¨ «¨§ æ¨ï ¤¥à¥¢ (¥¢) */
static int InitTree()
{
int *i, n;
for(i = &rson[N + 1], n = 256; n--;)
*i++ = NIL; /* ª®à¥­ì */
for(i = dad, n = N; n--;)
*i++ = NIL; /* ã§¥« */
}
/* § ­¥á⨠(¢áâ ¢¨âì) ¢ ¤¥à¥¢® */
static int InsertNode(r)
int r;
{
int i, p, cmp;
char *key;
unsigned c;
cmp = 1;
key = &text_buf[r];
p = N + 1 + (int)key[0];
rson[r] = lson[r] = NIL;
matchlength = 0;
for (;;) {
if (cmp >= 0) {
if (rson[p] != NIL)
p = rson[p];
else {
rson[p] = r;
goto i1;
}
} else {
if (lson[p] != NIL)
p = lson[p];
else {
lson[p] = r;
i1: dad[r] = p;
return;
}
}
for (i = 1; i < F; i++)
if ((cmp = (int)key[i] - (int)text_buf[p + i]) != 0)
break;
if (i > THRESHOLD) {
if (i > matchlength) {
matchposition = ((r - p) & (N - 1)) - 1;
if ((matchlength = i) >= F)
break;
}
if (i == matchlength) {
if ((c = ((r - p) & (N - 1)) - 1) < matchposition) {
matchposition = c;
}
}
}
}
dad[r] = dad[p];
dad[ lson[r] = lson[p] ] = r;
dad[ rson[r] = rson[p] ] = r;
if (rson[ i = dad[p] ] == p)
rson[i] = r;
else
lson[i] = r;
dad[p] = NIL; /* 㤠«¨âì p */
}
/* 㤠«¨âì ¨§ ¤¥à¥¢  */
static int DeleteNode(p) int p;
{
int q, i;
if (dad[p] == NIL)
return; /* not registered */
if (rson[p] == NIL)
q = lson[p];
else
if (lson[p] == NIL)
q = rson[p];
else {
q = lson[p];
if (rson[q] != NIL) {
do {
q = rson[q];
} while (rson[q] != NIL);
dad[ rson[dad[q]] = lson[q] ] = dad[q];
;
dad[ lson[q] = lson[p] ] = q;
}
dad[ rson[q] = rson[p] ] = q;
}
if (rson[ i = dad[q] = dad[p] ] == p)
rson[i] = q;
else
lson[i] = q;
dad[p] = NIL;
}
/* Š®¤¨à®¢ ­¨¥ • ä䬠­  */
#define N_CHAR (256 - THRESHOLD + F)
/* kinds of characters (character code = 0..N_CHAR-1) */
#define T (N_CHAR * 2 - 1) /* à §¬¥à â ¡«¨æë */
#define R (T - 1) /* ¯®§¨æ¨ï ª®à­ï */
#define MAX_FREQ 0x8000 /* updates tree when the */
/* root frequency comes to this value */
typedef char uchar;
/* ’ ¡«¨æë ª®¤¨à®¢ ­¨ï ¨ ¤¥ª®¤¨à®¢ ­¨ï 6-⨠¢¥àå­¨å (upper) ¡¨â ¯®§¨æ¨¨ */
/* ¤«ï ª®¤¨à®¢ ­¨ï */
static uchar p_len[64] = {
0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05,
0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08
};
static uchar p_code[64] = {
0x00, 0x20, 0x30, 0x40, 0x50, 0x58, 0x60, 0x68,
0x70, 0x78, 0x80, 0x88, 0x90, 0x94, 0x98, 0x9C,
0xA0, 0xA4, 0xA8, 0xAC, 0xB0, 0xB4, 0xB8, 0xBC,
0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE,
0xD0, 0xD2, 0xD4, 0xD6, 0xD8, 0xDA, 0xDC, 0xDE,
0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEC, 0xEE,
0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
};
/* ¤«ï ¤¥ª®¤¨à®¢ ­¨ï */
static uchar d_code[256] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D,
0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F,
0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11,
0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13,
0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15,
0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17,
0x18, 0x18, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B,
0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1F, 0x1F,
0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23,
0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27,
0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B,
0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
};
static uchar d_len[256] = {
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
};
extern unsigned freq[T + 1]; /* â ¡«¨æ  ç áâ®âë */
extern int prnt[T + N_CHAR]; /* pointers to parent nodes, except for the */
/* elements [T..T + N_CHAR - 1] which are used to get */
/* the positions of leaves corresponding to the codes. */
extern int son[T]; /* pointers to child nodes (son[], son[] + 1) */
static unsigned getbuf;
static uchar getlen;
#define GetBit() _GetBit((char)0)
#define GetByte() _GetBit((char)1)
/* ¯®«ãç¨âì ®¤¨­/¢®á¥¬ì ¡¨â */
/* get one/eight bit(s) */
static int _GetBit(f)
char f;
{
unsigned i;
while (getlen <= 8) {
if ((int)(i = getc()) == EOF) break; /* i = 0; */
getbuf |= i << (8 - getlen);
getlen += 8;
}
i = getbuf;
if (f) {
getbuf <<= 8;
getlen -= 8;
return i >> 8;
} else {
getbuf <<= 1;
--getlen;
return ((int)i < 0);
}
}
/*int GetByte()
{
unsigned i;
while (getlen <= 8) {
if ((i = getc()) == EOF) i = 0;
getbuf |= i << (8 - getlen);
getlen += 8;
}
i = getbuf;
getbuf <<= 8;
getlen -= 8;
return i >> 8;
}*/
static unsigned putbuf;
static uchar putlen;
static int Putcode(l,c) int l;unsigned c; /* output c bits of code */
{
putbuf |= c >> putlen;
if ((putlen += l) >= 8) {
putc(putbuf >> 8);
if ((putlen -= 8) >= 8) {
putc(putbuf);
putlen -= 8;
putbuf = c << (l - putlen);
} else {
putbuf <<= 8;
}
}
}
/* initialization of tree */
static int StartHuff()
{
int i, j;
for (i = 0; i < N_CHAR; i++) {
freq[i] = 1;
son[i] = i + T;
prnt[i + T] = i;
}
i = 0; j = N_CHAR;
while (j <= R) {
freq[j] = freq[i] + freq[i + 1];
son[j] = i;
prnt[i] = prnt[i + 1] = j;
i += 2; j++;
}
freq[T] = 0xFFFF;
prnt[R] = 0;
}
/* reconstruction of tree */
static int reconst()
{
int i, j, k;
unsigned f, l;
/* collect leaf nodes in the first half of the table */
/* and replace the freq by (freq + 1) / 2. */
j = 0;
for (i = 0; i < T; i++) {
if (son[i] >= T) {
freq[j] = (freq[i] + 1) / 2;
son[j] = son[i];
j++;
}
}
/* begin constructing tree by connecting sons */
for (i = 0, j = N_CHAR; j < T; i += 2, j++) {
k = i + 1;
f = freq[j] = freq[i] + freq[k];
for (k = j - 1; f < freq[k]; k--);
k++;
l = (j - k) * 2;
memmove(&freq[k + 1], &freq[k], l);
freq[k] = f;
memmove(&son[k + 1], &son[k], l);
son[k] = i;
}
/* connect prnt */
for (i = 0; i < T; i++) {
if ((k = son[i]) >= T) {
prnt[k] = i;
} else {
prnt[k] = prnt[k + 1] = i;
}
}
}
/* increment frequency of given code by one, and update tree */
static int update(c) int c;
{
int i, j, k, l;
if (freq[R] == MAX_FREQ) {
reconst();
}
c = prnt[c + T];
do {
k = ++freq[c];
/* if the order is disturbed, exchange nodes */
if (k > freq[l = c + 1]) {
while (k > freq[++l]);
l--;
freq[c] = freq[l];
freq[l] = k;
i = son[c];
prnt[i] = l;
if (i < T) prnt[i + 1] = l;
j = son[l];
son[l] = i;
prnt[j] = c;
if (j < T) prnt[j + 1] = c;
son[c] = j;
c = l;
}
} while ((c = prnt[c]) != 0); /* repeat up to root */
}
static EncodeChar(c) unsigned c;
{
unsigned i;
int j, k;
#ifdef DEBUG
printf("char[%x]\n",c);
#endif
i = j = 0;
k = prnt[c + T];
/* travel from leaf to root */
do {
i >>= 1;
/* if node's address is odd-numbered, choose bigger brother node */
if (k & 1) i += 0x8000;
j++;
} while ((k = prnt[k]) != R);
Putcode(j, i);
update(c);
}
static EncodePosition(c) unsigned c;
{
unsigned i;
#ifdef DEBUG
printf("pos[%x]\n",c);
#endif
/* output upper 6 bits by table lookup */
i = c >> 6;
Putcode((int)p_len[i], (unsigned)p_code[i] << 8);
/* output lower 6 bits verbatim */
Putcode(6, (c & 0x3f) << 10);
}
static EncodeEnd()
{
if (putlen) {
putc(putbuf >> 8);
}
}
static int DecodeChar()
{
unsigned c;
c = son[R];
/* travel from root to leaf, */
/* choosing the smaller child node (son[]) if the read bit is 0, */
/* the bigger (son[]+1} if 1 */
while (c < T) {
c += GetBit();
c = son[c];
}
c -= T;
update(c);
#ifdef DEBUG
printf("char[%x]\n",c);
#endif
return c;
}
static int DecodePosition()
{
unsigned i, j, c;
/* recover upper 6 bits from table */
i = GetByte();
c = (unsigned)d_code[i] << 6;
j = d_len[i] - 2;
/* read lower 6 bits verbatim */
while (j--) {
i = (i << 1) + GetBit();
}
c |= (i & 0x3F);
#ifdef DEBUG
printf("pos[%x]\n",c);
#endif
return c;
}
/*-- “¯ ª®¢ª / á¯ ª®¢ª  --*/
/* “¯ ª®¢ª  */
char Encode()
{
int i, c, len, r, s, last_matchlength;
StartHuff();
InitTree();
putbuf = putlen = 0;
s = 0;
r = N - F;
for (i = s; i < r; i++)
text_buf[i] = ' ';
for (len = 0; len < F && (c = getc()) != EOF; len++)
text_buf[r + len] = c;
encount(len);
for (i = 1; i <= F; i++)
InsertNode(r - i);
InsertNode(r);
do {
if (matchlength > len)
matchlength = len;
if (matchlength <= THRESHOLD) {
matchlength = 1;
EncodeChar((int)text_buf[r]);
} else {
EncodeChar(255 - THRESHOLD + matchlength);
EncodePosition(matchposition);
}
last_matchlength = matchlength;
for (i = 0; i < last_matchlength &&
(c = getc()) != EOF; i++) {
DeleteNode(s);
text_buf[s] = c;
if (s < F - 1)
text_buf[s + N] = c;
s = (s + 1) & (N - 1);
r = (r + 1) & (N - 1);
InsertNode(r);
}
encount(i);
while (i++ < last_matchlength) {
DeleteNode(s);
s = (s + 1) & (N - 1);
r = (r + 1) & (N - 1);
if (--len) InsertNode(r);
}
} while (len > 0);
EncodeEnd();
}
/*  á¯ ª®¢ª  */
char Decode()
{
int i, j, k, r, c;
StartHuff();
getbuf = getlen = 0;
for (i = 0; i < N - F; i++)
text_buf[i] = ' ';
r = N - F;
while (decount() || getlen) {
c = DecodeChar();
if (c < 256) {
putc(c);
text_buf[r++] = c;
r &= (N - 1);
deinc();
} else {
i = (r - DecodePosition() - 1) & (N - 1);
j = c - 255 + THRESHOLD;
for (k = 0; k < j; k++) {
c = text_buf[(i + k) & (N - 1)];
putc(c);
text_buf[r++] = c;
r &= (N - 1);
deinc();
}
}
}
}
+19
View File
@@ -0,0 +1,19 @@
#include <conio.h>
#include <mouse.h>
MSSTAT *p;
void main()
{
initMouse();
showMouse();
while(!kbhit())
{
p = getStatMouse();
cprintf("BUTTON: %d Col: %02d Line: %02d\r",
(char *)p->button,
(char *)p->x,
(char *)p->y);
}
}
+20
View File
@@ -0,0 +1,20 @@
#include <stdio.h>
#include <mouse.h>
void main()
{
MSSENS *p;
p = getSensMouse();
printf("X: %x Y: %x\n", (char*)p->xsens, (char *)p->ysens);
p->xsens = 2;
p->ysens = 3;
setSensMouse(p);
p = getSensMouse();
printf("X: %x Y: %x\n", (char*)p->xsens, (char *)p->ysens);
}
+16
View File
@@ -0,0 +1,16 @@
#include <stdio.h>
#include <mouse.h>
void main()
{
MSSENS *p;
p->xsens = 2;
p->ysens = 3;
setSensMouse(p);
p = getSensMouse();
printf("X: %x Y: %x\n", (char*)p->xsens, (char *)p->ysens);
}
+12
View File
@@ -0,0 +1,12 @@
#include <io.h>
FD fd;
void main()
{
fd = open("test.txt", O_RDONLY);
if(fd == -1)
perror("open failed on input file");
else
close(fd);
}
+8
View File
@@ -0,0 +1,8 @@
#include <stdio.h>
int num = 0x07D4;
void main()
{
printf("Year: %d\n",num);
}
+1
View File
@@ -0,0 +1 @@
ਬ¥ΰλ ¨α―®«μ§®Ά ­¨ο ­¥®β®ΰλε δγ­ζ¨©.
+15
View File
@@ -0,0 +1,15 @@
#include <stdio.h>
#include <io.h>
FD fd;
uint pos,i;
void main()
{
fd=open("test.txt", O_RDONLY);
i = 10;
if((pos=seek(fd, i, SEEK_SET)) == -1)
printf("Žè¨¡ª  ¯¥à¥¬¥é¥­¨ï\n");
printf("\n%04X",pos);
close(fd);
}
+7
View File
@@ -0,0 +1,7 @@
@echo off
cc1 -m sort2.c
cc2 sort2.tmc
as sort2.asm
ld sort2,clib/l/gXMAIN /x
del sort2.rel
del sort2.asm
+393
View File
@@ -0,0 +1,393 @@
/*
MM> ®á¬®âà¨â¥, ¯«¨§ ã ᥡï, ¬®¦¥â ã ª®£®-­¨âì ¥áâì ®¯¨á ­¨¥ ¬¥â®¤®¢
MM> á®àâ¨à®¢ª¨ (quick sort, buble sort, ŠŒ ¨ â.¤.). ˆå â ¬ ¯à¨¬¥à­® 6
MM> ¥áâì. ˆ­â¥à¥áãîâ ¨¬¬¥­®  «£®à¨â¬ë á ®¯¨á ­¨¥¬, ª®â®àë¥ ï ¨á¯®«ì§ãî
MM> ¯®â®¬ ¤«ï ªãàᮢ®© à ¡®âë. Ѝ­â¥ ¬­¥, ¯¦ «áâ , ¨«¨ ¯®¤¥«¨â¥áì url¨ª®¬.
MM> ‘¯ á¨¡®!
EI> ޝ¨è¨â¥ c ¯p¨¬¥p ¬¨ ­  ¯ cª «¥, ¯®¦ «ã©câ , ®c­®¢­ë¥ ¬¥â®¤ë
EI> c®pâ¨p®¢ª¨,
EI> 祬 ¡®«ìè¥ â¥¬ «ãçè¥, ¢c¥¬ § p ­¥¥ ®£p®¬­®¥ c¯ c¨¡®«
H . H® ­  C (â ¬ ­  ᪮«ìª® ï ¯®­ï« £« ¢­®¥  «£®à¨â¬ë ­ã¦­ë). Ÿ ¯¨á « ¨
ª®¬¯¨«¨« ¯®¤ BC3.1. ।áâ ¢«ï¥â ᮡ®© ¯à®£ã ¯® á¡®àã áâ â¨á⨪¨ íä䥪⨢-
­®á⨠ «£®à¨â¬®¢.
à®èã ¯®ªà¨â¨ª®¢ âì :) (å®âï ®¯ïâì ¦¥ á ¡¦ ¡ë« ­  ¯¥à¢®¬ ªãàá¥).
----------------
*/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define SIZE 15
/* Prototypes */
void Binsort();
void Choise();
void Include();
void Bubble();
void Quick();
void Shell();
void Join();
void Prn();
void Test();
unsigned ITERATION, // Š®«¨ç¥á⢮ ¯à®©¤¥­ëå æ¨ª«®¢
EXCHANGES, // ®¡¬¥­®¢ ï祥ª
CONDITIONS; // ¯à®©¤¥­ëå ãá«®¢¨©
int Mass[SIZE];
int i, NumElem;
char key;
/* ÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ */
int main()
{
NumElem = sizeof(Mass) / sizeof(Mass[0]);
clrscr();
do {
for(i=0; i < NumElem; i++) Mass[i] = rand() % 100 - 50;
clrscr();
puts("Œ¥­î:\n");
puts(" 1. ‘®àâ¨à®¢ª  ®¡¬¥­ ¬¨ (¬¥â®¤ ¯ã§ëà쪠)");
puts(" 2. ‘®àâ¨à®¢ª  ¢ë¡®à®¬");
puts(" 3. ‘®àâ¨à®¢ª  ¯à®áâ묨 ¢áâ ¢ª ¬¨");
puts(" 4. ‘®àâ¨à®¢ª  ¡¨­ à­ë¬¨ ¢áâ ¢ª ¬¨ (¢áâ ¢ª  ¤¥«¥­¨¥¬ ¯®¯®« ¬)");
puts(" 5. ‘®àâ¨à®¢ª  ¬¥â®¤®¬ ˜¥«« ");
puts(" 6. ‘®àâ¨à®¢ª  ¡ëáâàë¬ ¬¥â®¤®¬\n");
puts(" 7. ‘«¨ï­¨¥ á®àâ¨à®¢ ­­ëå ¬ áᨢ®¢");
puts(" 8. ’¥áâ ­  ¯à®¨§¢®¤¨â¥«ì­®áâì\n");
puts(" ESC. ‚ë室\n\n->");
if ((key=getch()) == 27)
goto done;
clrscr();
if (key >= '0' && key <= '6')
{
cprintf("\nŒ áᨢ (®à¨£¨­ «):");
Prn(Mass, NumElem);
}
ITERATION=EXCHANGES=CONDITIONS=0;
switch(key)
{
case '1': Bubble(Mass, NumElem); break;
case '2': Choise(Mass, NumElem); break;
case '3': Include(Mass, NumElem); break;
case '4': Binsort(Mass, NumElem); break;
case '5': Shell(Mass, NumElem); break;
case '6': Quick(Mass, 0, NumElem); break;
case '7': Join(); continue;
case '8': Test(Mass, NumElem); continue;
default : continue;
}
cprintf("\n(á®àâ¨à®¢ ­­ë©):");
Prn(Mass, NumElem);
cprintf("\n\n\nਠá®àâ¨à®¢ª¥ ¯®âॡ®¢ «®áì ¨â¥à æ¨©: %d\n",ITERATION);
cprintf(" ¯à®¨§¢¥¤¥­® ®¡¬¥­®¢ ï祥ª: %d\n",EXCHANGES);
cprintf(" ¯à®©¤¥­® ãá«®¢¨©: %d\n",CONDITIONS);
puts("\n\n\nAny key...");
getch();
} while(1);
done:
puts("\n\nSee you... ;)");
return 0;
}
/*.......................................................................*/
void Prn(PtrMass, count)
int *PtrMass, count;
{
int i;
cprintf("\n[");
for (i=0; i < count; i++)
cprintf(" %3d", PtrMass[i]);
puts("]");
}
/*.......................................................................*/
void Test(PtrMass, count)
int *PtrMass, count;
{
uint ITERATION1, EXCHANGES1, CONDITIONS1, ITERATION2,
EXCHANGES2, CONDITIONS2, ITERATION3, EXCHANGES3,
CONDITIONS3, ITERATION4, EXCHANGES4, CONDITIONS4,
ITERATION5, EXCHANGES5, CONDITIONS5, i, j;
ITERATION1=EXCHANGES1=CONDITIONS1=ITERATION2=EXCHANGES2=CONDITIONS2=0;
ITERATION3=EXCHANGES3=CONDITIONS3=ITERATION4=EXCHANGES4=CONDITIONS4=0;
ITERATION5=EXCHANGES5=CONDITIONS5=0;
clrscr();
puts("‘®àâ¨à®¢ª  ®¡¬¥­ ¬¨: ¯à®©¤¥­ëå æ¨ª«®¢ =");
puts(" ®¡¬¥­®¢ ï祩ª ¬¨ =");
puts(" ¯®áâ ¢«¥­­ëå ãá«®¢¨© =\n");
puts("‘®àâ¨à®¢ª  ¢ë¡®à®¬: ¯à®©¤¥­ëå æ¨ª«®¢ =");
puts(" ®¡¬¥­®¢ ï祩ª ¬¨ =");
puts(" ¯®áâ ¢«¥­­ëå ãá«®¢¨© =\n");
puts("‘®àâ¨à®¢ª  ¯à®áâ묨 ¢áâ ¢ª ¬¨: ¯à®©¤¥­ëå æ¨ª«®¢ =");
puts(" ®¡¬¥­®¢ ï祩ª ¬¨ =");
puts(" ¯®áâ ¢«¥­­ëå ãá«®¢¨© =\n");
puts("‘®àâ¨à®¢ª  ¡¨­ à­ë¬¨ ¢áâ ¢ª ¬¨: ¯à®©¤¥­ëå æ¨ª«®¢ =");
puts(" ®¡¬¥­®¢ ï祩ª ¬¨ =");
puts(" ¯®áâ ¢«¥­­ëå ãá«®¢¨© =\n");
puts("‘®àâ¨à®¢ª  ¬¥â®¤®¬ ˜¥«« : ¯à®©¤¥­ëå æ¨ª«®¢ =");
puts(" ®¡¬¥­®¢ ï祩ª ¬¨ =");
puts(" ¯®áâ ¢«¥­­ëå ãá«®¢¨© =\n");
puts("‘®àâ¨à®¢ª  ¡ëáâàë¬ ¬¥â®¤®¬: ¯à®©¤¥­ëå æ¨ª«®¢ =");
puts(" ®¡¬¥­®¢ ï祩ª ¬¨ =");
puts(" ¯®áâ ¢«¥­­ëå ãá«®¢¨© =");
for(j=1; j <= 100; j++)
{
ITERATION=EXCHANGES=CONDITIONS=0;
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
Bubble(PtrMass ,count);
ITERATION1+=ITERATION; EXCHANGES1+=EXCHANGES; CONDITIONS1+=CONDITIONS;
gotoxy(52,1); cprintf("%d ",ITERATION1/j);
gotoxy(52,2); cprintf("%d ",EXCHANGES1/j);
gotoxy(52,3); cprintf("%d ",CONDITIONS1/j);
ITERATION=EXCHANGES=CONDITIONS=0;
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
Choise(PtrMass ,count);
ITERATION2+=ITERATION; EXCHANGES2+=EXCHANGES; CONDITIONS2+=CONDITIONS;
gotoxy(52,5); cprintf("%d ",ITERATION2/j);
gotoxy(52,6); cprintf("%d ",EXCHANGES2/j);
gotoxy(52,7); cprintf("%d ",CONDITIONS2/j);
ITERATION=EXCHANGES=CONDITIONS=0;
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
Include(PtrMass ,count);
ITERATION3+=ITERATION; EXCHANGES3+=EXCHANGES; CONDITIONS3+=CONDITIONS;
gotoxy(52,9); cprintf("%d ",ITERATION3/j);
gotoxy(52,10); cprintf("%d ",EXCHANGES3/j);
gotoxy(52,11); cprintf("%d ",CONDITIONS3/j);
ITERATION=EXCHANGES=CONDITIONS=0;
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
Binsort(PtrMass ,count);
ITERATION4+=ITERATION; EXCHANGES4+=EXCHANGES; CONDITIONS4+=CONDITIONS;
gotoxy(52,13); cprintf("%d ",ITERATION4/j);
gotoxy(52,14); cprintf("%d ",EXCHANGES4/j);
gotoxy(52,15); cprintf("%d ",CONDITIONS4/j);
ITERATION=EXCHANGES=CONDITIONS=0;
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
Shell(PtrMass ,count);
ITERATION5+=ITERATION; EXCHANGES5+=EXCHANGES; CONDITIONS5+=CONDITIONS;
gotoxy(52,17); cprintf("%d ",ITERATION5/j);
gotoxy(52,18); cprintf("%d ",EXCHANGES5/j);
gotoxy(52,19); cprintf("%d ",CONDITIONS5/j);
ITERATION=EXCHANGES=CONDITIONS=0;
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
Quick(PtrMass , 0, count);
ITERATION5+=ITERATION; EXCHANGES5+=EXCHANGES; CONDITIONS5+=CONDITIONS;
gotoxy(52,21); cprintf("%d ",ITERATION5/j);
gotoxy(52,22); cprintf("%d ",EXCHANGES5/j);
gotoxy(52,23); cprintf("%d ",CONDITIONS5/j);
}
puts("\n\n\nOk...");
getch();
}
/*.......................................................................*/
void Include(PtrMass, count)
int *PtrMass, count;
{
int i, j, temp;
for (i=1; i< count; ++i)
{
temp=PtrMass[i];
for (j=i-1; j>=0 && temp<PtrMass[j]; j--)
{
ITERATION++;
EXCHANGES++;
PtrMass[j+1]=PtrMass[j];
}
ITERATION++;
PtrMass[j+1]=temp;
}
ITERATION -= count-1;
}
/*.......................................................................*/
void Binsort(PtrMass, count)
int *PtrMass, count;
{
int i, j, pos, a, b, middle, num;
for (i=1; i < count; i++)
{
a=0; /* H¨¦­ïï £à ­¨æ  ¯®¨áª  = 1-¬ã í«-âã */
b=i; /* ‚¥àå­ïï = á® 2 ¯® count */
EXCHANGES++;
num=PtrMass[i]; /* —¨á«® ¤«ï ª®â. ­ã¦­® ­ ©â¨ ¬¥áâ® */
while ( a!=b ) /* ...¯®ª  £à ­¨æë ­¥ ᫨«¨áì... */
{
middle=(a+b)/2; /* –¥« ï ç áâì áà. à¨ä¬. áã¬¬ë £à ­¨æ */
if (num > PtrMass[middle]) /* ..¥á«¨ ç¨á«® >ç¨á«  áâ®ïé.¯®¤ */
{ /* ­®¬¥à®¬ middle â®: */
a=middle+1; /* ­¨¦. £à ­. = 業âàã+1 */
} /* */
else /* ¨«¨ */
{ /* */
b = middle; /* ¢¥àå­ïï £à ­¨æ  = 業âàã... */
}
CONDITIONS++;
ITERATION++;
}
pos=a; /* ‘®¤¥à¦¨â ­ ©¤¥­­ãî ¯®§¨æ¨î ­  ª®â. */
/* ­ã¦­® ¯®áâ ¢¨âì ç¨á«® */
for (j=i; j > pos; j--)
{ /* ®¤¢¨£ ¥¬ (­  1 ¢¯à ¢®) í«-âë */
PtrMass[j]=PtrMass[j-1]; /* ¬ áᨢ  «¥¦ é¨¥ ¯¥à¥¤ í«¥¬¥­â®¬, */
EXCHANGES++;
ITERATION++; /* ¤«ï ª®â®à®£® ¨é¥âáï ¬¥áâ® ®á¢®- */
} /* ¡®¦¤ ï 1 ¬¥áâ® */
PtrMass[pos]=num; /* “áâ ­ ¢«¨¢ ¥¬ í«¥¬¥­â ­  ¬¥áâ® */
}
}
/*.......................................................................*/
void Bubble(PtrMass, count)
int *PtrMass, count;
{
int i,j;
for (i=0; i<count; i++)
for (j=i+1; j<count; j++)
{
if (PtrMass[i] > PtrMass[j])
{
PtrMass[i]+=PtrMass[j];
PtrMass[j]= PtrMass[i] - PtrMass[j];
PtrMass[i]-=PtrMass[j];
EXCHANGES++;
CONDITIONS++;
}
ITERATION++;
}
}
/*.......................................................................*/
void Choise(PtrMass, count)
int *PtrMass, count;
{
int i,j;
for (i=0; i<count; i++)
for (j=0; j<count-1; j++)
{
if(PtrMass[j]>PtrMass[j+1])
{
PtrMass[j]+=PtrMass[j+1];
PtrMass[j+1]=PtrMass[j]-PtrMass[j+1];
PtrMass[j]-=PtrMass[j+1];
EXCHANGES++;
CONDITIONS++;
}
ITERATION++;
}
}
int A[]={-1,1,2,3,3}, B[]={-2,0,2,4,4};
/*.......................................................................*/
/* ‘«¨ï­¨¥ ¤¢ãå ®âá®àâ¨à®¢ ­­ëå ¢¥ªâ®à®¢ ¢ ®¤¨­ */
void Join()
{
int C[10], i,j,k;
for (i=j=k=0; k < 10; k++)
{
if (A[i] <= B[j])
{ C[k]=A[i]; i++; }
else
{ C[k]=B[j]; j++; }
}
cprintf("\nŒ áᨢ A[]:");
Prn(A, sizeof(A) / sizeof(A[0]));
cprintf("\nŒ áᨢ B[]:");
Prn(B, sizeof(B) / sizeof(B[0]));
cprintf("\nŒ áᨢ C[]:");
Prn(C, sizeof(C) / sizeof(C[0]));
puts("\n\n\nAny key...");
getch();
}
int aa[]={9,5,3,2,1};
/*.......................................................................*/
void Shell(PtrMass, count)
int *PtrMass, count;
{
int i, j, gap, k, x;
for(k=0; k < 5; k++)
{
gap = aa[k];
for(i=gap; i < count; ++i)
{
x=PtrMass[i];
for(j=i-gap; x < PtrMass[j] && j >= 0; j = j-gap)
{
PtrMass[j+gap]=PtrMass[j];
ITERATION++;
EXCHANGES++;
}
PtrMass[j+gap]=x;
}
}
}
/*.......................................................................*/
void Quick(PtrMass, left, right)
int *PtrMass, left, right;
{
int x, y, i, j;
i = left;
j = right;
x = PtrMass[(left+right) / 2];
do {
while(PtrMass[i] < x && i < right) { i++; ITERATION++; }
while(x < PtrMass[j] && j > left) { j--; ITERATION++; }
if(i <= j)
{
y=PtrMass[i];
PtrMass[i]=PtrMass[j];
PtrMass[j]=y;
i++;
j--;
EXCHANGES++;
CONDITIONS++;
}
} while(i <= j);
if(left < j) Quick(PtrMass,left,j);
if(i < right) Quick(PtrMass,i,right);
}
+9
View File
@@ -0,0 +1,9 @@
#include <stdio.h>
char buffer[20];
char *s = "computer";
void main()
{
sprintf(buffer,"%s",s);
}
+16
View File
@@ -0,0 +1,16 @@
#include <stdio.h>
#include <io.h>
FD fd;
uint pos,i;
void main()
{
fd=open("test.txt", O_RDONLY);
i = 10;
if((seek(fd, i, SEEK_SET)) == -1)
printf("Žè¨¡ª  ¯¥à¥¬¥é¥­¨ï\n");
pos=tell(fd);
printf("\n%04X",pos);
close(fd);
}
+1
View File
@@ -0,0 +1 @@
SOLID C v0.01b for Sprinter-2000
+25
View File
@@ -0,0 +1,25 @@
/*
* CONIO.H
*
* Low-level console functions.
* (c) 2004, SOLID C Sprinter-2000
*/
#ifndef _C_TYPES_
#include <types.h>
#endif
char getch();
char getche();
void putch();
void cputs();
void clrscr();
void home();
void gotoxy();
char *cgets();
char inp();
char outp();
BOOL kbhit();
int cprintf(.);
+23
View File
@@ -0,0 +1,23 @@
/*
* CTYPE.H
*
* Character type classification.
* (c) 2004, SOLID C Sprinter-2000
*/
char tolower(); /* convert to lowercase */
char toupper(); /* convert to uppercase */
BOOL islower(); /* lowercase test */
BOOL isupper(); /* uppercase test */
BOOL isalnum(); /* A..Z a..z 0..9 */
BOOL isalpha(); /* A..Z a..z */
BOOL isascii(); /* !..~ */
BOOL isdigit(); /* 0..9 */
BOOL isxdigit(); /* hex digit test */
BOOL isspace(); /* space test */
BOOL iscntrl(); /* unprintable control symbol */
BOOL isgraph(); /* has graphic reprezentation */
BOOL isprint(); /* printable test */
BOOL ispunct(); /* punctuation sign test */
+18
View File
@@ -0,0 +1,18 @@
/*
* DIRECT.H
*
* Defines structures, macros, and functions for dealing
* with directories and pathnames.
* (c) 2004, SOLID C Sprinter-2000
*/
#ifndef _C_TYPES_
#include <types.h>
#endif
char chdir();
char *getcwd();
char mkdir();
char rmdir();
+100
View File
@@ -0,0 +1,100 @@
/*
* DOS.H
*
* Defines structs, unions, and functions for
* dealing with Estex-DOS.
* (c) 2004, SOLID C Sprinter-2000
*/
#ifndef _C_TYPES_
#include <types.h>
#endif
/* Variables */
extern int _argc;
extern char **_argv;
/* DOS types */
struct WORDREGS {
unsigned af, bc, de, hl, ix, iy;
};
struct BYTEREGS {
char flag, a, c, b, e, d, l, h;
};
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
struct time {
unsigned char ti_min; /* minutes */
unsigned char ti_hour; /* hours */
unsigned char ti_hund; /* hundredths of seconds. Not used. */
unsigned char ti_sec; /* seconds */
};
struct date {
int da_year; /* year */
char da_day; /* day of the month */
char da_mon; /* month (1 = Jan) */
};
/* ffirst, fnext functions */
typedef struct ffblk {
char name[8]; /* +0 pattern of a file name */
char ext[3]; /* +8 pattern of file expansion */
char attrib; /* +11 search attribute */
char ff_resv[10]; /* +12 reserved for DOS */
uint ff_time; /* +22 time of last write to file */
uint ff_date; /* +24 date of last write to file */
uint ff_clst; /* +26 number of first cluster */
uint ff_lsize; /* +28 low size of file */
uint ff_hsize; /* +30 high size of file */
char ff_attr; /* +32 attribute byte of matched file */
char ff_name[223]; /* +33 null-terminated name of matched file */
} FIND;
/* file attributes */
#define FA_NORMAL 0x00 /* Normal file, no attributes */
#define FA_RDONLY 0x01 /* Read only attribute */
#define FA_HIDDEN 0x02 /* Hidden file */
#define FA_SYSTEM 0x04 /* System file */
#define FA_LABEL 0x08 /* Volume label */
#define FA_DIREC 0x10 /* Directory */
#define FA_ARCH 0x20 /* Archive */
/* Prototypes */
char bdos(); /* DOS call return status */
int bdosh(); /* DOS call return int */
void intdos(); /* DOS call, parameters and return as REGS */
void enable(); /* enable interrupts */
void disable(); /* disable interrupts */
char absread(); /* read sectors */
char abswrite(); /* write sectors */
char ffirst(); /* found first file */
char _ffirst(); /* found first file, format "FilenameExt" */
char fnext(); /* found next file */
int _setargv(); /* parsing arguments */
void setdisk(); /* set default disk */
char getdisk(); /* get default disk */
void setdate(); /* set system date */
void getdate(); /* get struct date */
void settime(); /* set system time */
void gettime(); /* get struct time */
void sleep();
#define findfirst ffirst
#define findnext fnext
+63
View File
@@ -0,0 +1,63 @@
/*
* ERRNO.H
*
* Defines the system error variable errno and the error
* numbers set by system calls.
* (c) 2004, SOLID C Sprinter-2000
*/
/* DOS Error Codes */
#define EZERO 0 /* No error */
#define EINVFNC 1 /* Invalid function */
#define EINVDRV 2 /* Invalid drive number */
#define ENOFILE 3 /* File not found */
#define ENOPATH 4 /* Path not found */
#define EINVHND 5 /* Invalid handle */
#define EMFILE 6 /* Too many open files */
#define EEXIST 7 /* File already exists */
#define EROFILE 8 /* File read only */
#define EROOT 9 /* Root overflow */
#define ENOSPACE 10 /* No free space */
#define ENOEMPTY 11 /* Directory not empty */
#define ECURDIR 12 /* Can't delete current directory */
#define EINVMED 13 /* Invalid media */
#define EOPER 14 /* Unknown operation */
#define EEXISDIR 15 /* Directory exist */
#define EINVFNAM 16 /* Invalid filename */
#define EINVEXE 17 /* Invalid EXE-file */
#define ENSUPEXE 18 /* Not supported EXE-file */
#define EACCES 19 /* Access denied */
#define ENORDY 20 /* Not ready */
#define ESEEK 21 /* Seek error */
#define ENOSECT 22 /* Sector not found */
#define ECRC 23 /* CRC error */
#define EWRTPRT 24 /* Write protect */
#define EREAD 25 /* Read error */
#define EWRITE 26 /* Write error */
#define EDRVFAIL 27 /* Drive failure */
#define EEXTND28 28 /* Extended error: 28 */
#define EEXTND29 29 /* Extended error: 29 */
#define ENOMEM 30 /* Not enough memory */
#define EINVMEM 31 /* Invalid memory block */
#define EEXTND32 32 /* Extended error: 32 */
#define EEXTND33 33 /* Extended error: 33 */
#define EEXTND34 34 /* Extended error: 34 */
#define EERR35 35 /* 35 */
#define EERR36 36 /* 36 */
#define EERR37 37 /* 37 */
#define EERR38 38 /* 38 */
#define EERR39 39 /* 39 */
#define EERR40 40 /* 40 */
#define EERR41 41 /* 41 */
#define EERR42 42 /* 42 */
#define EERR43 43 /* 43 */
#define EERR44 44 /* 44 */
#define EERR45 45 /* 45 */
#define EERR46 46 /* 46 */
#define EERR47 47 /* 47 */
#define EERR48 48 /* 48 */
#define EERR49 49 /* 49 */
#define EERR50 50 /* 50 */
+51
View File
@@ -0,0 +1,51 @@
/*
* IO.H
*
* Low-level nonbuffered file I/O.
* (c) 2004, SOLID C Sprinter-2000
*/
#ifndef _C_TYPES_
#include <types.h>
#endif
#ifndef _STD_LIB_
#include <stdlib.h>
#endif
#ifndef _STD_SEEK_
#define _STD_SEEK_
/* constants to be used as 3rd argument for "fseek" function */
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
#endif
/* Definition "open flags" */
#define O_WRONLY 0x01 /* 0 file write only */
#define O_RDONLY 0x02 /* 1 file read only */
#define O_RDWR 0x03 /* 1,0 file read/write */
#define O_TRUNC 0x04 /* 2 open with truncation */
#define O_CREAT 0x08 /* 3 create and open file */
#define O_EXCL 0x10 /* 4 exclusive open */
#define O_APPEND 0x20 /* 5 to end of file */
uint open(); /* opens/creates a file */
uint creat(); /* creates file */
size_t read(); /* read file */
size_t write(); /* write file */
uint close(); /* close file */
uint seek(); /* sets file pointer (range 0..65534) */
uint tell(); /* returns current position (range 0..65534) */
struct fpoint *lseek(); /* sets file pointer */
struct fpoint *ltell(); /* returns current position */
char unlink(); /* delete file */
char remove(); /* delete file */
char rename(); /* rename file */
BOOL isatty(); /* return "true" if FD is console I/O */
int ioctl(); /* control i/o for devices or files */
+19
View File
@@ -0,0 +1,19 @@
/*
* MALLOC.H
*
* Memory management functions.
* (c) 2004, SOLID C Sprinter-2000
*/
#ifndef _C_TYPES_
#include <types.h>
#endif
int brk(); /* set free memory pointer */
char *sbrk(); /* move free memory pointer arg bytes higher */
char *malloc(); /* allocate memory */
char *calloc(); /* allocate object array, zero memory */
char *realloc(); /* reallocate memory */
void free(); /* free malloc'd memory */
+19
View File
@@ -0,0 +1,19 @@
/*
* MEM.H
*
* Memory manipulation functions.
* (c) 2004, SOLID C Sprinter-2000
*/
#ifndef _C_TYPES_
#include <types.h>
#endif
int memcmp(); /* compare two memory blocks */
void *memcpy(); /* copy memory block */
void *memmove(); /* copy memory block */
void *memset(); /* fill memory with byte */
void movmem(); /* memory copy */
void setmem(); /* memory fill */
+112
View File
@@ -0,0 +1,112 @@
/*
* MOUSE.H
*
* Defines structures, macros, and functions.
* (c) 2004, SOLID C Sprinter-2000
*/
#ifndef _C_TYPES_
#include <types.h>
#endif
#define LEFT_BUTTON 1
#define RIGHT_BUTTON 2
/* getStatMouse() */
typedef struct {
char button; /* buttons: 0/1 bits - left/right */
char x; /* colon */
char y; /* line */
} MSSTAT;
/* getGStatMouse() */
typedef struct {
char button; /* buttons: 0/1 bits - left/right */
int x; /* X pos */
int y; /* Y pos */
} MSGSTAT;
/* getCursMouse() */
typedef struct {
char width; /* width curs */
char high; /* high curs */
char xpoint; /* X active point */
char ypoint; /* Y active point */
char *buff; /* addr cursor buffer */
} MSCURS;
/* setTxtMouse() */
typedef struct {
char xattr; /* XOR attribut mask */
char aattr; /* AND attribut mask */
char xsym; /* XOR simbol mask */
char asym; /* AND simbol mask */
} MSTXT;
/* getSensMouse(), setSensMouse() */
typedef struct {
char xsens; /* horiz. sensitive */
char ysens; /* vert. sensitive */
} MSSENS;
// 0 - ­¥â ®è¨¡®ª
// 1 - ­¥¨§¢¥áâ­ ï äã­ªæ¨ï
// 3 - ªãàá®à 㦥 ­  íªà ­¥
// 4 - ªãàá®à ®âáãâáâ¢ã¥â ­  íªà ­¥
// 5 - ¨§®¡à ¦¥­¨¥ ªãàá®à  ᫨誮¬ ¢¥«¨ª®
/* Mouse Error Codes */
#define MSEZERO 0 /* No error */
#define MSUNKNW 1 /* Unknown function */
#define MSEXIST 3 /* Exists cursor */
#define MSNOCUR 4 /* No cursor */
#define MSTOOBIG 5 /* Too big image */
/* prototypes */
char ms_init();
char ms_show();
char ms_hide();
MSSTAT *ms_stat();
MSGSTAT *msgstat();
char ms_spos();
char mssgpos();
char ms_ybnd();
char ms_xbnd();
char ms_scur();
char ms_tcur();
MSCURS *ms_gcur();
MSSENS *ms_gsen();
char ms_ssen();
char ms_hard();
char ms_vmod();
char ms_ref();
#define initMouse ms_init
#define showMouse ms_show
#define hideMouse ms_hide
#define getStatMouse ms_stat
#define getGStatMouse msgstat
#define setPosMouse ms_spos
#define setGPosMouse mssgpos
#define yLimMouse ms_ybnd
#define xLimMouse ms_xbnd
#define setTxtMouse ms_tcur
#define getCursMouse ms_gcur
#define setCursMouse ms_scur
#define getSensMouse ms_gsen
#define setSensMouse ms_ssen
#define hardMouse ms_hard
#define vmodeMouse ms_vmod
#define refreshMouse ms_ref
+22
View File
@@ -0,0 +1,22 @@
/*
* SETJMP.H
*
* Defines typedef and functions for setjmp/longjmp.
* (c) 2004, SOLID C Sprinter-2000
*/
#ifndef _C_TYPES_
#include <types.h>
#endif
typedef struct {
uint j_sp;
uint j_iy;
uint j_pc;
} jmp_buf;
int setjmp(); /* set nonlocal jump return point */
void longjmp(); /* do a nonlocal jump */
+15
View File
@@ -0,0 +1,15 @@
/*
* STAT.H
*
* Definitions used for file status functions.
* (c) 2004, SOLID C Sprinter-2000
*/
#ifndef _C_TYPES_
#include <types.h>
#endif
#define S_IWRITE 0x01 /* owner may write */
#define S_IREAD 0x02 /* owner may read */
+13
View File
@@ -0,0 +1,13 @@
/*
* STDARG.H
*
* Definitions for accessing parameters in functions that
* accept a variable number of arguments.
* (c) 2004, SOLID C Sprinter-2000
*/
#ifndef __STDARG_
#define __STDARG_
typedef void *va_list; /* for vprintf's functions */
#endif
+117
View File
@@ -0,0 +1,117 @@
/*
* STDIO.H
*
* Definitions for stream input/output.
* (c) 2004, SOLID C Sprinter-2000
*/
#ifndef _C_TYPES_
#include <types.h>
#endif
#ifndef _STD_LIB_
#include <stdlib.h>
#endif
/* definition of the control structure for streams */
typedef struct {
uint flags; /* +0,1 file status flags */
int level; /* +2,3 empty/fill level of buffer */
char *curp; /* +4,5 current active pointer */
int fd; /* +6,7 file descriptor for low-level i/o */
char *buffer; /* +8,9 addr data transfer buffer */
char hold; /* +10 ungetc char if no buffer */
short token; /* +11,12 reserved */
char dummy; /* +13 reserved */
} FILE; /* this is the FILE object */
/* "flags" bits definitions */
#define _F_READ 0x0001 /* 0 read only file */
#define _F_WRIT 0x0002 /* 1 write only file */
#define _F_RDWR 0x0003 /* 0,1 read/write flag */
#define _F_BUF 0x0004 /* 2 malloc'ed Buffer data */
#define _F_LBUF 0x0008 /* 3 line-buffered file */
#define _F_ERR 0x0010 /* 4 error indicator */
#define _F_EOF 0x0020 /* 5 EOF indicator */
#define _F_BIN 0x0040 /* 6 binary file indicator */
#define _F_IN 0x0080 /* 7 data is incoming */
#define _F_OUT 0x0100 /* 0 +1 data is outgoing */
#define _F_TERM 0x0200 /* 1 +1 stdin stream */
#define EOF (-1) /* end of file indicator */
#define BUFSIZ 512 /* buffer size for high-level i/o */
#define OPEN_MAX 8 /* able to have 8 files */
extern FILE _iob[]; /* list of fcb */
/* standard I/O predefined streams */
#define stdin (&_iob[0])
#define stdout (&_iob[-1])
#define stderr (&_iob[-2])
#define stdaux (&_iob[-3])
#define stdprn (&_iob[-4])
/* for fgetpos, fsetpos functions */
typedef long fpos_t; /* file offset type */
#ifndef _STD_SEEK_
#define _STD_SEEK_
/* constants to be used as 3rd argument for "fseek" function */
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
#endif
/* Prototypes */
int printf(.);
int fprintf(.);
int sprintf(.);
int scanf(.);
int sscanf(.);
int fscanf(.);
void clearerr();
FILE *fdopen();
FILE *fopen();
FILE *freopen();
void fclosall();
char fclose();
size_t fread();
size_t fwrite();
struct fpoint *fseek();
struct fpoint *ftell();
char getc();
char putc();
char *gets();
char puts();
char *fgets();
char fputs();
char fgetc();
char fputc();
char ungetc();
char fflush();
void rewind();
char fgetpos();
char fsetpos();
/* The following macros provide for common functions */
#define fileno(a) ((a)->fd)
#define ferror(a) ((a)->flags & _F_ERR)
#define feof(a) ((a)->flags & _F_EOF)
#define fgetchar getc(stdin)
#define fputchar(c) putc((c),stdout)
+51
View File
@@ -0,0 +1,51 @@
/*
* STDLIB.H
*
* A header for a standart library CLIB.
* (c) 2004, SOLID C Sprinter-2000
*/
#ifndef _C_TYPES_
#include <types.h>
#endif
#ifndef _STD_LIB_
#define _STD_LIB_
char errno; /* must be declaration here */
/* for "div" function */
typedef struct divt {
uint quot; /* ç áâ­®¥ */
uint rem; /* ®áâ â®ª */
} div_t;
int abs();
int atoi();
int min();
int max();
int strtol();
int rand();
void *bsearch();
void qsort();
void srand();
void perror();
void exit();
void _exit();
void abort();
char atexit();
char *sysenv();
char *getenv();
uint putenv();
struct divt *div();
void hex8();
void hex16();
void hex32();
void dec8();
void dec16();
void dec32();
#endif
+33
View File
@@ -0,0 +1,33 @@
/*
* STRING.H
*
* String manipulation functions.
* (c) 2004, SOLID C Sprinter-2000
*/
#ifndef _C_TYPES_
#include <types.h>
#endif
void *memchr(); /* search for a character in memory block */
char *strcat();
char *strncat();
char *strchr();
int strcmp();
int strncmp();
char *strcpy();
char *strncpy();
size_t strcspn();
size_t strlen();
char *strlwr();
char *strpbrk();
char *strrchr();
size_t strspn();
char *strstr();
char *strtok();
char *strupr();
char *strerr();
#define strerror strerr;
+51
View File
@@ -0,0 +1,51 @@
/*
* TYPES.H
*
* General types definition for SOLID C.
* (c) 2004, SOLID C Sprinter-2000
*/
#ifndef _C_TYPES_
#define _C_TYPES_
typedef unsigned uint;
typedef char BYTE;
typedef char TINY;
typedef char BOOL;
typedef char STATUS;
typedef uint WORD;
typedef int FD; /* file discripter type */
/* for "seeks","tells" functions */
typedef struct fpoint {
uint low;
uint high;
} f_point;
typedef struct {
uint low;
uint high;
} LONG;
#define NULL 0
#define OK 0
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#define ERROR (-1)
#define FALSE 0
#define TRUE 1
#define YES 1
#define NO 0
#define FLOAT LONG
#ifndef _SIZE_T
#define _SIZE_T
typedef uint size_t;
#endif
#endif
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+452
View File
@@ -0,0 +1,452 @@
; ”㭪樨 ¯à®¢¥à¥­ë.
;
; ”㭪樨 _getscon, _getcon (­ã¦­ë ?), putdec (¢ë¢®¤ ç¨á«  ¢ ¤¥áïâ¨ç­®¬
; ä®à¬ â¥ ­  íªà ­) § ª®¬¬¥­â à¨­ë.
;
;
; ‚室ï騥 ä㭪樨:
;
; putch
; getch
; getche
; cputs
; clrscr
; home
; gotoxy
; kbhit
; cgets
; inp
; outp
;
MODULE putch
;
; "conio.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â ᨬ¢®« ¯àאַ ­  íªà ­.
;
; in: a = ᨬ¢®«
; out: ­¥â
;
; void putch(char *c)
;
putch_::
cp 0Ah
jr nz,cputc
call cputc
ld a,0Dh
cputc: ;push ix
ld c,5Bh
rst 10h
;pop ix
ret
ENDMODULE
MODULE getch
;
; "conio.h"
; ”ã­ªæ¨ï ç¨â ¥â ᨬ¢®« á ª« ¢¨ âãàë
; ¡¥§ ®â®¡à ¦¥­¨ï ­  íªà ­¥.
;
; in: ­¥â
; out: a = ¯à®ç¨â ­­ë© ᨬ¢®«
;
; char getch()
;
getch_::
;push ix
ld c,30h
rst 10h
;pop ix
ret
ENDMODULE
MODULE getche
;
; "conio.h"
; ”ã­ªæ¨ï ç¨â ¥â ᨬ¢®« á ª« ¢¨ âãàë á ®â®¡à ¦¥­¨¥¬ ­  íªà ­¥.
; ਠ­ ¦ â¨¨ ­  Ctrl+Z ¨«¨ Ctrl+C, ¢ë¤ ¥â §­ ç¥­¨¥ -1.
;
; in: ­¥â
; out: a = ¯à®ç¨â ­­ë© ᨬ¢®«
;
; char getche()
;
getche_::
@1: ;push ix
ld c,32h
rst 10h
ld a,e
;pop ix
bit 7,d
jr z,@3 ; normal input
bit 5,b
jr z,@3 ; not Ctrl+..
ld a,d
cp 0AAh ; Ctrl+Z (d = 7 bit "1")
jr z,@2
cp 0ACh ; Ctrl+C
jr nz,@1
@2: ld a,-1 ; end of input
ret
@3: cp 0Dh
ret nz
push af
ld a,0Ah
call putch_##
pop af
ret
ENDMODULE
MODULE cputs
;
; "conio.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â áâப㠯àאַ ­  íªà ­.
; ‘âப  ¤®«¦­  ®ª ­ç¨¢ âìáï ­ã«¥¬.
;
; in: hl =  ¤à¥á áâப¨
; out: ­¥â
;
; void cputs(char *str)
;
cputs_::
ld a,(hl)
or a
ret z
call putch_##
inc hl
jp cputs_
ENDMODULE
MODULE clrscr
;
; "conio.h"
; Žç¨é¥­¨¥ íªà ­ .
;
; in: ­¥â
; out: ­¥â
;
; void clrscr()
;
clrscr_::
ld de,0 ; «¥¢ë© ¢¥àå. 㣮«
ld hl,2050h ; Y/X à §¬¥àë ®ª­ 
ld bc,0756h ; b= âਡãâ ä®­ 
ld a," " ; ᨬ¢®« § ¯®«­¨â¥«ì
rst 10h
ret
ENDMODULE
MODULE home
;
; "conio.h"
; Šãàá®à ¢ «¥¢ë© ¢¥àå­¨© 㣮«.
;
; in: ­¥â
; out: ­¥â
;
; void home()
;
home_::
ld de,0 ; Y/X position cursor
ld c,52h
rst 10h
ret
ENDMODULE
MODULE gotoxy
;
; "conio.h"
; “áâ ­®¢¨âì ªãàá®à ­  X,Y ¯®§¨æ¨î.
;
; in: l,e = X,Y ª®®à¤¨­ âë
; out: ­¥â
;
; void gotoxy(int x, int y)
;
gotoxy_::
ld d,e ; Y ¯®«®¦.
ld e,l ; X ¯®«®¦.
dec d
dec e
ld c,52h
rst 10h
ret
ENDMODULE
MODULE kbhit
;
; "conio.h"
; ”ã­ªæ¨ï ¯à®¢¥àï¥â ­ ¦ â¨¥ ª« ¢¨è¨ ­  ª« ¢¨ âãà¥.
; ‚®§¢à é ¥â BOOL.
;
; in: ­¥â
; out: a=true - ª« ¢¨è  ­ ¦ â 
; a=false - ª« ¢¨è  ­¥ ­ ¦ â 
;
; BOOL kbhit()
;
kbhit_::
;push ix
ld c,33h
rst 10h
;pop ix
or a
ret z ; false
ld a,1 ; true
ret
ENDMODULE
MODULE cgets
;
; "conio.h"
; ”ã­ªæ¨ï ç¨â ¥â áâபã ᨬ¢®«®¢ ¯àאַ á ª®­á®«¨, § ¯®¬¨­ ¥â áâப㠨 ¥¥
; ¤«¨­ã ¢  à£ã¬¥­â¥ str. €à£ã¬¥­â str ¤®«¦¥­ ¡ëâì 㪠§ â¥«¥¬ ­  ¬ áᨢ
; ᨬ¢®«®¢. ¥à¢ë© í«¥¬¥­â ¬ áᨢ  - str[0] ¤®«¦¥­ ᮤ¥à¦ âì ¬ ªá¨¬ «ì­ãî
; ¤«¨­ã (¢ ᨬ¢®« å) ç¨â ¥¬®© áâப¨. Œ áᨢ ¤®«¦¥­ ¡ëâì ¤®áâ â®ç­® ¡®«ì訬,
; çâ®¡ë ¢¬¥áâ¨âì áâப㠨 § ª«îç¨â¥«ì­ë© ­ã«ì. ”ã­ªæ¨ï ¯à®¤®«¦ ¥â áç¨â뢠âì
; ᨬ¢®«ë, ¯®ª  ­¥ ¡ã¤¥â ¯à®ç¨â ­ ª®¤ ­®¢®© áâப¨ (0x0D) ¨«¨ § ¤ ­­®¥ ª®«¨-
; ç¥á⢮ ᨬ¢®«®¢. ਠí⮬, ª®¤ ­®¢®© áâப¨ § ¬¥­ï¥âáï ­  ­ã«ì. ‘âப  § ¯®-
; ¬¨­ ¥âáï á str[2] í«¥¬¥­â  ¬ áᨢ . ‚® ¢â®à®¬ í«¥¬¥­â¥ ¬ áᨢ  str[1] § ¯®-
; ¬¨­ ¥âáï ¤¥©áâ¢¨â¥«ì­ ï ¤«¨­  áâப¨.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ­ ç «® áâப¨, ­ å®¤ï饩áï ¢ str[2].
; ‚ á«ãç ¥ ®è¨¡ª¨, ¢®§¢à é ¥¬®¥ §­ ç¥­¨¥ ­¥ ®¯à¥¤¥«¥­®.
;
; char *cgets(*str)
;
cgets_::
;push ix ; for _gets_
ld b,(hl) ; str[0] max len string
inc hl
call __gets_##
inc hl
ret
ENDMODULE
; MODULE putdec
;
; "conio.h"
; ‚뢮¤¨â ç¨á«® ¢ ¤¥áïâ¨ç­®¬ ä®à¬ â¥ ­  íªà ­.
;
; in: hl = §­ ç¥­¨¥
; out: ­¥â
;
; void putdec(int num)
;
;putdec_::
; bit 7,h ; ¯à®¢¥à¨¬ §­ ª ç¨á« 
; jr z,@1
; ; ®âà¨æ. ç¨á«®
; call ?NEGHL##
; ld a,"-"
; call putch_## ; ¢ë¢®¤ ᨬ¢®«  ¯àאַ ­  íªà ­
;@1: ld de,0
; ld c,e
; ld b,16
;@2: add hl,hl
; ld a,e
; adc a,a
; daa
; ld e,a
; ld a,d
; adc a,a
; daa
; ld d,a
; rl c
; djnz @2
; ld hl,mystr ; ¡ãä¥à ç¨á« 
; call @fhexw
; ld e,c
; call @fhexb
; ld (hl),0
; ld hl,mystr
; ld bc,4
; ld a," "
; cpir
; jp cputs_## ; ¢ë¢¥á⨠áâப㠯àאַ ­  íªà ­
;
; de ¢ ¡ãä¥à
;@fhexw:push de
; ld e,d
; call @fhexb
; pop de
;@fhexb:ld a,e
; push af
; rrca
; rrca
; rrca
; rrca
; call @3
; pop af
;@3: and 0Fh
; add a,"0"
; cp "9"+1
; jr c,@4
; add a,7
;@4: ld (hl),a
; inc hl
; ret
;
; dseg
;mystr: ds 6 ; ¡ãä¥à ç¨á« 
;
; ENDMODULE
; MODULE getscon
;
; ®«ãç¨âì áâபã á ª®­á®«¨.
; Œ ªá. ¤«¨­  áâப¨ 128 ᨬ¢®«®¢, ¡¥§ ª®¤®¢ ª®­æ®¢ª¨ áâப¨.
; in: e = ?
; out: hl =  ¤à¥á ¡ãä¥à  áâப¨, ¥á«¨ Ok
; hl = NULL ¯à¨ ®è¨¡ª¥
;
;_getscon_::
; push ix
; ld a,e ; ¯¥à¥­¥á á
; ex de,hl
; ld hl,-130
; add hl,sp
; ld sp,hl
; ex de,hl ; hl= ¤à¥á ¡ãä¥à  ä㭪樨
; push hl
; ld (?23+1),hl
; dec a
; dec a
; ld hl,2
; add hl,sp
; ld (hl),a
; ld hl,2
; add hl,sp
; ex de,hl ; de= ¤à¥á ¡ãä¥à 
; ld c,0Ah ; ç⥭¨¥ ¢ ª®­á®«ì­ë© ¡ãä¥à
; call 5
; ld e,0Ah
; ld c,2 ; ¢ë¢¥á⨠ᨬ¢®« ­  §ªà ­
; call 5
; ld hl,4
; add hl,sp
; ld a,(hl)
; pop hl
; cp 1Ah ; ª®­¥æ ¢¢®¤  áâப¨
; jr nz,@5
; ld hl,0 ; hl=null
; jr @6
; ;
;@5: push hl
; ld hl,3
; add hl,sp
; ld c,(hl)
; ld hl,4
; add hl,sp
; ex de,hl
; pop hl
;@8: dec c
; ld a,c
; inc a
; jr z,@7
; ld a,(de)
; inc de
; ld (hl),a
; inc hl
; jr @8
; ;
;@7: ld (hl),0Ah
; inc hl
; xor a
; ld (hl),a
;?23: ld hl,0 ; hl,(?23)  ¤à¥á ¡ãä¥à  áâப¨
;@6: ex de,hl
; ld hl,130
; add hl,sp
; ld sp,hl
; ex de,hl
; pop ix
; ret
;
; ENDMODULE
; MODULE getcon
;
; ®«ãç¨âì ᨬ¢®« á ª®­á®«¨ á í宬.
; Ž¡à ¡ â뢠¥â ª®¤ 0Dh.
;
;_getcon_::
; push ix
; ld c,1 ; ¢¢®¤ ᨬ¢®«  á ª« ¢¨ âãàë
; call 5
; cp 0Dh
; ret nz
; ld a,0Ah
; push af
; ld c,2 ; ¢ë¢®¤ ᨬ¢®«  ­  íªà ­
; ld e,a
; call 5
; pop af
; pop ix
; ret
;
; ENDMODULE
MODULE inp
;
; "conio.h"
; ”ã­ªæ¨ï ç¨â ¥â 1 ¡ ©â ¨§ ¯®àâ  port.
; €à£ã¬¥­â port ¬®¦¥â ¡ëâì «î¡ë¬ ¡¥§§­ ª®¢ë¬
; æ¥«ë¬ ç¨á«®¬ ¢ ¤¨ ¯ §®­¥ ®â 0 ¤® 65535.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ¯à®ç¨â ­­ë© ¡ ©â ¨§ port.
;
; char inp(uint port);
;
inp_::
ld c,l
ld b,h
in a,(c)
ret
ENDMODULE
MODULE outp
;
; "conio.h"
; ”ã­ªæ¨ï § ¯¨á뢠¥â §­ ç¥­¨¥ value ¢ ¯®àâ port.
; €à£ã¬¥­â port ¬®¦¥â ¡ëâì «î¡ë¬ ¡¥§§­ ª®¢ë¬ 楫ë¬
; ç¨á«®¬ ¢ ¤¨ ¯ §®­¥ ®â 0 ¤® 65535. €à£ã¬¥­â value
; ¬®¦¥â ¡ëâì «î¡ë¬ æ¥«ë¬ ç¨á«®¬ ¢ ¤¨ ¯ §®­¥ ®â 0
; ¤® 255.
; ”ã­ªæ¨ï ¢®§¢à é ¥â § ¯¨á뢠¥¬ë© ¡ ©â.
;
; char outp(uint port, char value);
;
outp_::
ld c,l
ld b,h
ld a,e
out (c),a
ret
ENDMODULE
+357
View File
@@ -0,0 +1,357 @@
; ‚室ï騥 ä㭪樨:
;
; tolower
; toupper
; isdigit
; isupper
; islower
; isascii
; isalnum
; isxdigit
; isspace
; iscntrl
; ispunct
; isalpha
; isgraph
; isprint
;
MODULE xtcty
;
; Table for ctype functs
; 255 bytes
@ctype::
db 1,1,1,1,1,1,1,1,1,3,3,3,3,3,1,1
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 2,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
db 20,20,20,20,20,20,20,20,20,20,8,8,8,8,8,8
db 8,48,48,48,48,48,48,32,32,32,32,32,32,32,32,32
db 32,3,32,32,32,32,32,32,32,32,32,8,8,8,8,8
db 8,80,80,80,80,80,80,64,64,64,64,64,64,64,64,64
db 64,64,64,64,64,64,64,64,64,64,64,8,8,8,8,1
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
ENDMODULE
MODULE tolower
;
; "ctype.h"
; ८¡à §ã¥â ¯à®¯¨á­®© ᨬ¢®« ¢ áâà®ç­ë©.
; in: a = ᨬ¢®«
; out a = a..z ᨬ¢®«
;
; char tolower(char ch)
;
tolower_::
cp "A"
ret c
cp "Z"+1
ret nc
add a,20h
ret
ENDMODULE
MODULE toupper
;
; "ctype.h"
; ८¡à §ã¥â áâà®ç­ë© ᨬ¢®« ¢ ¯à®¯¨á­®©.
; in: a = ᨬ¢®«
; out a = A..Z ᨬ¢®«
;
; char toupper(char ch)
;
toupper_::
cp "a"
ret c
cp "z"+1
ret nc
sub 20h
ret
ENDMODULE
MODULE isdigit
;
; "ctype.h"
; ஢¥àª  ᨬ¢®«  ­  æ¨äàã.
; in: a = ᨬ¢®«
; out: true - æ¨äà 
; false - ­¥ æ¨äà 
;
; BOOL isdigit(char ch)
;
isdigit_::
cp "0"
jr c,@1
cp "9"+1
jr nc,@1
ld a,1 ; true
ret
@1: xor a ; false
ret
ENDMODULE
MODULE isupper
;
; "ctype.h"
; ஢¥àª  ­  ¯à®¯¨á­®© ᨬ¢®«
; in: a = ᨬ¢®«
; out: true - ¯à®¯¨á­®©
; false - ­¥ ¯à®¯¨á­®©
;
; BOOL isupper(char ch)
;
isupper_::
cp "A"
jr c,@1
cp "Z"+1
jr nc,@1
ld a,1 ; true
ret
@1: xor a ; false
ret
ENDMODULE
MODULE islower
;
; "ctype.h"
; ஢¥àª  ­  áâà®ç­ë© ᨬ¢®«
; in: a = ᨬ¢®«
; out: true - áâà®ç­ë©
; false - ­¥ áâà®ç­ë©
;
; BOOL islower(char ch)
;
islower_::
cp "a"
jr c,@1
cp "z"+1
jr nc,@1
ld a,1 ; true
ret
@1: xor a ; false
ret
ENDMODULE
MODULE isascii
;
; "ctype.h"
; ஢¥àª  ᨬ¢®«  ­  ASCII ¯à¨­ ¤«¥¦­®áâì
; in: a = ᨬ¢®«
; out: true - ascii-ᨬ¢®«
; false - ­¥ ascii-ᨬ¢®«
;
; BOOL isascii(char ch)
;
isascii_::
cp 0Dh
ret z
cp 0Ah
ret z
cp " "
jr c,@1
cp "~"+1
ret c ; true
@1: xor a ; false
ret
ENDMODULE
MODULE isalnum
;
; "ctype.h"
; ஢¥àï¥â ᨬ¢®« ­  ¯à¨­ ¤«¥¦­®áâì ª  «ä ¢¨â­®-æ¨ä஢®¬ã
; ⨯ã (A..Z, a..z, 0..9)
; in: a = ᨬ¢®«
; out: true -  «ä ¢¨â­®-æ¨ä஢®© ᨬ¢®«
; false - ­¥â
;
; BOOL isalnum(char ch)
;
isalnum_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,4+32+64
and (hl)
ret
ENDMODULE
MODULE isxdigit
;
; "ctype.h"
; ஢¥àï¥â ­  è¥áâ­ ¤æ â¥à¨ç­ë¥ æ¨äàë (0..9, A..F, a..f)
; in: a = ᨬ¢®«
; out: true - hex-æ¨äà 
; false - ­¥â
;
; BOOL isxdigit(char c)
;
isxdigit_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,10h
and (hl)
ret
ENDMODULE
MODULE isspace
;
; "ctype.h"
; ஢¥àï¥â ­  ¯à®¡¥«ì­ë¥ ᨬ¢®«ë (0x09, 0x0D ¨«¨ 0x20)
; in: a = ᨬ¢®«
; out: true - ¯à®¡¥«ì­ë© ᨬ¢®«
; false - ­¥â
;
; BOOL isspace(char ch)
;
isspace_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,2
and (hl)
ret
ENDMODULE
MODULE iscntrl
;
; "ctype.h"
; ஢¥àï¥â ­  ã¯à ¢«ïî騩 ᨬ¢®« (0å00..0å1F ¨«¨ 0x7F)
; in: a = ᨬ¢®«
; out: true - ã¯à ¢«ïî騩 ᨬ¢®«
; false - ­¥â
;
; BOOL iscntl(char ch)
;
iscntrl_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,1
and (hl)
ret
ENDMODULE
MODULE ispunct
;
; "ctype.h"
; ஢¥àï¥â ­  §­ ª¨ ¯ã­ªâã æ¨¨
; in: a = ᨬ¢®«
; out: true - §­ ª ¯ã­ªâã æ¨¨
; false - ­¥â
;
; BOOL ispunct(char ch)
;
ispunct_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,8
and (hl)
ret
ENDMODULE
MODULE isalpha
;
; "ctype.h"
; ஢¥àï¥â ­  ¯à¨­ ¤«¥¦­®áâì ª ¡ãª¢ ¬ (A..Z, a..z)
; in: a = ᨬ¢®«
; out: true - ¡ãª¢ 
; false - ­¥ ¡ãª¢ 
;
; BOOL isalpha(char ch)
;
isalpha_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,32+64
and (hl)
ret
ENDMODULE
MODULE isgraph
;
; "ctype.h"
; ஢¥àï¥â ­  ¯à¨­ ¤«¥¦­®áâì ª ¯¥ç â ¥¬ë¬ ᨬ¢®« ¬,
; ¨áª«îç ï ᨬ¢®« ¯à®¡¥«  (0å21..0å7E)
; in: a = ᨬ¢®«
; out: true - ¯¥ç â ¥¬ë© ᨬ¢®«
; false - ­¥â
;
; BOOL isgraph(char ch)
;
isgraph_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,0FCh
and (hl)
ret
ENDMODULE
MODULE isprint
;
; "ctype.h"
; ஢¥àï¥â ­  ¯à¨­ ¤«¥¦­®áâì ª ¯¥ç â ¥¬ë¬
; ᨬ¢®« ¬ (0å20..0å7E).
; in: a = ᨬ¢®«
; out: true - ¯¥ç â ¥¬ë© ᨬ¢®«
; false - ­¥â
;
; BOOL isprint(char ch)
;
isprint_::
ld l,a
ld h,0
ld de,@ctype##
add hl,de
ld a,0FEh
and (hl)
ret
ENDMODULE
+618
View File
@@ -0,0 +1,618 @@
; ”㭪樨 ¯à®¢¥à¥­ë.
;
; ‚室ï騥 ä㭪樨:
;
; bdos
; bdosh
; enable
; disable
; _setargv
; setdisk
; getdisk
; absread
; abswrite
; setdate
; getdate
; settime
; gettime
; intdos
; ffirst (findfirst)
; fnext (findnext)
;
MODULE bdos
;
; "dos.h"
; ‚믮«­ï¥â á¨á⥬­ë© ¢ë§®¢ „Ž‘, ­®¬¥à ª®â®à®£® ®¯à¥¤¥«¥­ ¢ n.
; €à£ã¬¥­âë doshl ¨ dosa à §¬¥é îâáï ᮮ⢥âá⢥­­® ¢ ॣ¨áâà å HL ¨ A.
; ”ã­ªæ¨ï ¢ë¯®«­ï¥â ª®¬ ­¤ã RST 10h ¤«ï ®áãé¥á⢫¥­¨ï á¨á⥬­®£® ¢ë§®¢ .
; ”ã­ªæ¨ï ¬®¦¥â ¡ëâì ¨á¯®«ì§®¢ ­  ⮫쪮 ¤«ï á¨á⥬­ëå „Ž‘-¢ë§®¢®¢, ª®â®àë¥
; ­¥ ¯à¨­¨¬ îâ  à£ã¬¥­â®¢ ¨«¨ ¯à¨­¨¬ îâ ¨å ⮫쪮 ¢ ॣ¨áâà å HL ¨ A.
; ”ã­ªæ¨ï ¢®§¢à é ¥â §­ ç¥­¨¥ ॣ¨áâà  A, § ¯®«­¥­­®£® á¨á⥬­ë¬ ¢ë§®¢®¬.
; ਬ¥ç ­¨¥: âã äã­ªæ¨î ­¥«ì§ï ¨á¯®«ì§®¢ âì ¤«ï ®áãé¥á⢫¥­¨ï á¨á⥬­ëå
; ¢ë§®¢®¢, ¢ ª®â®àëå ®è¨¡ª¨ 㪠§ë¢ îâáï ¯®á।á⢮¬ ãáâ ­®¢ª¨ ä« £  ¯¥à¥­®á .
; ’.ª. ‘¨-¯à®£à ¬¬ë ­¥ ¨¬¥îâ ¤®áâ㯠 ª í⮬ã ä« £ã, áâ âãá ¢®§¢à é ¥¬®£®
; §­ ç¥­¨ï ®¯à¥¤¥«¨âì ­¥¢®§¬®¦­®. ‚ í⮬ á«ãç ¥ ­¥®¡å®¤¨¬® ¨á¯®«ì§®¢ âì
; äã­ªæ¨î intdos.
; ”ã­ªæ¨ï bdosh ®â«¨ç ¥âáï ®â bdos ⮫쪮 ⥬, çâ® ¢®§¢à é ¥¬®¥ §­ ç¥­¨¥
; ᮤ¥à¦¨âáï ¢ ॣ. ¯ à¥ HL.
; Ž¡¥ ä㭪樨 ¬®¦­® ¨á¯®«ì§®¢ âì ¤«ï „Ž‘-¢ë§®¢®¢: 02h,0Ah,0Bh,0Eh,11h,1Bh
; 1Ch,1Dh,1Eh,5Ch ä㭪権.
;
; in: a = ­®¬¥à ä㭪樨
; de = ¯¥à¥¤ ¢ ¥¬ë¥ ¯ à ¬¥âàë
; c =  âਡãâ
; out: a = §­ ç¥­¨¥ á¨á⥬­®£® ¢ë§®¢ 
;
; char bdos(char n, int doshl, char dosa)
; int bdosh(char n, int doshl, char dosa)
;
bdosh_::
bdos_::
ld b,c
ld c,a ; c = n
ld a,b ; a = dosa
ex de,hl ; hl = doshl
push ix
rst 10h
pop ix
ld l,a
ld h,0
ret
ENDMODULE
MODULE diei
;
; "dos.h"
; Enable and disable interrupts.
;
; in: ­¥â
; out: ­¥â
;
; void enable()
; void disable()
;
enable_::
ei
ret
disable_::
di
ret
ENDMODULE
MODULE setarg
;-----------------------------------------------------------
; ¢­ãâ७­ïï: ¢ë§ë¢ ¥âáï ¨§ xmain ¤«ï ä㭪樨 _main_
;-----------------------------------------------------------
; ‘®§¤ âì ᯨ᮪  à£ã¬¥­â®¢, § ¤ ­­ëå ¢ ª®¬ ­¤­®© áâப¥.
; ‚®§¢à é ¥âáï ç¨á«®  à£ã¬¥­â®¢. ‘¯¨á®ª à áç¨â ­ ­   ¤à¥á 
; ¬ ªá¨¬ã¬ 30  à£ã¬¥­â®¢.
;
; in: hl =  ¤à¥á ª®¬. áâப¨
; out: hl = ç¨á«®  à£ã¬¥­â®¢ (argc)
;
; int _setargv(*string)
;
_setargv::
ld c,(hl) ; ¤«¨­  ª®¬. áâப¨
inc hl
ld b,0
ld e,l ; ­ ç «® ª®¬. áâப¨
ld d,h
add hl,bc
ld (hl),b ; ­ã«ì ¢ ª®­¥æ ª®¬. áâப¨
;  ¤à¥á ¨¬¥­¨ ¯à®£à ¬¬ë
push de
inc hl
inc hl
ld b,122
@6: ld a,(hl)
inc hl
or a
jr z,@8
cp "\"
jr nz,@7
ld e,l
ld d,h
@7: djnz @6
@8: ld (_argv_),de ;  ¤à¥á ¨¬¥­¨ ¯à®£à ¬¬ë
pop de
;
ld hl,_argv_+2 ; ᯨ᮪  ¤à¥á®¢  à£ã¬¥­â®¢
ld b,1 ; b=1 argc!
@1: ld a,(de)
inc de
cp " "
jr z,@1
cp 9 ; Tab
jr z,@1
or a
jr z,@2 ; ª®­¥æ áâப¨
dec de
ld (hl),e ;  ¤à¥á  à£ã¬¥­â  ¢ ᯨ᮪
inc hl
ld (hl),d
inc hl
inc b ; ++argc
@3: ld a,(de)
cp " "
jr z,@4
cp 9 ; Tab
jr z,@4
or a
jr z,@2 ; ª®­¥æ áâப¨
inc de
cp '"'
jr z,@5
jr @3
;
@4: xor a
ld (de),a ; ­ã«ì ¢ ª®­¥æ  à£ã¬¥­â  ¢ ª®¬. áâப¥
inc de
jr @1
;
@5: ld a,(de)
cp '"'
jr z,@3
or a
jr z,@2
inc de
jr @5
;
; ª®­¥æ  à£ã¬¥­â®¢
@2: ld (hl),0 ; null
inc hl
ld (hl),0
ld l,b ; hl=ç¨á«®  à£ã¬¥­â®¢
ld h,0
ret
dseg
_argv_::
ds 32*2 ; ᯨ᮪  ¤à¥á®¢  à£ã¬¥­â®¢
ENDMODULE
MODULE setdisk
;
; "dos.h"
; “áâ ­®¢¨âì ⥪ã騩 ¤¨áª
;
; in: a = ­®¬¥à ¤¨áª 
; out: ­¥â
;
; void setdisk(char diskno)
;
setdisk_::
push ix
ld c,1
rst 10h
pop ix
ret
ENDMODULE
MODULE absread
;
; "dos.h"
; €¡á®«îâ­®¥ ç⥭¨¥ á ¤¨áª .
; ”ã­ªæ¨ï áç¨â뢠¥â ¢ ¡ãä¥à ®¤¨­ ¨«¨ ­¥áª®«ìª® ᥪâ®à®¢
; á § ¤ ­­ë¬ ­ ç «ì­ë¬ ®â­®á¨â¥«ì­ë¬ ­®¬¥à®¬. ‘¥ªâ®àë
; ­ã¬¥àãîâáï á 0 ®â ­ ç «  «®£¨ç¥áª®£® (­¥ 䨧¨ç¥áª®£®!)
; ¤¨áª . Š ¯à¨¬¥àã, § £àã§®ç­ë© ᥪâ®à ¤ ­­®£® «®£¨ç¥áª®£®
; ¤¨áª  ¨¬¥¥â ­®¬¥à 0, ¤ «¥¥ ¯¥à¢ ï ª®¯¨ï FAT ­ ç¨­ ¥âáï
; á ᥪâ®à  ­®¬¥à 1 ¨ â.¤.
; ”ã­ªæ¨ï ¢®§¢à é îâ 0 ¯à¨ ãᯥ譮¬ § ¢¥à襭¨¨ ®¯¥à æ¨¨.
; ‚ á«ãç ¥ ®è¨¡ª¨ ¢®§¢à é ¥âáï -1 (0FFh) ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; in: a = ­®¬¥à ¤¨áª 
; de = «®£. ­®¬¥à ᥪâ®à 
; bc = ª®«-¢® ç¨â ¥¬ëå ᥪâ®à®¢
; á⥪ =  ¤à¥á ¡ãä¥à 
; out: a = 0 - Ok
; a = -1 - Error
;
; char absread(char disk, int nsect, char count, char buffer)
;
; disk - ­®¬¥à ¤¨áª 
; nsect - ­®¬¥à ­ ç «ì­®£® ᥪâ®à 
; count - ª®«-¢® ç¨â ¥¬ëå ᥪâ®à®¢
; buffer -  ¤à¥á ¡ãä¥à  ¯®¤ áç¨â뢠¥¬ë¥ ¤ ­­ë¥
;
absread_::
ld (@1+2),ix
ld lx,e ; ix=nsect
ld hx,d
pop hl
pop de ; de= ¤à¥á buffer
push de
push hl
ld hl,0 ; áâ.à §àï¤ ­®¬¥à  ᥪâ®à 
ld b,c ; count
ld c,55h
rst 08h
jr c,@2
xor a ; Ok
@1: ld ix,0
ret
@2: ld a,25 ; EREAD (read error)
ld (errno_##),a
ld a,-1
jr @1
ENDMODULE
MODULE abswrit
;
; "dos.h"
; €¡á®«îâ­ ï § ¯¨áì ­  ¤¨áª.
; ”ã­ªæ¨ï § ¯¨á뢠¥â ¨§ ¡ãä¥à  ®¤¨­ ¨«¨ ­¥áª®«ìª® ᥪâ®à®¢
; á § ¤ ­­ë¬ ­ ç «ì­ë¬ ®â­®á¨â¥«ì­ë¬ ­®¬¥à®¬. ‘¥ªâ®àë
; ­ã¬¥àãîâáï á 0 ®â ­ ç «  «®£¨ç¥áª®£® (­¥ 䨧¨ç¥áª®£®!)
; ¤¨áª . Š ¯à¨¬¥àã, § £àã§®ç­ë© ᥪâ®à ¤ ­­®£® «®£¨ç¥áª®£®
; ¤¨áª  ¨¬¥¥â ­®¬¥à 0, ¤ «¥¥ ¯¥à¢ ï ª®¯¨ï FAT ­ ç¨­ ¥âáï
; á ᥪâ®à  ­®¬¥à 1 ¨ â.¤.
; ”ã­ªæ¨ï ¢®§¢à é îâ 0 ¯à¨ ãᯥ譮¬ § ¢¥à襭¨¨ ®¯¥à æ¨¨.
; ‚ á«ãç ¥ ®è¨¡ª¨ ¢®§¢à é ¥âáï -1 (0FFh) ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; in: a = ­®¬¥à ¤¨áª 
; de = «®£. ­®¬¥à ᥪâ®à 
; bc = ª®«-¢® § ¯¨á뢠¥¬ëå ᥪâ®à®¢
; out: a = 0 - Ok
; a = -1 - Error
;
; char abswrite(char disk, int nsect, char count, char buffer)
;
; disk - ­®¬¥à ¤¨áª 
; nsect - ­®¬¥à ­ ç «ì­®£® ᥪâ®à 
; count - ª®«-¢® § ¯¨á뢠¥¬ëå ᥪâ®à®¢
; buffer -  ¤à¥á ¡ãä¥à  ¤ ­­ëå
;
abswrite_::
ld (@1+2),ix
ld lx,e ; ix=nsect
ld hx,d
pop hl
pop de ; de= ¤à¥á buffer
push de
push hl
ld hl,0 ; áâ.à §àï¤ ­®¬¥à  ᥪâ®à 
ld b,c ; count
ld c,56h
rst 08h
jr c,@2
xor a ; Ok
@1: ld ix,0
ret
@2: ld a,26 ; EWRITE (write error)
ld (errno_##),a
ld a,-1
jr @1
ENDMODULE
MODULE getdisk
;
; "dos.h"
; “§­ âì ­®¬¥à ¤¨áª 
;
; in: ­¥â
; out: a = ­®¬¥à ¤¨áª 
;
; char getdisk()
;
getdisk_::
;push ix
ld c,2
rst 10h
;pop ix
ret
ENDMODULE
MODULE getdate
;
; "dos.h"
; “§­ âì á¨á⥬­ãî ¤ âã ¨ § ¯®«­¨âì áâàãªâãàã date.
;
; in: hl =  ¤à¥á áâàãªâãàë ¤ âë
; out: ­¥â
;
; void getdate(struct date *date)
;
getdate_::
push ix
push hl ;  ¤à¥á áâàãªâãàë ¤ âë
ld c,21h
rst 10h
pop hl
push ix
pop bc
ld (hl),c ;+0 £®¤
inc hl ;
ld (hl),b ;+1
inc hl
ld (hl),d ;+2 ¤¥­ì
inc hl
ld (hl),e ;+3 ¬¥áïæ
pop ix
ret
ENDMODULE
MODULE setdate
;
; "dos.h"
; “áâ ­®¢¨âì á¨á⥬­ãî ¤ âã.
;
; in: hl =  ¤à¥á áâàãªâãàë ¤ âë
; out: ­¥â
;
; void setdate(struct date *date)
;
setdate_::
push ix
ld c,(hl) ;+0 £®¤
inc hl ;
ld b,(hl) ;+1
inc hl
ld d,(hl) ;+2 ¤¥­ì
inc hl
ld e,(hl) ;+3 ¬¥áïæ
push bc
pop ix
ld c,22h
rst 10h
pop ix
ret
ENDMODULE
MODULE gettime
;
; "dos.h"
; “§­ âì á¨á⥬­®¥ ¢à¥¬ï ¨ § ¯®«­¨âì áâàãªâãàã time.
;
; in: hl =  ¤à¥á áâàãªâãàë ¢à¥¬¥­¨
; out: ­¥â
;
; void gettime(struct time *time)
;
gettime_::
push ix
push hl
ld c,21h
rst 10h
ex de,hl
pop hl
ld (hl),e ;+0 ¬¨­ãâë
inc hl
ld (hl),d ;+1 ç áë
inc hl
inc hl ; ®¡®©â¨ ï祩ªã "ti_hund"
ld (hl),b ;+3 ᥪ㭤ë
pop ix
ret
ENDMODULE
MODULE settime
;
; "dos.h"
; “áâ ­®¢¨âì á¨á⥬­®¥ ¢à¥¬ï.
;
; in: hl =  ¤à¥á áâàãªâãàë ¢à¥¬¥­¨
; out: ­¥â
;
; void settime(struct time *time)
;
settime_::
push ix
ld e,(hl) ;+0 ¬¨­ãâë
inc hl
ld d,(hl) ;+1 ç áë
inc hl
inc hl ; ®¡®©â¨ ï祩ªã "ti_hund"
ld b,(hl) ;+3 ᥪ㭤ë
ex de,hl
ld c,22h
rst 10h
pop ix
ret
ENDMODULE
MODULE intdos
;
; "dos.h"
; ”ã­ªæ¨ï intdos ®áãé¥á⢫ï¥â ¢ë¯®«­¥­¨¥ á¨á⥬­®£® „Ž‘-¢ë§®¢  (á ¢®§¢à â®¬
; ä« £®¢ ãá«®¢¨©), ª®â®àë© ®¯à¥¤¥«¥­ §­ ç¥­¨ï¬¨ ॣ¨áâ஢, ®¡ê¥­­ëå ¢
; union REGS *ri ¨ ¢®§¢à é ¥â १ã«ìâ â á¨á⥬­®£® ¢ë§®¢  ¢ union REGS *ro.
; ’¨¯ ®¡ê¥¤¨­¥­¨ï union REGS ®¡ê¥­ ¢ "dos.h".
; „«ï ®áãé¥á⢫¥­¨ï á¨á⥬­®£® ¢ë§®¢  intdos ¢ë¯®«­ï¥â ª®¬ ­¤ã RST 10h.
; ¥à¥¤ ¢ë¯®«­¥­¨¥¬ ª®¬ ­¤ë äã­ªæ¨ï ª®¯¨àã¥â ᮤ¥à¦¨¬®¥ union REGS *ri ¢
; ᮮ⢥âáâ¢ãî騥 ॣ¨áâàë. ®á«¥ ¢ë¯®«­¥­¨ï ª®¬ ­¤ë RST, äã­ªæ¨ï intdos
; ª®¯¨àã¥â §­ ç¥­¨ï ⥪ãé¨å ॣ¨áâ஢ ¢ union REGS *ro. Ž­  â ª¦¥ ª®¯¨àã¥â
; ¢®§¢à é ¥¬ë© ä« £ ãá«®¢¨© á¨áâ¥¬ë ¢ ¯®«¥ flag, à §¬¥é¥­­®¥ ¢ union REGS *ro.
; …᫨ íâ® ¯®«¥ ï¥âáï ­¥­ã«¥¢ë¬, ä« £ 㪠§ë¢ ¥â ­  ãá«®¢¨¥ ®è¨¡ª¨.
;
; union REGS *ri - §­ ç¥­¨ï ॣ¨áâ஢ ¯à¨ ¢ë§®¢¥
; union REGS *ro - §­ ç¥­¨ï ॣ¨áâ஢ ¯à¨ ¢®§¢à â¥
;
; in: hl =  ¤à¥á union REGS *ri
; de =  ¤à¥á union REGS *ro
; out: ­¥â
;
; void intdos(union REGS *ri, union REGS *ro)
;
intdos_::
push ix
push de ; de=REGS *ro
inc hl
ld a,(hl) ;+1 a
inc hl
ld c,(hl) ;+2
inc hl
ld b,(hl) ;+3
push bc
inc hl
ld e,(hl) ;+4
inc hl
ld d,(hl) ;+5
push de
inc hl
ld e,(hl) ;+6 l
inc hl
ld d,(hl) ;+7 h
inc hl
ld c,(hl) ;+8 xl
inc hl
ld b,(hl) ;+9 xh
push bc
pop ix
inc hl
ld c,(hl) ;+10 yl
inc hl
ld b,(hl) ;+11 yh
push bc
pop iy
ex de,hl ; hl
pop de
pop bc
rst 10h ; á¨á⥬­ë© „Ž‘-¢ë§®¢
ex (sp),hl ; hl=REGS *ro
push bc
push af
pop bc
ld (hl),c ;+0 flag
inc hl
ld (hl),b ;+1 a
pop bc
inc hl
ld (hl),c ;+2
inc hl
ld (hl),b ;+3
inc hl
ld (hl),e ;+4
inc hl
ld (hl),d ;+5
inc hl
pop de
ld (hl),e ;+6 l
inc hl
ld (hl),d ;+7 h
push ix
pop bc
inc hl
ld (hl),c ;+8 xl
inc hl
ld (hl),b ;+9 xh
push iy
pop bc
inc hl
ld (hl),c ;+10 yl
inc hl
ld (hl),b ;+11 yh
pop ix
ret
ENDMODULE
MODULE ffirst
;
; "dos.h"
; ”ã­ªæ¨ï ffirst ¯à®¨§¢®¤¨â ¯®¨áª § ¤ ­­®£® ¢ pathname ä ©«  ¨§ £à㯯ë
; ä ©«®¢. €à£ã¬¥­â pathname ¬®¦¥â ᮤ¥à¦ âì ¨¬ï ¤¨áª  ¨ ª â «®£ ¤«ï ¯®¨áª .
; ‚ ¨¬¥­¨ ä ©«  ¤®¯ã᪠îâáï £«®¡ «ì­ë¥ ᨬ¢®«ë ? ¨ *. ˆ¬ï ­ ©¤¥­­®£® ä ©« 
; ­ å®¤¨âáï ¢ ä®à¬ â¥ DOS "filename.ext".
; ”ã­ªæ¨ï _ffirst ®â«¨ç ¥âáï ®â ä㭪樨 ffirst ⥬, çâ® ¢®§¢à é ¥â ¨¬ï
; ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ "FilenameExt".
; …᫨ ä ©« ®¡­ à㦥­, äã­ªæ¨ï § ¯®«­ï¥â áâàãªâãàã (®¯à¥¤¥«¥­­ãî ¢ "dos.h"),
; ­  ª®â®àãî 㪠§ë¢ ¥â  à£ã¬¥­â ffblk.
; €à£ã¬¥­â attr ᮤ¥à¦¨â  âਡãâ(ë) ä ©«®¢ ¤«ï ¯®¨áª  ¨ ¬®¦¥â ¯à¨­¨¬ âì
; á«¥¤ãî騥 §­ ç¥­¨ï, ®¯à¥¤¥«¥­­ë¥ ¢ "dos.h":
;
; FA_NORMAL Ž¡ëç­ë© ä ©«
; FA_RDONLY ’®«ìª® ç⥭¨¥
; FA_HIDDEN ‘ªàëâë© ä ©«
; FA_SYSTEM ‘¨á⥬­ë© ä ©«
; FA_LABEL Œ¥âª  ⮬ 
; FA_DIREC Š â «®£
; FA_ARCH €à娢­ë©
;
; Œo¦­o § ¤ ¢ âì ªà â­ë¥ §­ ç¥­¨ï  âਡã⮢, ¨á¯o«ì§ãï ᨬ¢o« "|"
; (®¯¥à â®à OR).
; ”ã­ªæ¨ï ¢®§¢à é ¥â 0 ¯à¨ ãᯥ譮¬ § ¢¥à襭¨¨ ¯®¨áª .
; …᫨ ä ©« ­¥ ­ ©¤¥­ ¨«¨ ¢ ¨¬¥­¨ ä ©«  ¢áâà¥â¨« áì ª ª ï-«¨¡® ®è¨¡ª ,
; ¢®§¢à é ¥âáï -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char ffirst(char *pathname, FIND *ffblk, char attr)
;
_ffirst_::
ld b,0 ; format "FilenameExt"
jr @1
ffirst_::
ld b,1 ; format "filename.ext"
@1: ld a,c ; attr
ld c,19h ; f_first
push ix
rst 10h
pop ix
ld (errno_##),a
ld a,0
ret nc
dec a
ret
ENDMODULE
MODULE fnext
;
; "dos.h"
; ”ã­ªæ¨ï ¯à®¨§¢®¤¨â ¯®¨áª á«¥¤ãî饣® ᮢ¯ ¤ î饣® ä ©« .
; ਠª ¦¤®¬ ¢ë§®¢¥, äã­ªæ¨ï ¢®§¢à é ¥â ®¤­® ¨¬ï ä ©« , ¤® â¥å ¯®à, ¯®ª 
; ¯ à ¬¥âàë ä ©«  ¡ã¤ãâ ¯®¤å®¤¨âì ¯®¤ § ¤ ­­ë¥ ¯ à ¬¥âàë ¯®¨áª .
; €à£ã¬¥­â ffblk ¤®«¦¥­ 㪠§ë¢ âì ­  áâàãªâãàã (®¯à¥¤¥«¥­­ãî ¢ "dos.h"),
; ¯à¥¤¢ à¨â¥«ì­® § ¯®«­¥­­ãî ä㭪樥© ffirst.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 0 ¯à¨ ãᯥ譮¬ § ¢¥à襭¨¨ ¯®¨áª .
; …᫨ ä ©« ­¥ ­ ©¤¥­ ¨«¨ ¢ ¨¬¥­¨ ä ©«  ¢áâà¥â¨« áì ª ª ï-«¨¡® ®è¨¡ª ,
; ¢®§¢à é ¥âáï -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char fnext(FIND *ffblk)
;
fnext_::
ex de,hl
ld c,1Ah ; f_next
push ix
rst 10h
pop ix
ld (errno_##),a
ld a,0
ret nc
dec a
ret
ENDMODULE
File diff suppressed because it is too large Load Diff
+660
View File
@@ -0,0 +1,660 @@
; ‚室ï騥 ä㭪樨:
;
; sbrk (¢ë¤¥«. ¡«®ª  ¯ ¬ï⨠¬¥¦¤ã 㪠§. ᢮¡. ¯ ¬ï⨠"$MEMRY" ¨ á⥪®¬)
; brk
; free
; malloc
; calloc
; realoc
;
MODULE sbrk
;
; "malloc.h"
; ‚뤥«ï¥â ¡«®ª ¤«¨­®© n ¢ ¯à¥¤¥«ïå ¬¥¦¤ã 㪠§ â¥«¥¬
; ᢮¡®¤­®© ¯ ¬ï⨠¨ 㪠§ â¥«¥¬ á⥪ .
; ‡­ ç¥­¨¥ n ¬®¦¥â ¡ëâì ®âà¨æ â¥«ì­ë¬, ⮣¤  ª®«¨ç¥á⢮
; § å¢ ç¥­­®© ¯ ¬ï⨠㬥­ìè ¥âáï ­  n ¡ ©â®¢.
; ਠãᯥ譮¬ ¢ë¤¥«¥­¨¨ ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¢ë¤¥-
; «¥­­ë© ¡«®ª.
; …᫨ ¯ ¬ï⨠­¥¤®áâ â®ç­®, ¢®§¢à é ¥â -1 (0FFFFh).
;
; in: hl = à §¬¥à ¡«®ª 
; out: hl = 㪠§ â¥«ì ­  ¢ë¤¥«. ¡«®ª, ¥á«¨ Ok.
; hl = -1 ¯à¨ ­¥¤®áâ âª¥ ¯ ¬ïâ¨.
;
; char *sbrk(int n)
;
sbrk_::
ld de,($MEMRY) ;  ¤à¥á 㪠§ â¥«ï ᢮¡. ¯ ¬ïâ¨
add hl,de
jr c,sbrkerr ; ¯¥à¥¯®«­. ç¨á« 
call brk_
ld a,h
and l
inc a
ret z ; ®è¨¡ª 
ex de,hl ; hl=­ ç «® ¢ë¤¥«. ¡«®ª 
ret
; Set free memory pointer.
; int brk(int n)
brk_::
push hl
inc h
inc h ; + 512 bytes reserved
or a
sbc hl,sp ; ¢ë¤¥«¨âì ¯ ¬ïâì
pop hl
jr nc,sbrkerr ; ¬ «® ¯ ¬ïâ¨
ld ($MEMRY),hl ; ­®¢®¥ ¯®«®¦. 㪠§ â¥«ï ᢮¡. ¯ ¬ïâ¨
ret
;
sbrkerr:ld hl,-1 ; EOF ®è¨¡ª 
ret
; 㪠§ â¥«ì ­ ç «  ᢮¡®¤­®© ¯ ¬ï⨠(¤® á⥪ )
$MEMRY::
dw 0 ; § ¯®«­ï¥âáï «¨­ª¥à®¬!
ENDMODULE
MODULE free
;
; "malloc.h", "stdlib.h"
; ”ã­ªæ¨ï ®á¢®¡®¦¤ ¥â ¡«®ª ¯ ¬ïâ¨.
; €à£ã¬¥­â ptr 㪠§ë¢ ¥â ­  à ­¥¥ § å¢ ç¥­­ë© ¡«®ª
; ¯ ¬ï⨠¯®á।á⢮¬ ¢ë§®¢  malloc, calloc, realloc.
; ‚®§¢à é ¥¬®£® §­ ç¥­¨ï ­¥â.
;
; void free(char *ptr)
;
free_::
dec hl
dec hl
dec hl
dec hl ; ­  ­ ç «® § £®«®¢ª  ¡«®ª 
ld c,l
ld b,h
ld hl,(_alloc_)
ld (?49+1),hl
ex de,hl
@22: ld a,e
sub c
ld a,d
sbc a,b
jr nc,@19
ld l,e
ld h,d
ld a,c
sub (hl)
inc hl
ld a,b
sbc a,(hl)
jr c,@20
@19: ld l,e
ld h,d
ld a,e
sub (hl)
inc hl
ld a,d
sbc a,(hl)
jr c,@21
ld a,e
sub c
ld a,d
sbc a,b
jr c,@20
ld l,e
ld h,d
ld a,c
sub (hl)
inc hl
ld a,b
sbc a,(hl)
jr c,@20
@21: ex de,hl
ld e,(hl)
inc hl
ld d,(hl)
ld (?49+1),de
jr @22
;
@20: ld l,e
ld h,d
ld (?48+1),bc
ld c,(hl)
inc hl
ld b,(hl)
push bc
?48: ld bc,0 ; á®åà. §­ ç¥­¨¥
ld hl,2
add hl,bc
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,hl ;1+1=2
add hl,hl ;2+2=4
add hl,bc
ld (?48+1),bc
pop bc
push de
ld a,l
cp c
jr nz,$+4
ld a,h
cp b
jr nz,@23
ld hl,(?48+1)
push hl
inc hl
inc hl
ld e,(hl)
inc hl
ld d,(hl)
push hl
?49: ld hl,0 ; á®åà. §­ ç¥­¨¥
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
inc hl
inc hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,de
ex de,hl
pop hl
ld (hl),d
dec hl
ld (hl),e
ld hl,(?49+1)
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld c,(hl)
inc hl
ld b,(hl)
pop hl
ld (hl),c
inc hl
ld (hl),b
jr @24
;
@23: ex de,hl
ld c,(hl)
inc hl
ld b,(hl)
ld hl,(?48+1)
ld (hl),c
inc hl
ld (hl),b
@24: pop de
ld hl,2
add hl,de
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,hl
add hl,hl
add hl,de
push de
ld bc,(?48+1)
ld a,l
cp c
jr nz,$+4
ld a,h
cp b
jr nz,@25
ld hl,2
add hl,de
push de
ld e,(hl)
inc hl
ld d,(hl)
push hl
ld hl,2
add hl,bc
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,de
ex de,hl
pop hl
ld (hl),d
dec hl
ld (hl),e
ld l,c
ld h,b
ld c,(hl)
inc hl
ld b,(hl)
pop de
ex de,hl
ld (hl),c
inc hl
ld (hl),b
jr @26
;
@25: ex de,hl
ld (hl),c
inc hl
ld (hl),b
@26: pop hl
ld (_alloc_),hl
ret
; ï祩ª   ¤à¥á  ¢ë¤¥«. ¡«®ª  ¯ ¬ïâ¨
_alloc_::
dw 0
dseg
; áâàãªâãà  § £®«®¢ª  ¡«®ª 
_base_::
dw 0 ; addr next free block
dw 0 ; size of this free block
ENDMODULE
MODULE malloc
;
; "malloc.h", "stdlib.h"
; ”ã­ªæ¨ï § å¢ â뢠¥â ¡«®ª ¯ ¬ï⨠ࠧ¬¥à®¬ ¢ size ¡ ©â®¢.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¢ë¤¥«¥­­ë© ¡«®ª ¯ ¬ïâ¨.
; …᫨ ᢮¡®¤­®© ¯ ¬ï⨠­¥¤®áâ â®ç­®, ¢®§¢à é ¥âáï NULL.
;
; char *malloc(int size)
;
malloc_::
inc hl
inc hl
inc hl
srl h ; hl/4
rr l
srl h
rr l
inc hl
ld (units+1),hl ; à §¬¥à ­®¢®£® ¡«®ª 
ld hl,(_alloc_##)
ld a,l
or h
jr nz,@0
ld (_base_##+2),hl ; á¡à. à §¬¥à ¢ë¤¥«. ¡«®ª 
ld hl,_base_## ; áâàãªâãà  § £®«®¢ª  ¡«®ª 
ld (_alloc_##),hl ;  ¤à¥á ¢ë¤¥«. ¡«®ª 
ld (_base_##),hl ;  ¤à¥á á«¥¤. § £®«®¢ª 
;
@0: ld (prev+1),hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (tp+1),hl ; hl=_base_
@3: ld hl,(tp+1)
ld c,(hl)
inc hl
ld b,(hl)
ld a,l
cp c
jp nz,@1
ld a,h
cp b
jp z,@1
inc hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,hl ; *4
add hl,hl ;
ex de,hl
ld hl,(tp+1)
add hl,de
ld a,l
cp c
jp nz,@1
ld a,h
cp b
jp nz,@1
ld hl,(tp+1)
ld e,l;
ld d,h;
ld c,(hl)
inc hl
ld b,(hl)
ld hl,(_alloc_##)
ld a,l
cp c
jr nz,@2
ld a,h
cp b
jr nz,@2
;ld hl,(tp+1)
ld l,e;
ld h,d;
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (_alloc_##),hl
@2: ;ld hl,(tp+1)
ex de,hl;
ld c,l;
ld b,h;
inc hl
inc hl
ld e,(hl)
inc hl
ld d,(hl)
push hl
;ld hl,(tp+1)
ld l,c;
ld h,b;
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
inc hl
inc hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
add hl,de
ex de,hl
pop hl
ld (hl),d
dec hl
ld (hl),e
;ld hl,(tp+1)
ld l,c;
ld h,b;
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
;ld c,(hl)
;inc hl
;ld b,(hl)
;ld hl,(tp+1)
;ld (hl),c
;inc hl
;ld (hl),b
ld a,(hl);
ld (bc),a;
inc hl;
inc bc;
ld a,(hl);
ld (bc),a;
jp @3
;
@1: ld hl,(tp+1)
inc hl
inc hl
ld c,(hl)
inc hl
ld b,(hl)
units: ld hl,0 ; à §¬¥à ­®¢®£® ¡«®ª 
ld a,c
sub l
ld a,b
sbc a,h
jp c,@4
ld hl,(tp+1)
ld e,l;
ld d,h;
inc hl
inc hl
ld c,(hl)
inc hl
ld b,(hl)
ld hl,(units+1) ; à §¬¥à ­®¢®£® ¡«®ª 
ld a,c
cp l
jr nz,@5
ld a,b
cp h
jr nz,@5
;ld hl,(tp+1)
ex de,hl;
ld c,(hl)
inc hl
ld b,(hl)
prev: ld hl,0 ; á®åà. §­ ç¥­¨¥
ld (hl),c
inc hl
ld (hl),b
jp @6
;
@5: ;ld hl,(units+1) ; hl=(units+1) à §¬¥à ­®¢®£® ¡«®ª 
add hl,hl
add hl,hl
ex de,hl
;ld hl,(tp+1)
add hl,de
ld (_alloc_##),hl
ex de,hl
ld hl,(prev+1)
ld (hl),e
inc hl
ld (hl),d
ld hl,(tp+1)
ld c,(hl)
inc hl
ld b,(hl)
;ld hl,(_alloc_##)
ex de,hl;
ld (hl),c
inc hl
ld (hl),b
;ld hl,(tp+1)
;inc hl
ex de,hl;
inc hl
ld c,(hl)
inc hl
ld b,(hl)
;ld hl,(units+1) ; à §¬¥à ­®¢®£® ¡«®ª 
ld de,(units+1)
ld a,c
sub e ;l
ld c,a
ld a,b
sbc a,d ;h
ld b,a
ld hl,(_alloc_##)
inc hl
inc hl
ld (hl),c
inc hl
ld (hl),b
;ld de,(units+1) ; à §¬¥à ­®¢®£® ¡«®ª 
ld hl,(tp+1)
inc hl
inc hl
ld (hl),e
inc hl
ld (hl),d
@6: ld hl,(prev+1)
ld (_alloc_##),hl
tp: ld hl,0 ; á®åà. §­ ç¥­¨¥
ld (hl),0
inc hl
ld (hl),0
inc hl
inc hl
inc hl ; ¯¥à¥©â¨ ­  ¢ë¤¥«. ¡«®ª
ret
;
@4: ld de,(tp+1)
ld hl,(_alloc_##)
ld a,e
cp l
jr nz,@7
ld a,d
cp h
jr nz,@7
ld hl,512
call sbrk_##
ld (tp+1),hl
ld a,l
and h
inc a
jr nz,@8
inc hl ; NULL
ret
;
@8: ld (hl),0
inc hl
ld (hl),0
inc hl
ld (hl),128 ; 512/sizeof(FREE)
inc hl
ld (hl),0
inc hl
call free_##
ld hl,(_alloc_##)
ld (tp+1),hl
@7: ld hl,(tp+1)
ld (prev+1),hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (tp+1),hl
jp @3
ENDMODULE
MODULE calloc
;
; "malloc.h", "stdlib.h"
; ”ã­ªæ¨ï § å¢ â뢠¥â ¯à®áâà ­á⢮ ¤«ï åà ­¥­¨ï ¬ áᨢ  ¨§ n í«¥¬¥­â®¢,
; ª ¦¤ë© à §¬¥à®¬ size ¡ ©â. Š ¦¤ë© í«¥¬¥­â ¨­¨æ¨ «¨§¨àã¥âáï ¢ 0.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  § å¢ ç¥­­®¥ ¯à®áâà ­á⢮.
; …᫨ ­¥¤®áâ â®ç­® ¯ ¬ïâ¨, ¢®§¢à é ¥âáï §­ ç¥­¨¥ NULL.
;
; char *calloc(int n, int size)
;
calloc_::
call ?MULHD## ; n * size = à §¬¥à ¢á¥£® ¬ áᨢ 
ld (@34+1),hl
call malloc_## ; ¢ë¤¥«¨âì ¯ ¬ïâì
ld a,l
or h
ret z ; ­¥¤®áâ â®ç­® ¯ ¬ï⨠(hl=NULL)
@34: ld bc,0 ; á®åà. à §¬¥à ¬ áᨢ 
ld (hl),0 ; ¡ ©â § ¯®«­¥­¨ï
push hl
ld d,h
ld e,l
inc de
dec bc
ldir
pop hl ; Ok
ret
ENDMODULE
MODULE realloc
;
; "malloc.h"
; ”ã­ªæ¨ï ¨§¬¥­ï¥â à §¬¥à à ­¥¥ ¢ë¤¥«¥­­®£® ¡«®ª  ¯ ¬ïâ¨.
; €à£ã¬¥­â ptr 㪠§ë¢ ¥â ­  ­ ç «® ¡«®ª . €à£ã¬¥­â size § ¤ ¥â ­®¢ë©
; à §¬¥à ¡«®ª  ¢ ¡ ©â å. ‘®¤¥à¦¨¬®¥ ¡«®ª  ­¥ ¨§¬¥­ï¥âáï.
; …᫨ size à ¢¥­ 0, ¡«®ª ®á¢®¡®¦¤ ¥âáï ¨ ¢®§¢à é ¥âáï NULL.
; …᫨ ptr à ¢¥­ NULL, â® ®â¢®¤¨âáï (¯® malloc) size ¡ ©â®¢ ¯ ¬ïâ¨
; ¨ ¢®§¢à é ¥âáï 㪠§ â¥«ì ­  íâ®â ¡«®ª.
; €à£ã¬¥­â ptr ¬®¦¥â 㪠§ë¢ âì ­  ¡«®ª, ª®â®àë© ¤®«¦¥­ ¡ëâì ®á¢®¡®¦¤¥­
; ¯à¥¦¤¥, 祬 ¯®á«¥¤ãî⠢맮¢ë malloc, calloc, realloc.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯¥à¥§ å¢ ç¥­­ë© ¡«®ª ¯ ¬ïâ¨.
; «®ª ¬®¦¥â ¡ëâì ¯¥à¥¤¢¨­ãâ, ¥á«¨ ¥£® à §¬¥àë ¨§¬¥­¥­ë, ¯®íâ®¬ã  à£ã-
; ¬¥­â ptr ¤«ï ä㭪樨 realloc ­¥ ®¡ï§ â¥«ì­® ¤®«¦¥­ ¡ëâì â ª¨¬ ¦¥,
; ª ª ¨ ¢®§¢à é ¥¬®¥ §­ ç¥­¨¥.
; ‚®§¢à é ¥âáï §­ ç¥­¨¥ NULL, ¥á«¨ ¯ ¬ï⨠­¥¤®áâ â®ç­® ¤«ï à áè¨à¥­¨ï
; ¡«®ª  ª § ¤ ­­®¬ã à §¬¥àã. ਠí⮬ ¯¥à¢®­ ç «ì­ë© ¡«®ª ®áâ ¥âáï
; ­¥¨§¬¥­­ë¬.
;
; char *realloc(*ptr, int size);
;
realloc_::
ld a,l
or h
jr nz,@0 ; *ptr != NULL
ex de,hl
jp malloc_##
;
@0: ld a,e
or d
jr nz,@1 ; size != 0
call free_##
ld hl,0 ; NULL
ret
;
@1: push hl ; *ptr
dec hl
ld a,(hl)
dec hl
ld l,(hl) ; hl=à §¬¥à ¡«®ª  ptr
ld h,a
add hl,hl ;
add hl,hl ; *4
dec hl
dec hl
dec hl
dec hl
ld (osize+1),hl
pop hl
push de ; size
push hl ; ptr
push de
call free_##
pop hl ; size
call malloc_##
ld (@3+1),hl ; ­®¢ë© ¡«®ª
pop de ; ptr
pop bc ; size
ld a,l
or h
jr z,@3 ; ®è¨¡ª 
; alloc != ptr
ld a,l
cp e
jr nz,osize
ld a,h
cp d
jr z,@3
osize: ld hl,0 ; á®åà. §­ ç¥­¨¥
; size > osize ?
ld a,l
sub c
ld a,h
sbc a,b
jr nc,@2 ; osize > size
ld c,l ; bc=osize
ld b,h
@2: ex de,hl ; hl = *ptr
ld de,(@3+1)
call movmem_## ; hl=from, de=to, bc=size
@3: ld hl,0 ; á®åà. 㪠§ â¥«ì ­  ­®¢ë© ¡«®ª
ret
ENDMODULE
+156
View File
@@ -0,0 +1,156 @@
; ‚室ï騥 ä㭪樨:
;
; movmem
; memset
; memcpy
; memmove
; memcmp
;
MODULE movmem
;
; "mem.h"
; ”ã­ªæ¨ï movmem ª®¯¨àã¥â len ¡ ©â ¨§ source ¢ destin.
; …᫨ ¨á室­ ï ¨ १ã«ìâ¨àãîé¨ï áâப  ¯¥à¥ªà뢠îâáï,
; ª®¯¨à®¢ ­¨¥ ¢á¥-à ¢­® ¯à®¨§¢®¤¨âáï ª®à४⭮.
;
; ”ã­ªæ¨ï setmem ãáâ ­ ¢«¨¢ ¥â ¯¥à¢ë¥ len ¡ ©â ¡«®ª  addr
; ¢ §­ ç¥­¨¥ value.
;
; void movmem(*source, *destin, len)
; void setmem(*addr, len, char value)
;
setmem_::
ld a,b
or c
ret z
ld (hl),e ; value
ld e,l
ld d,h
inc de
dec bc
movmem_::
ld a,b
or c
ret z
ldir
ret
ENDMODULE
MODULE memset
;
; "mem.h"
; ”ã­ªæ¨ï § ¯®«­ï¥â ¯¥à¢ë¥ count ¡ ©â ¡ãä¥à  dest ᨬ¢®«®¬ "c".
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¡ãä¥à dest.
;
; void *memset(*dest, c, count)
;
memset_::
push hl
call setmem_##
pop hl ; ¢¥à­ãâì  ¤à¥á dest
ret
ENDMODULE
MODULE memcpy
;
; "mem.h"
; ”ã­ªæ¨ï ª®¯¨àã¥â count ¡ ©â®¢ ¨§ source ¢ dest.
; …᫨ ­¥ª®â®àë¥ ãç á⪨ source ¨ dest ¯¥à¥ªà뢠îâáï, äã­ªæ¨ï
; £ à ­â¨àã¥â, çâ® ¡ ©âë ¨§ ¯¥à¥ªà뢠¥¬®£® ãç á⪠, ¯à¨­ ¤«¥-
; ¦ é¨¥ source, ¡ã¤ãâ ᪮¯¨à®¢ ­ë ¯¥à¥¤ ¯¥à¥§ ¯¨áìî.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  dest.
;
; void *memcpy(*dest, *source, count)
;
memcpy_::
ld a,b
or c
ret z ; count = 0
push hl
ex de,hl
ldir
pop hl ; ¢¥à­ãâì  ¤à¥á dest
ret
ENDMODULE
MODULE memmove
;
; "mem.h"
; ”ã­ªæ¨ï ªo¯¨àãîâ count ¡ ©â®¢ ¨§ source ¢ dest.
; …᫨ ­¥ªoâoàë¥ o¡« á⨠¢ source ¨ dest ¯¥à¥ªà뢠îâáï, äã­ªæ¨ï
; £ à ­â¨àã¥â, çâo ¨áåo¤­ë¥ source ¡ ©â ¨§ ¯¥à¥ªà뢠î饩áï o¡« áâ¨
; ¡ã¤ãâ áªo¯¨ào¢ ­ë ¯¥à¥¤ ¯¥à¥¯¨á뢠­¨¥¬.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  dest.
;
; void *memmove(*dest, *source, count)
;
memmove_::
ld a,b
or c
ret z ; count = 0
push hl
ex de,hl
ld a,d
cp h
jr nz,@1
ld a,e
cp l
@1: jr nc,@2
ldir
pop hl
ret
@2: add hl,bc
ex de,hl
add hl,bc
ex de,hl
lddr
pop hl
ret
ENDMODULE
MODULE memcmp
;
; "mem.h"
; ”ã­ªæ¨ï ¯à®¨§¢®¤¨â ¯®á«¥¤®¢ â¥«ì­®¥ «¥ªá¨£à ä. áà ¢­¥­¨¥
; ¯¥à¢ëå count ¡ ©â®¢ ¨§ buf1 ¨ buf2, ¨ ¯à®¤®«¦ ¥â íâ®, ¯®ª 
; ®­¨ ᮢ¯ ¤ îâ, «¨¡® ¯®ª  ­¥ ¢ë¯®«­¨âáï § ¤ ­­®¥ ª®«¨ç¥á⢮
; áà ¢­¥­¨© count.
; ”ã­ªæ¨ï ¢®§¢à é ¥â §­ ç¥­¨¥, 㪠§ë¢ î饥 ­  ᮮ⭮襭¨¥
; íâ¨å ¡ãä¥à®¢:
; < 0 buf1 < buf2
; = 0 buf1 = buf2
; > 0 buf1 > buf2
;
; int memcmp(*buf1, *buf2, count)
;
memcmp_::
ld a,(de)
sub (hl)
jr nz,@1
inc hl
inc de
dec bc
ld a,b
or c
jp nz,memcmp_
ld h,a ; hl = 0
ld l,a
ret
@1: ld hl,1 ; hl = 1
ret nc
ld hl,-1 ; hl = -1
ret
ENDMODULE
+566
View File
@@ -0,0 +1,566 @@
; ‚室ï騥 ä㭪樨:
;
; ms_init (initMouse)
; ms_show (showMouse)
; ms_hide (hideMouse)
; ms_stat (getStatMouse)
; msgstat (getGStatMouse)
; ms_spos (setPosMouse)
; ms_ybnd (yLimMouse)
; ms_xbnd (xLimMouse)
; ms_scur (setCursMouse)
; ms_tcur (setTxtMouse)
; ms_gcur (getCursMouse)
; ms_gsen (getSensMouse)
; ms_ssen (setSensMouse)
; ms_hard (hardMouse)
; ms_vmod (vmodeMouse)
; ms_ref (refreshMouse)
;
MODULE msinit
;
; "mouse.h"
; Initialization the mouse driver.
; Returns 0 if mouse installed, -1 if not.
;
; char initMouse(void)
;
ms_init_::
ld c,0
rst 30h
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msshow
;
; "mouse.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â ­  íªà ­ ªãàá®à ¬ëè¨, ®âá«¥¦¨¢ ¥â
; ¢á¥ ¯¥à¥¬¥é¥­¨ï ªãàá®à  ¨ ¯¥à¥à¨á®¢ë¢ ¥â ¥£®.
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno
; ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char showMouse(void)
;
ms_show_::
ld c,1
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE mshide
;
; "mouse.h"
; ”ã­ªæ¨ï áâ¨à ¥â ªãàá®à ¬ëè¨ á íªà ­ , ­® ¤à ©¢¥à ¯à®¤®«¦ ¥â
; ®âá«¥¦¨¢ ­¨¥ ¯¥à¥¬¥é¥­¨ï ¬ëè¨ ¨ ­ ¦ â¨¥ ­  ª­®¯ª¨.
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno
; ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char hideMouse(void)
;
ms_hide_::
ld c,2
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msstat
;
; "mouse.h"
; —⥭¨¥ á®áâ®ï­¨ï ¬ëè¨.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ⥪ã騥 ⥪áâ®¢ë¥ ª®®à¤¨­ âë ªãàá®à  ¬ëè¨
; ¨ á®áâ®ï­¨¥ ¥¥ ª­®¯®ª.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  áâàãªâãàã MSSTAT, ®¯à¥¤¥«¥­­ãî
; ¢ "mouse.h".
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 (0FFFFh) ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; ¢ë室­ë¥ ¤ ­­ë¥:
; A - á®áâ®ï­¨¥ ª­®¯®ª
; 0 bit - «¥¢ ï
; 1 bit - ¯à ¢ ï
; HL - Y/X ⥪áâ. ª®®à¤¨­ âë
;
; MSSTAT *getStatMouse()
;
ms_stat_::
ld c,3 ; ¯®«ãç¨âì ª®®à¤. ¬ë誨
rst 30h
jr c,@1
ld (button),a
srl h
rr l
srl h
rr l
srl l
ld a,e ; Y ª®®à¤¨­ â  (0-255)
rra
rra
rra
and 1Fh
ld h,a ; hl = Y/X ª®®à¤. ¢ §­ ª®¬¥áâ å
ld (x),hl
ld hl,button ; Ok
ret
;
@1: ld (errno_##),a
ld hl,-1 ; error
ret
dseg
button: db 0
x: dw 0 ; Y/X ⥪áâ. ª®®à¤¨­ âë
ENDMODULE
MODULE msgstat
;
; "mouse.h"
; —⥭¨¥ á®áâ®ï­¨ï ¬ëè¨.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ⥪ã騥 £à ä¨ç¥áª¨¥ ª®®à¤¨­ âë ªãàá®à  ¬ëè¨
; ¨ á®áâ®ï­¨¥ ¥¥ ª­®¯®ª.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  áâàãªâãàã MSGSTAT, ®¯à¥¤¥«¥­­ãî
; ¢ "mouse.h".
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 (0FFFFh) ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; ¢ë室­ë¥ ¤ ­­ë¥:
; A - á®áâ®ï­¨¥ ª­®¯®ª
; 0 bit - «¥¢ ï
; 1 bit - ¯à ¢ ï
; HL - x-ª®®à¤¨­ â 
; DE - y-ª®®à¤¨­ â 
;
; MSGSTAT *getGStatMouse()
;
msgstat_::
ld c,3
rst 30h
ld (button),a
ld (errno_##),a
ld (x),hl
ld (y),de
ld hl,button ; Ok
ret nc
ld hl,-1 ; error
ret
dseg
button: db 0
x: dw 0
y: dw 0
ENDMODULE
MODULE msspos
;
; "mouse.h"
; “áâ ­®¢ª  ⥪á⮢ëå ª®®à¤¨­ â ªãàá®à  ¬ëè¨.
; ”ã­ªæ¨ï ¯¥à¥¬¥é ¥â ªãàá®à ¬ëè¨ ¢ § ¤ ­­ë¥ ª®®à¤¨­ âë.
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; HL - ª®«®­ª 
; DE - áâப 
;
; char setPosMouse(int col, int line)
;
ms_spos_::
sla l ; *2
rl h
sla l
rl h ; hl = X pos
ld a,e
and 1Fh
rla
rla
rla
ld e,a ; de = Y pos
ld c,4
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE mssgpos
;
; "mouse.h"
; “áâ ­®¢ª  £à ä¨ç¥áª¨å ª®®à¤¨­ â ªãàá®à  ¬ëè¨.
; ”ã­ªæ¨ï ¯¥à¥¬¥é ¥â ªãàá®à ¬ëè¨ ¢ § ¤ ­­ë¥ ª®®à¤¨­ âë.
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; HL - x-ª®®à¤¨­ â 
; DE - y-ª®®à¤¨­ â 
;
; char setGPosMouse(int x, int y)
;
mssgpos_::
ld c,4
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msybnd
;
; "mouse.h"
; ‡ ¤ ­¨¥ ¢¥à⨪ «ì­ëå £à ­¨æ ¯¥à¥¬¥é¥­¨ï ªãàá®à .
; ”ã­ªæ¨ï § ¤ ¥â ¢¥àå­îî ¬¨­¨¬ «ì­ãî ¨ ­¨¦­îî ¬ ªá¨¬ «ì­ãî ª®®à¤¨­ âë,
; ¢ ª®â®àëå ¬®¦¥â ¯¥à¥¬¥é âìáï ªãàá®à ¬ëè¨ ¯® ¢¥à⨪ «¨.
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; HL - y-¬¨­¨¬ «ì­ ï
; DE - y-¬ ªá¨¬ «ì­ ï
;
; char yLimMouse(int miny, int maxy)
;
ms_ybnd_::
ld c,7
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msxbnd
;
; "mouse.h"
; ‡ ¤ ­¨¥ £®à¨§®­â «ì­ëå £à ­¨æ ¯¥à¥¬¥é¥­¨ï ªãàá®à .
; ”ã­ªæ¨ï § ¤ ¥â «¥¢ãî ¬¨­¨¬ «ì­ãî ¨ ¯à ¢ãî ¬ ªá¨¬ «ì­ãî ª®®à¤¨­ âë,
; ¢ ª®â®àëå ¬®¦¥â ¯¥à¥¬¥é âìáï ªãàá®à ¬ëè¨ ¯® £®à¨§®­â «¨.
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; HL - x-¬¨­¨¬ «ì­ ï
; DE - x-¬ ªá¨¬ «ì­ ï
;
; char xLimMouse(uint minx, uint maxx)
;
ms_xbnd_::
ld c,8
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msscur
;
; "mouse.h"
; ‡ £à㧪  ¨§®¡à ¦¥­¨ï ªãàá®à  ¬ëè¨.
; ”ã­ªæ¨ï § £à㦠¥â ­®¢®¥ ¨§®¡à ¦¥­¨¥ ªãàá®à  ¬ëè¨ ¢ ¤à ©¢¥à
; ¨ § ¤ ¥â  ªâ¨¢­ãî â®çªã ¨§®¡à ¦¥­¨ï.
; ¥à¥¤ ¢ë§®¢®¬ ä㭪樨, ¤®«¦­  ¡ëâì § ¯®«­¥­  áâàãªâãà 
; MSCURS, ®¯à¥¤¥«¥­­ ï ¢ "mouse.h".
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à
; ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; H - ¢ëá®â  ªãàá®à 
; L - è¨à¨­  ªãàá®à 
; D - Y  ªâ¨¢­ ï â®çª 
; E - X  ªâ¨¢­ ï â®çª 
; IX - ¨§®¡à ¦¥­¨¥ ªãàá®à 
;
; char setCursMouse(MSCURS *p)
;
ms_scur_::
push ix
ld c,(hl) ; width
inc hl
ld b,(hl) ; high
inc hl
ld e,(hl) ; xpoint
inc hl
ld d,(hl) ; ypoint
inc hl
ld a,(hl) ; *buffer
ld lx,a
inc hl
ld a,(hl)
ld hx,a
ld l,c
ld h,b
ld bc,9
rst 30h
pop ix
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE mstcur
;
; "mouse.h"
; “áâ ­®¢ª  ªãàá®à  ¬ëè¨ ¢ ⥪á⮢®¬ ०¨¬¥.
; ”ã­ªæ¨ï ãáâ ­ ¢«¨¢ ¥â ᨬ¢®« ¨  âਡãâ ªãàá®à  ¬ëè¨
; ¤«ï ⥪á⮢®£® ०¨¬ .
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; E - XOR attribut mask
; D - AND attribut mask
; L - XOR simbol mask
; H - AND simbol mask
;
; char setTxtMouse(MSTXT *p)
;
ms_tcur_::
ld e,(hl) ; XOR attribut mask
inc hl
ld d,(hl) ; AND attribut mask
inc hl
ld a,(hl) ; XOR simbol mask
inc hl
ld h,(hl) ; AND simbol mask
ld l,a
ld bc,0Ah
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msgcur
;
; "mouse.h"
; ®«ã祭¨¥ ¨§®¡à ¦¥­¨ï ªãàá®à  ¨§ ¤à ©¢¥à  ¬ëè¨.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  § ¯®«­¥­­ãî áâàãªâãàã MSCURS,
; ®¯à¥¤¥«¥­­ãî ¢ "mouse.h".
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 (0FFFFh) ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; IX - ¡ãä¥à ¤«ï ¨§®¡à ¦¥­¨ï ªãàá®à 
;
; ¢ë室­ë¥ ¤ ­­ë¥:
; H - ¢ëá®â  ªãàá®à 
; L - è¨à¨­  ªãàá®à 
; D - Y  ªâ¨¢­ ï â®çª 
; E - X  ªâ¨¢­ ï â®çª 
;
; MSCURS *getCursMouse(char *buffer)
;
ms_gcur_::
push ix
push hl
pop ix
ld (buff),hl
ld c,0Bh
rst 30h
pop ix
ld (errno_##),a
ld (width),hl
ld (xpoint),de
ld hl,width ; Ok
ret nc
ld hl,-1 ; error
ret
dseg
width: db 0 ; è¨à¨­  ªãàá®à 
db 0 ; ¢ëá®â  ªãàá®à 
xpoint: db 0 ; X  ªâ¨¢­ ï â®çª 
db 0 ; Y  ªâ¨¢­ ï â®çª 
buff: dw 0 ;  ¤à¥á ¡ãä¥à  ¨§®¡à ¦¥­¨ï ªãàá®à 
ENDMODULE
MODULE msgsens
;
; "mouse.h"
; ®«ã祭¨¥ §­ ç¥­¨ï çã¢á⢨⥫쭮á⨠¯¥à¥¬¥é¥­¨ï ¬ëè¨
; ¯® ¢¥à⨪ «¨ ¨ £®à¨§®­â «¨.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  § ¯®«­¥­­ãî áâàãªâãàã MSSENS,
; ®¯à¥¤¥«¥­­ãî ¢ "mouse.h".
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 (0FFFFh) ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; ¢ë室­ë¥ ¤ ­­ë¥:
; H - çã¢á⢨⥫쭮áâì ¯® ¢¥à⨪ «¨
; L - çã¢á⢨⥫쭮áâì ¯® £®à¨§®­â «¨
;
; MSSENS *getSensMouse()
;
ms_gsen_::
ld c,0Eh
rst 30h
ld (errno_##),a
ld (hsens),hl
ld hl,hsens ; Ok
ret nc
ld hl,-1 ; error
ret
dseg
hsens: db 0 ; çã¢áâ¢. ¯® £®à¨§®­â «¨
db 0 ; çã¢áâ¢. ¯® ¢¥à⨪ «¨
ENDMODULE
MODULE mssens
;
; "mouse.h"
; ”ã­ªæ¨ï ãáâ ­ ¢«¨¢ ¥â §­ ç¥­¨ï çã¢á⢨⥫쭮á⨠¯¥à¥¬¥é¥­¨ï
; ¬ëè¨ ¯® ¢¥à⨪ «¨ ¨ £®à¨§®­â «¨.
; ¥à¥¤ ¢ë§®¢®¬ ä㭪樨, ¤®«¦­  ¡ëâì § ¯®«­¥­  áâàãªâãà 
; MSSENS, ®¯à¥¤¥«¥­­ ï ¢ "mouse.h".
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à
; ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; H - çã¢á⢨⥫쭮áâì ¯® ¢¥à⨪ «¨
; L - çã¢á⢨⥫쭮áâì ¯® £®à¨§®­â «¨
;
; char setSensMouse(MSSENS *p)
;
ms_ssen_::
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld c,0Fh
rst 30h
ld (errno_##),a
ld a,0
ret nc
dec a
ret
ENDMODULE
MODULE mshard
;
; "mouse.h"
; Ž¡à ¡®â稪  ¯¯ à â­®£® ¯à¥à뢠­¨ï ®â ¬ëè¨.
; ® ¯à¨å®¤ã ¯à¥à뢠­¨ï ®â ¬ëè¨, ¢ë§ë¢ ¥âáï ¤ ­­ ï äã­ªæ¨ï ¤à ©¢¥à .
; ‚ á«ãç ¥, ª®£¤  âॡã¥âáï à ¡®â  ¯®¤¯à®£à ¬¬ë ¯à¨ § ¯à¥é¥­­ëå ¯à¥àë-
; ¢ ­¨ïå, ¨á¯®«ì§ã©â¥ ¤ ­­ãî äã­ªæ¨î, ¤«ï ¨§¡¥¦ ­¨ï ¯®â¥àì ¯ ª¥â®¢
; ¤ ­­ëå ®â ¬ëè¨.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à ®è¨¡ª¨.
;
; char hardMouse()
;
ms_hard_::
ld c,80h
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msvmode
;
; "mouse.h"
; ˆ­ä®à¬¨à®¢ ­¨¥ ® ᬥ­¥ ०¨¬  íªà ­ .
; ”ã­ªæ¨ï ¨­ä®à¬¨àã¥â ¤à ©¢¥à ¬ëè¨ ®¡ ¨§¬¥­¥­¨¨ ०¨¬  íªà ­ .
; ®¬¥à  ०¨¬®¢ ᮮ⢥âáâ¢ãîâ ä㭪樨 ãáâ ­®¢ª¨ ०¨¬  íªà ­ .
;
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â ­®¬¥à
; ®è¨¡ª¨.
;
; ¢å®¤­ë¥ ¤ ­­ë¥:
; A - ०¨¬ íªà ­ 
;
; char vmodeMouse(char video_mode)
;
ms_vmod_::
ld c,81h
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
MODULE msref
;
; "mouse.h"
; à¨­ã¤¨â¥«ì­ ï ¯¥à¥à¨á®¢ª  ªãàá®à .
; ”ã­ªæ¨ï ¯¥à¥à¨á®¢ë¢ ¥â ¨§®¡à ¦¥­¨¥ ªãàá®à  ¬ëè¨ ­  íªà ­¥
; ­¥ ¤®¦¨¤ ïáì ®ç¥à¥¤­®£® ¯à¥à뢠­¨ï.
; ਠ®è¨¡ª¥, ¢®§¢à é ¥âáï §­ ç¥­¨¥ -1 ¨ errno ᮤ¥à¦¨â
; ­®¬¥à ®è¨¡ª¨.
;
; char refreshMouse()
;
ms_ref_::
ld c,83h
rst 30h
ld (errno_##),a
ld a,0 ; Ok
ret nc
dec a ; error
ret
ENDMODULE
+68
View File
@@ -0,0 +1,68 @@
;///////////////////////////////////////////////////////////////////////////
;
; C LIBRARY FOR SOLID C compiler
; Root module
;
;///////////////////////////////////////////////////////////////////////////
; ‚室ï騥 ä㭪樨:
;
; xmain
; _exit
; abort
;
cseg
db "CLIB v0.01",0
xmain::
; á®§¤ âì ᯨ᮪  à£ã¬¥­â®¢
push ix
pop hl ;  ¤à¥á ª®¬. áâப¨
call _setargv## ; ¢ dos.asm
ld de,_argv_## ; ᯨ᮪  à£ã¬¥­â®¢ (¢ dos.asm)
call _main_## ; ¢ stdio.asm
;
; "stdlib.h"
; ¯¥à¥¤ ¥âáï ã¯à ¢«¥­¨¥ ¨§ ä㭪樨 exit.
; ”ã­ªæ¨ï § ¢¥à蠥⠢맢 ­­ë© ¯à®æ¥áá ¡¥§ ®¡­®¢«¥­¨ï ¡ãä¥à®¢ ¯®â®ª .
; ‡­ ç¥­¨¥ code ®¡ëç­® ãáâ ­ ¢«¨¢ ¥âáï ¢ 0 ¤«ï 㪠§ ­¨ï ­®à¬ «ì­®£®
; ¢ë室  ¨ ãáâ ­ ¢«¨¢ ¥âáï ¢ «î¡®¥ ¤à㣮¥ §­ ç¥­¨¥ ¤«ï ®¯à¥¤¥«¥­¨ï ®è¨¡ª¨.
; ®áª®«ìªã ¢ë§®¢ _exit ­¥ ¢®§¢à é ¥â §­ ç¥­¨ï, â® ¬«. ¡ ©â code ï¥âáï
; ª®¤®¬ ¢®§¢à â  ¤«ï த¨â¥«ì᪮£® ¯à®æ¥áá .
; in: hl = §­ ç¥­¨¥ error code
; out: ­¥â
;
; void _exit(int code)
;
_exit_::
ld b,l
ld c,41h ; terminate with error code
rst 10h
ret
;
; "stdlib.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â ­  íªà ­ á®®¡é¥­¨¥ "Abnormal program termination."
; (­¥¯à¥¤¢¨¤¥­­®¥ § ¢¥à襭¨¥ ¯à®£à ¬¬ë) ¨ § ¢¥à蠥⠢맢 ­­ë© ¯à®æ¥áá
; ¡¥§ ®¡­®¢«¥­¨ï ¡ãä¥à®¢ ¯®â®ª .
; in: ­¥â
; out: ­¥â
;
; void abort()
;
abort_::
ld hl,@1
ld c,5Ch
rst 10h
ld l,-1
jr _exit_
dseg
@1: db 0Dh,0Ah,"Abnormal program termination.",0Dh,0Ah,0Ah,0
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+947
View File
@@ -0,0 +1,947 @@
; ‚室ï騥 ä㭪樨:
;
; puts
; printf
; fprintf
; cprintf
; sprintf
; scanf
; fscanf
; sscanf
;
MODULE puts
;
; "stdio.h"
; ”ã­ªæ¨ï § ¯¨á뢠¥â ¢ë¡à ­­ãî áâபã string ¢ áâ ­¤ àâ­ë© ¯®â®ª
; ¢ë¢®¤  stdout, § ¬¥­ïï ¢ ¢ë室­®¬ ¯®â®ª¥ ­ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï
; áâப¨ ('\0') ᨬ¢®«®¬ ­®¢®© áâப¨ ('\n').
; ”ã­ªæ¨ï ¢á¥£¤  ¢®§¢à é ¥â ¯®á«¥¤­¨© § ¯¨á ­­ë© ᨬ¢®«, ª®â®àë¬
; ï¥âáï ᨬ¢®« ­®¢®© áâப¨ '\n'.
;
; in: hl =  ¤à¥á áâப¨
; out: a = ¯®á«¥¤­¨© ᨬ¢®« áâப¨
;
; char puts(*string)
;
puts_::
ld a,(hl)
or a
jr z,@1
push hl
call putch_##
pop hl
inc hl
jp puts_
;
@1: ld a,0Ah
push af
call putch_##
pop af
ret
ENDMODULE
MODULE frmts
;-----------------------------------------------------------
; call from ..printf
;-----------------------------------------------------------
; in: hl =  ¤à¥á ­ ç «  ¯ à ¬¥â஢
; de =  ¤à¥á ®¡à ¡®â稪 
; bc =  ¤à¥á ¯¥à¥¤ ¢ ¥¬ëå ¯ à ¬¥â஢
; out: hl = ç¨á«® ¢ë¢¥¤¥­­ëå ᨬ¢®«®¢, ¥á«¨ Ok
; hl = ®âà¨æ â¥«ì­®¥ §­ ç¥­¨¥, ¯à¨ ®è¨¡ª¥
;
; int @spr@(char *fmt, char (* callback)(), int param)
;
;
mk_num: ld (mn0+1),a ; base
ld (chars+1),bc
exx
ld hl,number
exx
call mn0
exx
ld (hl),0
exx
ld hl,number
ld a,(sign)
or a
ret z
dec hl
ret
;------------------------------------
mn0: ld bc,200Ah
xor a
mn1: add hl,hl
rl e
rl d
rla
cp c
jr c,mn2
sub c
inc l
mn2: djnz mn1
; DEHL-quot; A-rem
push af
ld a,d
or e
or h
or l
call nz,mn0
pop af
push hl
chars: ld hl,char1 ; save char1 or char2
ld c,a
ld b,0
add hl,bc
ld a,(hl)
pop hl
exx
ld (hl),a
inc hl
exx
ret
;-------------------------------------------
scan_length:
xor a
ld (flong),a ; false
ld (fladj),a
ld (flen+0),a ; make length = 0
ld (flen+1),a
ld a," "
ld (padch),a ; space padding by default
ld a,(hl)
cp "-"
jr nz,sl1
ld (fladj),a ; all will be LEFT adjusted, not right
inc hl
sl1: ld a,(hl)
cp "0"
jr nz,sl2
ld a,(fladj)
or a
jr nz,sl1a
ld a,"0"
ld (padch),a ; pad numbers with '0's, not spaces
sl1a: inc hl
sl2: ld de,0
sl2a: ld a,(hl)
sub "0"
jr c,sl3
cp 9+1
jr nc,sl3
ex de,hl
ld c,l
ld b,h
add hl,hl
add hl,hl
add hl,bc
add hl,hl
ld b,0
ld c,a
add hl,bc
ex de,hl
inc hl
jr sl2a
;
sl3: ld (flen),de ; set explicit length
ld a,(hl)
cp "l"
jr z,sl4
cp "L"
ret nz
sl4: ld (flong),a ; true
inc hl
ret
;--------------------------------------------
_pad: dec hl
bit 7,h
ret nz
push hl
ld a,(padch)
call outch
pop hl
ld de,(nprtd+1)
inc de
ld (nprtd+1),de
jp _pad
;=====================================================================
;
; int @spr@(char *fmt,char (* callback)(), int param)
;
;=====================================================================
@spr@:: ld (outch1+1),bc ; optional parameter
ld (outch2+1),de ; callback pointer
push hl
pop iy ; at (iy+2) we have current parameter
ld hl,0
ld (nprtd+1),hl ; clear return value
ld l,(iy+0) ; at iy we have pointer to format string
ld h,(iy+1)
loop: ld a,(hl)
inc hl
or a
jr z,nprtd
cp "%"
jr z,loc3
loc4: call outch
ld de,(nprtd+1)
inc de
ld (nprtd+1),de
jp loop
;
nprtd: ld hl,0 ; return value
ret
;
loc3: ld a,(hl)
inc hl
cp "%"
jr z,loc4
dec hl
call scan_length ; scan [-][0][0-9*][lL]
ld a,(hl)
inc hl
cp "c"
jp z,prt_c
cp "C"
jp z,prt_c ; print single character
cp "d"
jp z,prt_d
cp "D"
jp z,prt_d ; signed decimal
cp "u"
jp z,prt_u
cp "U"
jp z,prt_u ; unsigned decimal
cp "o"
jp z,prt_o
cp "O"
jp z,prt_o ; octal
cp "x"
jp z,prt_x1
cp "X"
jp z,prt_x2 ; hexadecimal
cp "s"
jp z,prt_s
cp "S"
jp z,prt_s ; string
jp loop
;
; %c symbol
prt_c: ld a,(iy+2)
call outch
ld de,(nprtd+1)
inc de
ld (nprtd+1),de
prt_q: inc iy
inc iy
ld a,(flong)
or a
jp z,loop ; false
inc iy
inc iy
jp loop
;
; %s string
prt_s: ld a," "
ld (padch),a
push hl
push iy
ld l,(iy+2)
ld h,(iy+3)
fmt0: push hl
call strlen_##
ex de,hl
ld hl,(flen)
or a
sbc hl,de
ld (flen),hl
ld a,(fladj)
or a
call z,_pad
pop hl
fmt1: ld a,(hl)
inc hl
or a
jr z,fmt2
call outch
ld de,(nprtd+1)
inc de
ld (nprtd+1),de
jp fmt1
;
fmt2: ld hl,(fladj)
ld a,(flen)
or a
call nz,_pad
pop iy
pop hl
jp prt_q
;
; %u unsigned decimal
prt_u: push hl
push iy
call getnum
jr fmt4
;
; %d signed decimal
prt_d: push hl
push iy
call getnum
ld a,(flong)
or a
jr nz,fmt3 ; true
bit 7,h
jr z,fmt3
ld de,-1
fmt3: bit 7,d
jr z,fmt4
ld a,"-"
ld (sign),a
xor a
sub l
ld l,a
ld a,0
sbc a,h
ld h,a
ld a,0
sbc a,e
ld e,a
ld a,0
sbc a,d
ld d,a
fmt4: ld a,10 ; base
ld bc,char1
call mk_num
jp fmt0
;
; %o octal
prt_o: push hl
push iy
call getnum
ld a,8 ; base
ld bc,char1
call mk_num
jp fmt0
;
; %X hex
prt_x2: ld bc,char1
prt_x: push hl
push iy
call getnum
ld a,16 ; base
call mk_num
jp fmt0
;
; %x hex
prt_x1: ld bc,char2
jr prt_x
;---------------------------------------
getnum: xor a
ld (sign),a
ld l,(iy+2)
ld h,(iy+3)
ld a,(flong)
or a
jr z,gnu1 ; false
ld e,(iy+4)
ld d,(iy+5)
ret
gnu1: ld de,0
ret
;---------------------------------------
outch: push hl
push iy
outch1: ld de,0 ; optional parameter
outch2: call 0 ; callback pointer
or a
jr z,och1
ld hl,8000h ; -32768
ld (nprtd+1),hl
och1: pop iy
pop hl
ret
char1: db "0123456789ABCDEF"
char2: db "0123456789abcdef"
dseg
flen: dw 0
fladj: db 0
flong: db 0 ; false/true
padch: db " "
;
sign: db 0 ; §­ ª ç¨á« 
number: ds 16 ; ¡ãä¥à ç¨á« 
ENDMODULE
MODULE xfputc
;-----------------------------------------------------------
; call from printf_, fprintf_
;-----------------------------------------------------------
; ”ã­ªæ¨ï ¢ë¢®¤¨â ᨬ¢®« ¢ ä ©« *fp.
; ਠ®è¨¡ª¥ ¢®§¢à é ¥âáï EOF (0FFFFh)
; in: a = ¢ë¢®¤¨¬ë© ᨬ¢®«
; out: hl=0 - Ok
; hl=EOF (0FFFFh) - ®è¨¡ª 
;
; int @fputc(c, FILE *fp)
;
@fputc::
call fputc_## ; ¢ë¢®¤ ᨬ¢®«  ¢ ¯®â®ª (ä ©«)
ld hl,-1 ; ®è¨¡ª 
cp l
ret z
xor a
inc hl ; Ok
ret
ENDMODULE
MODULE printf
;
; "stdio.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¢ áâ ­¤ àâ­ë©
; ¯®â®ª stdout ¨§ ¯¥à¥¬¥­­ëå, ®¯à¥¤¥«ï¥¬ëå  à£ã¬¥­â ¬¨ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
;
; in: ¯ à ¬¥âàë ¢ á⥪¥
; out: hl = ç¨á«® ¢ë¢¥¤¥­ëå ᨬ¢®«®¢, ¥á«¨ Ok
; hl = ®âà¨æ. §­ ç¥­¨¥ (¨§ @spr@) ¯à¨ ®è¨¡ª¥
;
; int printf(char *format, arg1, arg2, ...)
;
printf_::
ld bc,_iob_##-14 ; FILE-áâàãªâãà  ¯®â®ª  stdout
ld de,@fputc## ;  ¤à¥á ®¡à ¡®â稪 
ld hl,2
add hl,sp ; ï祩ª  á  ¤à¥á®¬ arg1
jp @spr@##
ENDMODULE
MODULE fprintf
;
; "stdio.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¢ ä ©« *fp
; ¨§ ¯¥à¥¬¥­­ëå, ®¯à¥¤¥«ï¥¬ëå 㪠§ â¥«ï¬¨  à£ã¬¥­â®¢ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
;
; in: ¯ à ¬¥âàë ¢ á⥪¥
; out: hl = ç¨á«® ¢ë¢¥¤. ᨬ¢®«®¢, ¥á«¨ Ok
; hl = ®âà¨æ. §­ ç¥­¨¥ (¨§ @spr@) ¯à¨ ®è¨¡ª¥
;
; int fprintf(FILE *fp, char *format, arg1, arg2, ...)
;
fprintf_::
pop hl
pop bc ; bc =  ¤à¥á ä®à¬. áâப¨
push bc
push hl
ld de,@fputc## ;  ¤à¥á ®¡à ¡®â稪 
ld hl,4
add hl,sp ; ï祩ª  á  ¤à¥á®¬ arg1
jp @spr@##
ENDMODULE
MODULE cprintf
;
; "conio.h"
; ”ã­ªæ¨ï ¢ë¢®¤¨â á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ­ ¡®àë ᨬ¢®«®¢
; ¨ §­ ç¥­¨© ¯àאַ ­  íªà ­.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
;
; in: ¤ ­­ë¥ ¢ á⥪¥
; out: hl = ç¨á«® ¢ë¢¥¤. ᨬ¢®«®¢, ¥á«¨ Ok
; hl = ®âà¨æ. §­ ç¥­¨¥ (¨§ @spr@), ¯à¨ ®è¨¡ª¥
;
; int cprintf(char *format, arg1, arg2, ...)
;
putch@: call putch_##
xor a
ret
cprintf_::
ld de,putch@ ;  ¤à¥á ®¡à ¡®â稪 
ld hl,2
add hl,sp ; ï祩ª  á  ¤à¥á®¬ arg1
jp @spr@##
ENDMODULE
MODULE sprintf
;
; "stdio.h"
; ”ã­ªæ¨ï ¯à¥®¡à §ã¥â ä®à¬ â ¨ ¢ë¢®¤¨â ­ ¡®àë ᨬ¢®«®¢ ¨ §­ ç¥­¨©
; ¢ buffer. ‚ ª®­¥æ ¢ë¢®¤¨¬®© áâப¨ § ¯¨á뢠¥âáï ­ã«ì.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë© á®®â-
; ¢¥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
; ”ã­ªæ¨ï ¢®§¢à é ¥â ª®«¨ç¥á⢮ ᨬ¢®«®¢, § ¯¨á ­­ëå ¢ buffer.
;
; int sprintf(char buffer, char *format, arg1, arg2, ...)
;
; in: de=ï祩ª , åà ­ïé ï  ¤à¥á ¡ãä¥à 
@sspr@: ex de,hl
ld e,(hl)
inc hl
ld d,(hl) ; de= ¤à¥á ¡ãä¥à 
ld (de),a ; á®åà. ᨬ¢®«
inc de
ld (hl),d ; á®åà. ⥪.  ¤à¥á ¡ãä¥à  ¢ á⥪¥
dec hl
ld (hl),e
xor a
ret
sprintf_::
ld hl,2
add hl,sp ; ï祩ª  á  ¤à¥á®¬ ¡ãä¥à 
ld c,l
ld b,h
ld de,@sspr@ ;  ¤à¥á ®¡à ¡®â稪 
ld hl,4
add hl,sp
call @spr@##
ex de,hl
pop bc
pop hl
ld (hl),0 ; to end string
push hl
push bc
ex de,hl ; hl=return value
ret
ENDMODULE
;[]============================ scanf ==================================[]
MODULE xxscn
;
; call from _scn_
;
@igs@: ex de,hl
@41: ld l,e
ld h,d
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld a,(hl)
cp " "
jr z,@40
cp 9 ; Tab
jr z,@40
cp 0Ah
ret nz
@40: ld l,e
ld h,d
push de
ld e,(hl)
inc hl
ld d,(hl)
inc de
ld (hl),d
dec hl
ld (hl),e
pop de
jr @41
; ¢ë室: hl= ¢®§¢à. ¡ ©â
@bc@: ld hl,@46+1
ld (hl),e ; ¡ §  ç¨á¥«
call toupper_##
cp "A"
jr c,@42
cp "Z"+1
jr c,@43
@42: cp "a"
jr c,@44
cp "z"+1
jr c,@43
@44: cp "_"
jr nz,@45
@43: sub "7"
jr @46
;
@45: cp "0"
jr c,@47
cp "9"+1
jr nc,@47
sub "0"
jr @46
;
@47: ld hl,-1 ; ¢®§¢à. §­ ç¥­¨¥
ret
;
@46: ld l,0 ; á®åà. §­ ç¥­¨¥
cp l
jr c,@48
ld a,-1
@48: ld l,a ; ¢®§¢à. ¡ ©â
ld h,0
ret
dseg
?95: dw 0
?99: dw 0
?100: db 0 ; false/true
?102: db 0
?103: dw 0
?104: dw 0
?105: dw 0
cseg
;
; call from ..scanf
;
_scn_::
ld (?95),hl
ld l,e;
ld h,d;
inc de
inc de
;ld hl,-2
;add hl,de
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (?99),hl
ld l,e
ld h,d
ld (?105),hl
xor a
ld (?102),a
@50: ld hl,(?99)
ld a,(hl)
inc hl
ld (?99),hl
or a
jp z,@49
cp " "
jr z,@50
cp 9 ; Tab
jr z,@50
cp 0Ah
jr z,@50
cp "%"
jp nz,@51
push hl
ld hl,1
ld (?103),hl
ld a,l ; a=true
ld (?100),a
ld a,10
ld (?101+1),a ; ¡ §  ç¨á¥«
pop hl
ld a,(hl)
inc hl
ld (?99),hl
cp "*"
jr nz,@52
xor a ; false
ld (?100),a
ld a,(hl)
inc hl
ld (?99),hl
@52: call toupper_##
cp "X" ; hex
jr z,@53
cp "O" ; octal
jr z,@54
cp "D" ; decimal
jr z,@55
cp "U" ; unsigned
jr z,@56
cp "S" ; string
jp z,@57
cp "C" ; char
jp z,@58
jp @49
;
@53: ld a,16
ld (?101+1),a ; ¡ §  ç¨á¥«
jr @56
;
@54: ld a,8
ld (?101+1),a ; ¡ §  ç¨á¥«
jr @56
;
@55: ld hl,?95
call @igs@
cp "-"
jr nz,@56
ld hl,-1
ld (?103),hl
ld hl,(?95)
inc hl
ld (?95),hl
;
@56: ld hl,0
ld (?104),hl
ld hl,?95
call @igs@
?101: ld e,0 ; á®åà. §­ ç¥­¨¥ (¡ §  ç¨á¥«)
call @bc@
ld a,l
and h
inc a
jp z,@49
@60: ld a,(?101+1) ; ¡ §  ç¨á¥«
ld e,a
push af
ld hl,(?95)
ld a,(hl)
inc hl
ld (?95),hl
call @bc@
ld a,l
pop de
ld e,d
cp 0FFh
jr z,@61
push af
ld d,0
ld hl,(?104)
call ?MULHD##
pop de
ld e,d
ld d,0
add hl,de
ld (?104),hl
jr @60
;
@61: ld hl,(?95)
dec hl
ld (?95),hl
jp @62
;
@57: ld hl,?95
call @igs@
ld hl,(?105)
ld c,(hl)
inc hl
ld b,(hl)
@65: ld hl,(?95)
ld a,(hl)
inc hl
ld (?95),hl
ld e,a
inc e
dec e
jr z,@63
ld hl,(?99)
ld a,(hl)
cp e
jr nz,@64
inc hl
ld (?99),hl
jr @63
;
@64: ld a,(?100)
or a
jr z,@65 ; false
ld a,e
ld (bc),a
inc bc
jr @65
;
@63: ld hl,?100
ld e,(hl)
inc e
dec e
jp z,@50 ; false
ld hl,(?102)
inc l
ld a,l
ld (?102),a
xor a
ld (bc),a
ld hl,(?105)
inc hl
inc hl
ld (?105),hl
jp @50
;
@58: ld hl,?100
ld e,(hl)
inc e
dec e
jr z,@66 ; false
ld hl,(?95)
ld a,(hl)
ld hl,(?105)
ld c,(hl)
inc hl
ld b,(hl)
inc hl
ld (?105),hl
ld (bc),a
ld hl,(?102)
inc l
ld a,l
ld (?102),a
@66: ld hl,(?95)
inc hl
ld (?95),hl
jp @50
;
@62: ld a,(?100)
or a
jr z,@51 ; false
ld de,(?103)
ld hl,(?104)
call ?MULHD##
ex de,hl
ld hl,(?105)
inc hl
inc hl
ld (?105),hl
dec hl
dec hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (hl),e
inc hl
ld (hl),d
ld hl,(?102)
inc l
ld a,l
ld (?102),a
@51: ld hl,(?95)
ld a,(hl)
or a
jp nz,@50
@49: ld hl,(?102)
ld h,0
ret
ENDMODULE
MODULE scanf
;
; "stdio.h"
; ”ã­ªæ¨ï ç¨â ¥â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¨§ áâ ­¤ àâ­®£®
; ¯®â®ª  stdin ¢ ¯¥à¥¬¥­­ë¥, ®¯à¥¤¥«ï¥¬ë¥ 㪠§ â¥«ï¬¨  à£ã¬¥­â®¢ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë© á®®â-
; ¢¥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
; ”ã­ªæ¨ï ¨á¯®«ì§ã¥â ¡ãä¥à ¢ ®¡« á⨠á⥪ , à §¬¥à®¬ 128 ¡ ©â.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ç¨á«® ¯®«¥©, à §¤¥«¥­­ëå ᯥæ-ᨬ¢®« ¬¨.
;
; int scanf(char *format, arg1, arg2, ...)
;
scanf_::
ld (@1+1),sp
ld hl,-128 ; à §¬¥à ¡ãä¥à 
add hl,sp ; hl= ¤à¥á ¡ãä¥à  ¢ á⥪¥
ld sp,hl ; à á¯®«®¦¨âì á⥪ ­¨¦¥ ¡ãä¥à 
call gets_## ; ¢¢¥á⨠áâபã á ª®­á®«¨
ex de,hl
ld hl,128+2
add hl,sp
ex de,hl ; hl=㪠§ â¥«ì ­  ¡ãä¥à
call _scn_##
@1: ld sp,0
ret
ENDMODULE
MODULE fscanf
;
; "stdio.h"
; ”ã­ªæ¨ï ç¨â ¥â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¨§ ä ©«  *fp,
; ¢ ¯¥à¥¬¥­­ë¥, ®¯à¥¤¥«ï¥¬ë¥ 㪠§ â¥«ï¬¨  à£ã¬¥­â®¢ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
; ”ã­ªæ¨ï ¨á¯®«ì§ã¥â ¡ãä¥à ¢ ®¡« á⨠á⥪ , à §¬¥à®¬ 128 ¡ ©â.
; ”ã­ªæ¨ï ¢®§¢à é ¥â ç¨á«® ¯®«¥©, à §¤¥«¥­­ëå ᯥæ-ᨬ¢®« ¬¨.
; ਠ¤®á⨦¥­¨¨ ª®­æ  ä ©« , ¢ë¤ ¥âáï EOF.
;
; int fscanf(FILE *fp, char *format, arg1, arg2, ...)
;
fscanf_::
ld (@68+1),sp
; ld (?137+1),hl ;  ¤à¥á áâàãªâãàë ¤¥áªà.
ld c,l; ; bc= ¤à¥á áâàãªâãàë ¤¥áªà.
ld b,h;
ld hl,-128
add hl,sp
ld sp,hl ; à á¯®«®¦¨âì á⥪ ­¨¦¥ ¡ãä¥à 
;?137: ld hl,0
; call ?LAUHL;##
; dw 132
; ;
; ld c,l ; bc= ¤à¥á áâàãªâãàë ¤¥áªà.
; ld b,h
ld de,127 ; ¬ ªá.¤«¨­  áâப¨ + 1
ld hl,0
add hl,sp ; hl= ¤à¥á ¡ãä¥à  ¢ ï祩ª¥ á⥪ 
call fgets_## ; ¯®«ãç¨âì áâப㠨§ ä ©«  (¯®â®ª )
ld a,l
or h
jr nz,@67 ; ¡¥§ ®è¨¡®ª
dec hl ; hl=EOF
jr @68
;
@67: ex de,hl
ld hl,132
add hl,sp
ex de,hl ; hl=㪠§ â¥«ì ­  ¡ãä¥à
call _scn_##
@68: ld sp,0
ret
ENDMODULE
MODULE sscanf
;
; "stdio.h"
; ”ã­ªæ¨ï ç¨â ¥â ¤ ­­ë¥ á ¯à¥®¡à §®¢ ­¨¥¬ ä®à¬ â  ¨§ buffer,
; ¢ ¯¥à¥¬¥­­ë¥, ®¯à¥¤¥«ï¥¬ë¥ 㪠§ â¥«ï¬¨  à£ã¬¥­â®¢ args.
; Š ¦¤ë©  à£ã¬¥­â ¤®«¦¥­ 㪠§ë¢ âì ­  §­ ç¥­¨¥ á ⨯®¬, ª®â®àë©
; ᮮ⢥âáâ¢ã¥â ⨯ã, § ¤ ­­®¬ã ¢ áâப¥ ä®à¬ â .
; ”ã­ªæ¨ï ¢®§¢à é ¥â ç¨á«® ¯®«¥©, à §¤¥«¥­­ëå ᯥæ-ᨬ¢®« ¬¨.
;
; int sscanf(char *buffer, char *format, arg1, arg2, ...)
;
sscanf_::
ld hl,2
add hl,sp
ld e,(hl)
inc hl
ld d,(hl)
inc hl
ex de,hl
jp _scn_##
ENDMODULE
+554
View File
@@ -0,0 +1,554 @@
; ‚室ï騥 ä㭪樨:
;
; memchr
; strcpy
; strncpy
; strcat
; strncat
; strcmp
; strncmp
; strchr
; strcspn
; strpbrk
; strlen
; strrchr
; strlwr
; strupr
; strspn
; strstr
; strtok
;
MODULE memchr
;
; "string.h"
; ”ã­ªæ¨ï ¨é¥â ¯¥à¢ë¥ count ¡ ©â ¢ buff á æ¥«ìî ®¡­ à㦥­¨ï
; ¯¥à¢®£® ¯®ï¢«¥­¨ï ᨬ¢®«  "c". ®¨áª ¯à®¤®«¦ ¥âáï ¤® â¥å ¯®à,
; ¯®ª  ­¥ ¡ã¤¥â ­ ©¤¥­ 㪠§ ­­ë© ᨬ¢®« ¨«¨ ­¥ ¡ã¤ã⠯஢¥à¥­ë
; ¢á¥ count ¡ ©âë.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  à á¯®«®¦¥­¨¥ ᨬ¢®«  "c" ¢ buff.
; …᫨ ᨬ¢®« "c" ­¥ ®¡­ à㦥­ ¢ ¯¥à¢ëå count ¡ ©â å buff, ¢®§¢à -
; é ¥âáï NULL.
;
; void *memchr(char *buff, c, count)
;
memchr_::
ld a,e ; ᨬ¢®«
cpir
dec hl
ret z ; ­ ©¤¥­
ld hl,0 ; NULL
ret
ENDMODULE
MODULE strcpy
;
; "string.h"
; ”ã­ªæ¨ï ª®¯¨àã¥â s2 ¢ s1 (¢ª«îç ï 0-© ᨬ¢®« ®ª®­ç ­¨ï áâப¨).
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  s1.
;
; char *strcpy(*s1, *s2)
;
strcpy_::
ex de,hl
push de
@1: ld a,(hl)
ldi
or a
jp nz,@1
pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strncpy
;
; "string.h"
; ”ã­ªæ¨ï ª®¯¨àã¥â â®ç­® count ᨬ¢®«®¢ áâப¨ s2 ¢ áâபã s1.
; …᫨ count ¬¥­ìè¥ ¤«¨­ë s2, ­ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï áâப¨
; ­¥ ¤®¡ ¢«ï¥âáï ª áâப¥ s1. …᫨ count ¡®«ìè¥ ¤«¨­ë s2, â®
; s1 § ¯®«­ï¥âáï ­ã«¥¢ë¬¨ ᨬ¢®« ¬¨, ¢¯«®âì ¤® ¤®á⨦¥­¨ï ¤«¨­ë
; count.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  s1.
;
; char *strncpy(*s1, *s2, count)
;
strncpy_::
ex de,hl
push de
@2: ld a,(hl)
@3: ldi
jp pe,@4
or a
jp nz,@2
dec hl
jp @3
;
@4: pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strcat
;
; "string.h"
; ”ã­ªæ¨ï ¤®¡ ¢«ï¥â s2 ª s1, § ¢¥àè ï áâபã s1
; ­ã«¥¢ë¬ ᨬ¢®«®¬.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  s1.
;
; char *strcat(*s1, *s2)
;
strcat_::
xor a
ld b,a
ld c,a
push hl
cpir
dec hl
ex de,hl
@1: ld a,(hl)
ldi
or a
jp nz,@1
pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strncat
;
; "string.h"
; ”ã­ªæ¨ï ¤®¡ ¢«ï¥â count ᨬ¢®«®¢ áâப¨ s2 ¢ ª®­¥æ áâப¨ s1,
; § ¢¥àè ï áâபã s1 ­ã«¥¢ë¬ ᨬ¢®«®¬.
; ‚ s1 ¤®«¦­® ¡ëâì ¤®áâ â®ç­® ¬¥áâ  ¤«ï à §¬¥é¥­¨ï १ã«ìâ¨àã-
; î饩 áâப¨.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  s1.
;
; char *strncat(*s1, *s2, count)
;
strncat_::
xor a
push hl
ld bc,0
cpir
dec hl
ex de,hl
@4: ld a,(hl)
or a
jr z,@5
ldi
jp po,@4
@5: xor a
ld (de),a
pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strcmp
;
; "string.h"
; ”ã­ªæ¨ï ¯à®¨§¢®¤¨â ¯®á«¥¤®¢ â¥«ì­®¥ ॣ¨áâà®-§ ¢¨á¨¬®¥
; áà ¢­¥­¨¥ ᨬ¢®«®¢ áâப s1 ¨ s2, ¨ ¯à®¤®«¦ ¥â íâ®, ¯®ª 
; ®­¨ ᮢ¯ ¤ îâ, «¨¡® ¯®ª  ®¤­  ¨§ áâப ­¥ § ª®­ç¨âáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â §­ ç¥­¨¥, 㪠§ë¢ î饥 ­  ᮮ⭮襭¨¥
; íâ¨å áâப:
; < 0 s1 < s2
; = 0 s1 = s2
; > 0 s1 > s2
;
; int strcmp(*s1, *s2)
;
strcmp_::
ex de,hl
@6: ld a,(de)
sub (hl)
jr nz,@7
inc de
inc hl
ld a,(de)
or a
jp nz,@6
@7: ld h,a
ld l,0
ret
ENDMODULE
MODULE strncmp
;
; "string.h"
; ”ã­ªæ¨ï ¯à®¨§¢®¤¨â ¯®á«¥¤®¢ â¥«ì­®¥ ॣ¨áâà®-§ ¢¨á¨¬®¥ áà ¢­¥­¨¥
; ᨬ¢®«®¢ áâப s1 ¨ s2. Š®«¨ç¥á⢮ áà ¢­¨¢ ¥¬ëå ᨬ¢®«®¢ § ¤ ¥âáï
; ¢ count. …᫨ ®¤­  ¨§ áâப § ª ­ç¨¢ ¥âáï, áà ¢­¥­¨¥ ¯à¥ªà é ¥âáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â §­ ç¥­¨¥, 㪠§ë¢ î饥 ­  ᮮ⭮襭¨¥ íâ¨å áâப:
; < 0 s1 < s2
; = 0 s1 = s2
; > 0 s1 > s2
;
; int strncmp(*s1, *s2, uint count)
;
strncmp_::
ex de,hl
@6: ld a,(de)
sub (hl)
jr nz,@7
ld a,(de)
or a
jr z,@7
inc de
inc hl
dec bc
ld a,b
or c
jp nz,@6
@7: ld h,a
ld l,0
ret
ENDMODULE
MODULE strchr
;
; "string.h"
; ”ã­ªæ¨ï ­ å®¤¨â ¯¥à¢®¥ ¢å®¦¤¥­¨¥ "c" ¢ string.
; ‘¨¬¢®« "c" ¬®¦¥â ¡ëâì ­ã«¥¢ë¬ ᨬ¢®«®¬.
; ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï string â ª¦¥ ¢ª«îç ¥âáï ¢ ¯®¨áª.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯¥à¢®¥ ¢å®¦¤¥­¨¥ "c" ¢ string.
; ‚®§¢à é ¥âáï NULL, ¥á«¨ ᨬ¢®« ­¥ ­ ©¤¥­.
;
; char *strchr(*string, c)
;
strchr_::
ld a,(hl) ; string
cp e ; ᨬ¢®« "c"
ret z
inc hl
or a
jp nz,strchr_
ld h,a ; NULL
ld l,a
ret
ENDMODULE
MODULE inrange
;
; ¢ë§ë¢ ¥âáï ¨§ ¤à. ¯/¯à®£à ¬¬
;
@inran::
ld a,(hl)
or a
ret z
cp e
inc hl
jp nz,@inran
or 0FFh
ret
ENDMODULE
MODULE strcspn
;
; "string.h"
;  å®¤¨â ¯¥à¢ãî ç áâì áâப¨ ¢ s1, ­¥ ¢å®¤ïéãî ¢ áâபã s2.
; ‚®§¢à é ¥â ¤«¨­ã ç á⨠áâப¨ s1, á®áâ®ï饩 ¨§ ᨬ¢®«®¢, ­¥
; ­ ©¤¥­­ëå ¢ áâப¥ s2. …᫨ ­¨ ®¤¨­ ¨§ ᨬ¢®«®¢ áâப¨ s1 ­¥
; ­ ©¤¥­ ¢ s2, ¢®§¢à é ¥âáï ®¡é ï ¤«¨­  áâப¨ s1 ¡¥§ § ¢¥àè -
; î饣® ­ã«ï.
;
; size_t strcspn(*s1, *s2)
;
strcspn_::
ld b,h
ld c,l
ld hl,0
@1: ld a,(bc)
or a
ret z
push hl
ex de,hl
push hl
ld e,a
call @inran##
pop de
pop hl
ret nz
inc hl
inc bc
jp @1
ENDMODULE
MODULE strpbrk
;
; "string.h"
; ”ã­ªæ¨ï ­ å®¤¨â ¯¥à¢®¥ ¢å®¦¤¥­¨¥ ¢ áâப¥ s1 «î¡®£®
; ᨬ¢®«  ¨§ áâப¨ s2. ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï ¯à¨
; ¯®¨áª¥ ­¥ à áᬠâਢ ¥âáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯¥à¢®¥ ¢å®¦¤¥­¨¥
; ᨬ¢®«  ¨§ s2 ¢ áâப¥ s1.
; ਠ®âáãâá⢨¨ ®¡é¨å ᨬ¢®«®¢ ¢ s1 ¨ s2, ¢®§¢à -
; é ¥âáï NULL.
;
; char *strpbrk(*s1, *s2)
;
strpbrk_::
ld a,(hl)
or a
jr z,@2
@1: push hl
ld l,(hl)
push de
ex de,hl
call @inran##
pop de
pop hl
ret nz
inc hl
jp @1
;
@2: ld h,a ; NULL
ld l,a
ret
ENDMODULE
MODULE strlen
;
; "string.h"
; ”ã­ªæ¨ï ¢®§¢à é ¥â ¢ ¡ ©â å ¤«¨­ã áâப¨ string,
; ¯à¨ç¥¬ ­ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï áâப¨, ¢ à §¬¥à
; áâப¨ ­¥ ¢å®¤¨â.
;
; size_t strlen(*string)
;
strlen_::
xor a
ld b,a
ld c,a
push hl
cpir
pop de
scf
sbc hl,de ; hl = ¤«¨­  áâப¨
ret
ENDMODULE
MODULE strrchr
;
; "string.h"
; ”ã­ªæ¨ï ­ å®¤¨â ¯®á«¥¤­¥¥ ¢å®¦¤¥­¨¥ ᨬ¢®«  "c"
; ¢ áâப¥ string. ã«¥¢®© ᨬ¢®« ®ª®­ç ­¨ï áâப¨
; string â ª¦¥ ¢ª«îç ¥âáï ¢ ¯®¨áª.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯®á«¥¤­¥¥ ¢å®¦¤¥­¨¥
; ᨬ¢®«  "c" ¢ string.
; …᫨ § ¤ ­­ë© ᨬ¢®« ­¥ ­ ©¤¥­, ¢®§¢à é ¥âáï NULL.
;
; char *strrchr(*string, c)
;
strrchr_::
ld b,h
ld c,l
ld hl,0 ; NULL
@1: ld a,(bc) ; string
or a
ret z
cp e ; ᨬ¢®« "c"
jp nz,@2
ld h,b ;  ¤à¥á ¢å®¦¤¥­¨ï
ld l,c
@2: inc bc
jp @1
ENDMODULE
MODULE strlwr
;
; "string.h"
; ”ã­ªæ¨ï ¯à¥®¡à §®¢ë¢ ¥â «î¡ë¥ ¡ãª¢ë ¢¥àå­¥£® ॣ¨áâà 
; áâப¨ string, § ª ­ç¨¢ î饩áï ­ã«¥¬, ¢ ¡ãª¢ë ­¨¦­¥£®
; ॣ¨áâà . „à㣨¥ ᨬ¢®«ë ­¥ à áᬠâਢ îâáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  áâபã string.
;
; char *strlwr(*string)
;
strlwr_::
push hl
@1: ld a,(hl)
or a
jr z,@2
call tolower_## ; A..Z -> a..z
ld (hl),a
inc hl
jp @1
;
@2: pop hl ; ¢¥à­ãâì  ¤à¥á string
ret
ENDMODULE
MODULE strupr
;
; "string.h"
; ”ã­ªæ¨ï ¯à¥®¡à §®¢ë¢ ¥â «î¡ë¥ ¡ãª¢ë ­¨¦­¥£® ॣ¨áâà 
; áâப¨ string, § ª ­ç¨¢ î饩áï ­ã«¥¬, ¢ ¡ãª¢ë ¢¥àå­¥£®
; ॣ¨áâà . „à㣨¥ ᨬ¢®«ë ­¥ à áᬠâਢ îâáï.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  áâபã string.
;
; char *strupr(*string)
;
strupr_::
push hl
@1: ld a,(hl)
or a
jr z,@2
call toupper_## ; a..z -> A..Z
ld (hl),a
inc hl
jp @1
;
@2: pop hl ; ¢¥à­ãâì  ¤à¥á string
ret
ENDMODULE
MODULE strspn
;
; "string.h"
; ”ã­ªæ¨ï ¢®§¢à é ¥â ¤«¨­ã ᮢ¯ ¤ î饩 ç á⨠áâப¨ s1, ª®â®à ï
; ¯®«­®áâìî á®á⮨⠨§ ᨬ¢®«®¢, ­ ©¤¥­­ëå ¢ áâப¥ s2. ã«¥¢®©
; ᨬ¢®« ®ª®­ç ­¨ï áâப¨ s2 ­¥ à áᬠâਢ ¥âáï.
; …᫨ áâப  s1 ­ ç¨­ ¥âáï á ᨬ¢®« , ­¥ ¢å®¤ï饣® ¢ áâபã s2,
; ¢®§¢à é ¥âáï 0.
;
; size_t strspn(*s1, *s2)
;
strspn_::
ld b,h
ld c,l
ld hl,0 ; ­ ç. ¤«¨­  ¯®¤áâப¨
@1: ld a,(bc)
or a
ret z
push hl
ex de,hl
push hl
ld e,a
call @inran##
pop de
pop hl
ret z ; ¢¥à­ãâì ¤«¨­ã ¯®¤áâப¨
inc hl
inc bc
jp @1
ENDMODULE
MODULE strstr
;
; "string.h"
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ¯¥à¢®¥ ¢å®¦¤¥­¨¥
; áâப¨ s2 ¢ áâபã s1.
; ”ã­ªæ¨ï ¢®§¢à é ¥â NULL, ¥á«¨ s2 ­¥ ¡ë«  ­ ©¤¥­ .
; …᫨ ¤«¨­  áâப¨ s2 à ¢­  0, ¢®§¢à é ¥âáï s1.
;
; char *strstr(*s1, *s2)
;
strstr_::
ld a,(hl)
or a
jr nz,@1
ld l,a ; NULL
ld h,a
ret
@1: push hl ;  ¤à¥á s1
push de ;  ¤à¥á s2
@2: ld a,(de) ; s2
or a
jr z,@3
cp (hl) ; s1
inc hl
inc de
jp z,@2
pop de
pop hl
inc hl
jp strstr_
;
@3: pop de
pop hl ; ¢¥à­ãâì  ¤à¥á s1
ret
ENDMODULE
MODULE strtok
;
; "string.h"
; ®¨áª ⮪¥­ (®¢).
; ”ã­ªæ¨ï ­ å®¤¨â ¢ áâப¥ s1 ⮪¥­, ®â¤¥«¥­­ë© ®¤­¨¬ (¨«¨ ¡®«¥¥)
; ®£à ­¨ç¨â¥«¥¬ ¨§ ¬­®¦¥á⢠ ᨬ¢®«®¢-®£à ­¨ç¨â¥«¥© áâப¨ s2.
;  ©¤¥­­ë© ⮪¥­ ¢ áâப¥ s1 ®ª ­ç¨¢ ¥âáï ­ã«¥¬.
; „«ï ⮣®, çâ®¡ë ¯à®ç¨â âì á«¥¤ãî騩 ⮪¥­ ¨§ s1, äã­ªæ¨ï strtok
; ¤®«¦­  ¢ë§ë¢ âìáï á NULL-§­ ç¥­¨¥¬ ¤«ï  à£ã¬¥­â  s1.
; €à£ã¬¥­â NULL s1 ¢ë§ë¢ ¥â strtok ­  ¯®¨áª á«¥¤ãî饣® §­ ª  ¢
; ¯à¥¤ë¤ã饩 áâப¥ ᨬ¢®«®¢.
; Œ­®¦¥á⢮ ®£à ­¨ç¨â¥«¥© ¢ áâப s2, ®â ¢ë§®¢  ª ¢ë§®¢ã, ¬®¦¥â
; ¡ëâì à §«¨ç­ë¬, â ª çâ® s2 ¬®¦¥â ¯à¨­¨¬ âì «î¡ë¥ §­ ç¥­¨ï.
; ਠª ¦¤®¬ ¢ë§®¢¥, äã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì ­  ­ ©¤¥­­ë©
; ⮪¥­ áâப¨ s1, ª ¦¤ë© à § ¯à®¤¢¨£ ïáì ¢¯¥à¥¤ ¯® áâப¥ s1.
; ”ã­ªæ¨ï ¢®§¢à é ¥â 㪠§ â¥«ì NULL, ª®£¤  ¡®«ìè¥ ­¥â ⮪¥­®¢
; ¢ áâப¥ s1.
;
; char *strtok(*s1, *s2)
;
strtok_::
ld (@4+1),de ; s2
ld (@2+1),hl ; s1
ld a,l
or h
jr nz,@0
@3: ld hl,0 ;  ¤à¥á á«¥¤. ¯®¨áª  ¢ s1
ld (@2+1),hl
@0: ld (@1+1),hl ; s1
@2: ld hl,0 ; ⥪.  ¤à¥á ¢ s1
ld a,(hl)
inc hl
ld (@2+1),hl
or a
jr z,@1
ld e,a
@4: ld hl,0 ; á®åà.  ¤à¥á s2
call @inran##
jr z,@2
ld hl,(@2+1) ; ⥪.  ¤à¥á ¢ s1
dec hl
ld (hl),0 ; ­  ¬¥áâ® ­ ©¤¥­­®£® ᨬ¢®«  ?
inc hl
ld (@3+1),hl ;  ¤à¥á á«¥¤. ¯®¨áª  ¢ s1
@1: ld hl,0 ;  ¤à¥á ­ ©¤¥­­®£® ᨬ¢®« 
ret
ENDMODULE
+23
View File
@@ -0,0 +1,23 @@
 ª¥â SOLID C
~~~~~~~~~~~~~
[!] ‚ ¦­®¥ § ¬¥ç ­¨¥
[+] ®¢®¢¢¥¤¥­¨¥
[-] ˆá¯à ¢«¥­  ®è¨¡ª 
[*] ˆ§¬¥­¥­¨ï
---------------------------------------------------------------------------
11.09.2004
---------------------------------------------------------------------------
[-] ˆá¯à ¢«¥­ £«îª «¨­ª¥à  (ld.exe), ¯à®ï¢«ïî騩áï ¢ ª®­æ¥ ᡮન
¯à®£à ¬¬, ¢ ¢¨¤¥ § ¢¨á ­¨ï «¨­ª¥à . ’¥¯¥àì ¢¥àá¨ï «¨­ª¥à  v0.04b.
---------------------------------------------------------------------------
‚¥àá¨ï 0.01b (03.09.2004)
---------------------------------------------------------------------------
¥à¢ë© betta-५¨§ ¯ ª¥â  SOLID C.