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:
+1
@@ -0,0 +1 @@
|
||||
sdcc-4.5.0
|
||||
+79
@@ -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"
|
||||
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
+22
@@ -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".
|
||||
Vendored
+968
@@ -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
|
||||
Vendored
+2570
File diff suppressed because it is too large
Load Diff
Vendored
+121
@@ -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
|
||||
Vendored
+228
@@ -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
|
||||
|
||||
При сборке программы, точно таким же образом, как и для сборки Си-программы
|
||||
из модулей, должна соблюдаться последовательность записи исходного текста, а
|
||||
именно: вызываемая функция должна быть записана прежде, а вызывающая ее, вслед
|
||||
за ней.
|
||||
Vendored
+80
@@ -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-библиотеку, надо удалить
|
||||
заголовок и символьную таблицу.
|
||||
Vendored
+138
@@ -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-файла.
|
||||
Vendored
+1217
File diff suppressed because it is too large
Load Diff
Vendored
+1731
File diff suppressed because it is too large
Load Diff
Vendored
+30
@@ -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 - Проверка всех модулей библиотеки на неопределенные внешние
|
||||
метки.
|
||||
Vendored
+155
@@ -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 - были ошибки работы или операций с файлами.
|
||||
Vendored
+137
@@ -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 (симв. формат номера).
|
||||
Vendored
+129
@@ -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
@@ -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");
|
||||
}
|
||||
Vendored
+98
@@ -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);
|
||||
}
|
||||
Vendored
+10
@@ -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
@@ -0,0 +1,6 @@
|
||||
#include <conio.h>
|
||||
|
||||
void main()
|
||||
{
|
||||
cprintf("Hello, world!\n");
|
||||
}
|
||||
Vendored
+8
@@ -0,0 +1,8 @@
|
||||
#include <conio.h>
|
||||
|
||||
char *buffer = "Insert data disk in drive A:\n";
|
||||
|
||||
void main()
|
||||
{
|
||||
cputs(buffer);
|
||||
}
|
||||
Vendored
+12
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
}
|
||||
Vendored
+28
@@ -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
@@ -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
@@ -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
@@ -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");
|
||||
}
|
||||
Vendored
+16
@@ -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);
|
||||
}
|
||||
}
|
||||
Vendored
+14
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
Vendored
+17
@@ -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
@@ -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");
|
||||
}
|
||||
Vendored
+18
@@ -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
@@ -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
|
||||
Vendored
+9
@@ -0,0 +1,9 @@
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
main()
|
||||
{
|
||||
printf("\nHello world !\n");
|
||||
fprintf(stdout,"�ਢ¥â ¬¨à !\n");
|
||||
// fprintf(stderr,"�ਢ¥â ¬¨à !\n");
|
||||
}
|
||||
+15
@@ -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);
|
||||
}
|
||||
Vendored
+19
@@ -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);
|
||||
}
|
||||
Vendored
+20
@@ -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);
|
||||
}
|
||||
Vendored
+601
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
Vendored
+12
@@ -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
@@ -0,0 +1,8 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int num = 0x07D4;
|
||||
|
||||
void main()
|
||||
{
|
||||
printf("Year: %d\n",num);
|
||||
}
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
�ਬ¥ΰλ ¨α―®«μ§®Ά ¨ο ¥�®β®ΰλε δγ�権.
|
||||
Vendored
+15
@@ -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
@@ -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
|
||||
Vendored
+393
@@ -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
@@ -0,0 +1,9 @@
|
||||
#include <stdio.h>
|
||||
|
||||
char buffer[20];
|
||||
char *s = "computer";
|
||||
|
||||
void main()
|
||||
{
|
||||
sprintf(buffer,"%s",s);
|
||||
}
|
||||
Vendored
+16
@@ -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);
|
||||
}
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
SOLID C v0.01b for Sprinter-2000
|
||||
Vendored
+25
@@ -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(.);
|
||||
Vendored
+23
@@ -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 */
|
||||
Vendored
+18
@@ -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();
|
||||
Vendored
+100
@@ -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
|
||||
Vendored
+63
@@ -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 */
|
||||
Vendored
+51
@@ -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 */
|
||||
Vendored
+19
@@ -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 */
|
||||
Vendored
+19
@@ -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 */
|
||||
Vendored
+112
@@ -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
|
||||
Vendored
+22
@@ -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 */
|
||||
Vendored
+15
@@ -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 */
|
||||
Vendored
+13
@@ -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
|
||||
Vendored
+117
@@ -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)
|
||||
Vendored
+51
@@ -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
|
||||
Vendored
+33
@@ -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;
|
||||
Vendored
+51
@@ -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
|
||||
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
+452
@@ -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
@@ -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
|
||||
Vendored
+618
@@ -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
|
||||
Vendored
+1174
File diff suppressed because it is too large
Load Diff
+660
@@ -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
|
||||
Vendored
+156
@@ -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
@@ -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
@@ -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
|
||||
+1671
File diff suppressed because it is too large
Load Diff
+1485
File diff suppressed because it is too large
Load Diff
+947
@@ -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
@@ -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
|
||||
Vendored
+23
@@ -0,0 +1,23 @@
|
||||
� ª¥â SOLID C
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
|
||||
[!] ‚ ¦®¥ § ¬¥ç ¨¥
|
||||
[+] �®¢®¢¢¥¤¥¨¥
|
||||
[-] ˆá¯à ¢«¥ ®è¨¡ª
|
||||
[*] ˆ§¬¥¥¨ï
|
||||
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
11.09.2004
|
||||
---------------------------------------------------------------------------
|
||||
[-] ˆá¯à ¢«¥ £«îª «¨ª¥à (ld.exe), ¯à®ï¢«ïî騩áï ¢ ª®æ¥ ᡮન
|
||||
¯à®£à ¬¬, ¢ ¢¨¤¥ § ¢¨á ¨ï «¨ª¥à . ’¥¯¥àì ¢¥àá¨ï «¨ª¥à v0.04b.
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
‚¥àá¨ï 0.01b (03.09.2004)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
�¥à¢ë© betta-५¨§ ¯ ª¥â SOLID C.
|
||||
Reference in New Issue
Block a user