diff --git a/doc/About.txt b/doc/About.txt new file mode 100644 index 0000000..575b566 --- /dev/null +++ b/doc/About.txt @@ -0,0 +1,353 @@ + Компилятор языка программирования Oberon-07/16 для i386 + Windows/KolibriOS. +------------------------------------------------------------------------------ + + Параметры командной строки + + Compiler.exe (Windows), Compiler.kex (KolibriOS) - исполняемый файл +компилятора. + Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или +UTF-8 с BOM-сигнатурой. + Выход - листинг программы на языке ассемблера fasm. + Параметры: + 1) имя главного модуля + 2) имя результирующего файла + 3) тип приложения и платформа + "con" - Windows console + "gui" - Windows GUI + "dll" - Windows DLL + "kos" - KolibriOS + "obj" - KolibriOS DLL + 4) размер стэка в мегабайтах, необязательный параметр, по умолчанию - 1 Мб. + + Если 3-й параметр = "obj" (KolibriOS DLL), то 4-й параметр задается в +формате x.y и определяет версию программы, по умолчанию - 1.0 (v1.0). + Например: + + Compiler.exe "C:\oberon-07\example.ob07" "C:\oberon-07\example.asm" con + Compiler.kex "/tmp0/1/example.ob07" "/tmp0/1/example.asm" obj 2.5 (* v2.5 *) + + В случае успешной компиляции, компилятор передает код завершения 0, иначе 1. +При работе компилятора в KolibriOS, код завершения не передается. + + В файле Compiler.ini можно задать путь к ассеблеру Fasm. Если путь задан +правильно, то после завершения трансляции, компилятор автоматически вызовет +fasm для ассемблирования листинга. + + Пример файла Compiler.ini: + +_fasm_win "С:\fasmw172\fasm.exe" +_fasm_kos "/rd/1/develop/fasm" + +------------------------------------------------------------------------------ + Отличия от оригинала + +1. Расширен псевдомодуль SYSTEM +2. В идентификаторах допускается символ "_" +3. Добавлены системные флаги +4. Усовершенствован оператор CASE (добавлены константные выражения в + метках вариантов и необязательная ветка ELSE) +5. Расширен набор стандартных процедур +6. Семантика охраны/проверки типа уточнена для нулевого указателя +7. Семантика DIV и MOD уточнена для отрицательных чисел +8. Добавлены однострочные комментарии (начинаются с пары символов "//") +9. Разрешено наследование от типа-указателя +10. Добавлен синтаксис для импорта процедур из внешних библиотек +11. "Строки" можно заключать также в одиночные кавычки: 'строка' + +------------------------------------------------------------------------------ + Особенности реализации + +1. Основные типы + + Тип Диапазон значений Размер, байт + + INTEGER -2147483648 .. 2147483647 4 + REAL 4.94E-324 .. 1.70E+308 8 + CHAR символ ASCII (0X .. 0FFX) 1 + BOOLEAN FALSE, TRUE 1 + SET множество из целых чисел {0 .. 31} 4 + BYTE 0 .. 255 1 + +2. Максимальная длина идентификаторов - 1024 символов +3. Максимальная длина строковых констант - 1024 символов +4. Максимальная размерность открытых массивов - 5 +5. Максимальное количество объявленных типов-записей - 2047 +6. Процедура NEW заполняет нулями выделенный блок памяти +7. Глобальные и локальные переменные инициализируются нулями +8. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая + модульность отсутствуют +9. Тип BYTE в выражениях всегда приводится к INTEGER +10. Контроль переполнения значений выражений не производится +11. Ошибки времени выполнения: + + - ASSERT(x), при x = FALSE + - разыменование нулевого указателя + - целочисленное деление на 0 + - вызов процедуры через процедурную переменную с нулевым значением + - ошибка охраны типа + - нарушение границ массива + - непредусмотренное значение выражения в операторе CASE + - ошибка копирования массивов v := x, если LEN(v) < LEN(x) + +------------------------------------------------------------------------------ + Псевдомодуль SYSTEM + + Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры, +ошибки при использовании процедур псевдомодуля SYSTEM могут привести к +повреждению данных времени выполнения и аварийному завершению программы. + + PROCEDURE ADR(v: любой тип): INTEGER + v - переменная или процедура; + возвращает адрес v + + PROCEDURE SADR(x: строковая константа): INTEGER + возвращает адрес x + + PROCEDURE SIZE(T): INTEGER + возвращает размер типа T + + PROCEDURE TYPEID(T): INTEGER + T - тип-запись или тип-указатель, + возвращает номер типа в таблице типов-записей + + PROCEDURE INF(): REAL + возвращает специальное вещественное значение "бесконечность" + + PROCEDURE GET(a: INTEGER; + VAR v: любой основной тип, PROCEDURE, POINTER) + v := Память[a] + + PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER) + Память[a] := x; + Если x: BYTE, то значение x будет расширено до 32 бит, + для записи байтов использовать SYSTEM.PUT8 + + PROCEDURE PUT8(a: INTEGER; x: INTEGER, BYTE) + Память[a] := младший байт (x) + + PROCEDURE MOVE(Source, Dest, n: INTEGER) + Копирует n байт памяти из Source в Dest, + области Source и Dest не должны перекрываться + + PROCEDURE COPY(VAR Source: любой тип; VAR Dest: любой тип; n: INTEGER) + Копирует n байт памяти из Source в Dest. + Эквивалентно + SYSTEM.MOVE(SYSTEM.ADR(Source), SYSTEM.ADR(Dest), n) + + PROCEDURE CODE(byte1, byte2,... : INTEGER) + Вставка машинного кода, + byte1, byte2 ... - константы в диапазоне 0..255, + например: + SYSTEM.CODE(08BH, 045H, 008H) (* mov eax, dword [ebp + 08h] *) + + Также в модуле SYSTEM определен тип CARD16 (2 байта). Для типа CARD16 не +допускаются никакие явные операции, за исключением присваивания. +Преобразования CARD16 -> INTEGER и INTEGER -> CARD16 могут быть реализованы +так: + + PROCEDURE Card16ToInt (w: SYSTEM.CARD16): INTEGER; + VAR i: INTEGER; + BEGIN + SYSTEM.PUT(SYSTEM.ADR(i), w) + RETURN i + END Card16ToInt; + + PROCEDURE IntToCard16 (i: INTEGER): SYSTEM.CARD16; + VAR w: SYSTEM.CARD16; + BEGIN + SYSTEM.GET(SYSTEM.ADR(i), w) + RETURN w + END IntToCard16; + + Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях. + +------------------------------------------------------------------------------ + Системные флаги + + При объявлении процедурных типов и глобальных процедур, после ключевого +слова PROCEDURE может быть указан флаг соглашения вызова: [stdcall], [cdecl], +[winapi] или [kosapi]. Например: + + PROCEDURE [cdecl] MyProc (x, y, z: INTEGER): INTEGER; + + Если указан флаг [winapi] или [kosapi], то принимается соглашение stdcall и +процедуру-функцию можно вызвать как собственно процедуру, вне выражения. + При объявлении типов-записей, после ключевого слова RECORD может быть +указан флаг [noalign]. Флаг [noalign] означает отсутствие выравнивания полей +записи. Записи с системным флагом не могут иметь базовый тип и не могут быть +базовыми типами для других записей. + Для использования системных флагов, требуется импортировать SYSTEM. + +------------------------------------------------------------------------------ + Оператор CASE + + Синтаксис оператора CASE: + + CaseStatement = + CASE Expression OF Сase {"|" Сase} + [ELSE StatementSequence] END. + Case = [CaseLabelList ":" StatementSequence]. + CaseLabelList = CaseLabels {"," CaseLabels}. + CaseLabels = ConstExpression [".." ConstExpression]. + + Например: + + CASE x OF + |-1: DoSomething1 + | 1: DoSomething2 + | 0: DoSomething3 + ELSE + DoSomething4 + END + + В метках вариантов можно использовать константные выражения, ветка ELSE +необязательна. Если не выполнен ни один вариант и ELSE отсутствует, то +программа прерывается с ошибкой времени выполнения. + +------------------------------------------------------------------------------ + Проверка и охрана типа нулевого указателя + + Оригинальное сообщение о языке не определяет поведение программы при +выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих +Oberon-реализациях выполнение такой операции приводит к ошибке времени +выполнения. В данной реализации охрана типа нулевого указателя не приводит к +ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет +значительно сократить частоту применения охраны типа. + +------------------------------------------------------------------------------ + Дополнительные стандартные процедуры + + DISPOSE(VAR v: любой_указатель) + Освобождает память, выделенную процедурой NEW для + динамической переменной v^, и присваивает переменной v + значение NIL. + + COPY(x: ARRAY OF CHAR; VAR v: ARRAY OF CHAR); + v := x; + Если LEN(v) < LEN(x), то строка x будет скопирована + не полностью + + LSR(x, n: INTEGER): INTEGER + Логический сдвиг x на n бит вправо. + + MIN(a, b: INTEGER): INTEGER + Минимум из двух значений. + + MAX(a, b: INTEGER): INTEGER + Максимум из двух значений. + + BITS(x: INTEGER): SET + Интерпретирует x как значение типа SET. + Выполняется на этапе компиляции. + + LENGTH(s: ARRAY OF CHAR): INTEGER + Длина 0X-завершенной строки s, без учета символа 0X. + Если символ 0X отсутствует, функция возвращает длину + массива s. + +------------------------------------------------------------------------------ + DIV и MOD + + x y x DIV y x MOD y + + 5 3 1 2 + -5 3 -2 1 + 5 -3 -2 -1 + -5 -3 1 -2 + +------------------------------------------------------------------------------ + Импортированные процедуры + + Синтаксис импорта: + + PROCEDURE [callconv, "library", "function"] proc_name (FormalParam): Type; + + - callconv -- соглашение вызова (stdcall, cdecl, winapi, kosapi) + - "library" -- имя файла динамической библиотеки + - "function" -- имя импортируемой процедуры + + например: + + PROCEDURE [winapi, "kernel32.dll", "ExitProcess"] exit (code: INTEGER); + + PROCEDURE [stdcall, "Console.obj", "con_exit"] exit (bCloseWindow: BOOLEAN); + + Объявления импортированных процедур должны располагаться в глобальной + области видимости модуля после объявления переменных, вместе с объявлением + "обычных" процедур, от которых импортированные отличаются только отсутствием + тела процедуры. В остальном, к таким процедурам применимы те же правила: + их можно вызвать, присвоить процедурной переменной или получить адрес. + + Так как импортированная процедура всегда имеет явное указание соглашения + вызова, то совместимый процедурный тип тоже должен быть объявлен с указанием + соглашения вызова: + + VAR + ExitProcess: PROCEDURE [winapi] (code: INTEGER); + con_exit: PROCEDURE [stdcall] (bCloseWindow: BOOLEAN); + + В KolibriOS импортировать процедуры можно только из библиотек, размещенных + в /rd/1/lib. Импортировать и вызывать функции инициализации библиотек + (lib_init, START) при этом не нужно. + +------------------------------------------------------------------------------ + Скрытые параметры процедур + + Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке +формальных параметров, но учитываются компилятором при трансляции вызовов. +Это возможно в следующих случаях: + +1. Процедура имеет формальный параметр открытый массив: + PROCEDURE Proc (x: ARRAY OF ARRAY OF REAL); + Вызов транслируется так: + Proc(LEN(x), LEN(x[0]), SYSTEM.ADR(x)) +2. Процедура имеет формальный параметр-переменную типа RECORD: + PROCEDURE Proc (VAR x: Rec); + Вызов транслируется так: + Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x)) + +------------------------------------------------------------------------------ + Модуль RTL + + Все программы неявно используют модуль RTL. Компилятор транслирует +некоторые операции (проверка и охрана типа, сравнение строк, сообщения об +ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не +следует явно вызывать эти процедуры, за исключением процедуры SetDll, +если приложение компилируется как Windows DLL: + + PROCEDURE SetDll + (process_detach, thread_detach, thread_attach: DLL_ENTRY); + где TYPE DLL_ENTRY = + PROCEDURE [stdcall] (hinstDLL, fdwReason, lpvReserved: INTEGER); + +SetDll назначает процедуры process_detach, thread_detach, thread_attach +вызываемыми при +- выгрузке dll-библиотеки (process_detach) +- создании нового потока (thread_attach) +- уничтожении потока (thread_detach) + +Для прочих типов приложений, вызов процедуры SetDll не влияет на +поведение программы. + Сообщения об ошибках времени выполнения выводятся в диалоговых окнах +(Windows), на доску отладки (KolibriOS). + +------------------------------------------------------------------------------ + Модуль API + + Существуют две реализации модуля API: для Windows и для KolibriOS. Как и +модуль RTL, модуль API не предназначен для прямого использования. Он +обеспечивает кроссплатформенность компилятора. + +------------------------------------------------------------------------------ + Генерация исполняемых файлов DLL + + Разрешается экспортировать только процедуры. Для этого, процедура должна +находиться в главном модуле программы, и ее имя должно быть отмечено символом +экспорта ("*"). KolibriOS DLL всегда экспортируют идентификаторы "version" +(версия программы) и "lib_init" - адрес процедуры инициализации DLL: + + PROCEDURE [stdcall] lib_init (): INTEGER + +Эта процедура должна быть вызвана перед использованием DLL. +Процедура всегда возвращает 1. \ No newline at end of file diff --git a/doc/Errors.txt b/doc/Errors.txt new file mode 100644 index 0000000..a58ddaf --- /dev/null +++ b/doc/Errors.txt @@ -0,0 +1,107 @@ + 1 пропущен символ 'H' или 'X' в конце шестнадцатиричного числа + 2 пропущен порядок вещественного числа + 3 незакрытая строка + 4 недопустимый символ + 5 слишком длинная строка + 6 слишком длинный идентификатор + 7 слишком длинное число + 8 слишком большое целое число + 9 слишком большое целое число (* hex *) + 10 слишком большая символьная константа (* hex *) + 11 вещественное переполнение + 12 переполнение порядка вещественного числа + + 21 ожидалось 'MODULE' + 22 ожидался идентификатор + 23 имя модуля не совпадает с именем файла + 24 ожидалась ';' + 25 идентификатор не совпадает с именем модуля + 26 ожидалась '.' + 27 ожидалось 'END' + 28 ожидалось ',', ';' или ':=' + 29 модуль не найден или ошибка доступа + 30 идентификатор переопределен + 31 циклический импорт + 32 ожидалось '=' + 33 ожидалась ')' + 34 синтаксическая ошибка в выражении + 35 ожидалась '}' + 36 несовместимость по выражению (унарн.) + 37 несовместимость по выражению + 38 ожидалось 'RETURN' + 39 целочисленное переполнение + 40 вещественное переполнение + 41 недостаточно вещественных регистров, упростите выражение + 42 значение константы должно быть в диапазоне 0..255 + 43 требуется значение типа INTEGER + 44 нарушение границ диапазона элементов множества (SET) + 45 деление на нуль + 46 целочисленное деление на нуль + 47 ожидалось 'OF' или ',' + 48 неопределенный идентификатор + 49 ожидался тип + 50 рекурсивное определение типа + 51 длина массива должна быть больше нуля + 52 ожидался идентификатор типа-записи или типа-указателя + 53 ожидалось ':' + 54 требуется импорт модуля SYSTEM + 55 тип-указатель не доопределен + 56 значение операнда вне границ диапазона элементов множества (SET) + 57 ожидалось 'TO' + 58 ожидался тип-запись + 59 процедура, не возвращающая результат, не допустима в выражении + 60 идентификатор не совпадает с именем процедуры + 61 нельзя экспортировать локальный идентификатор + 62 ожидалось константное выражение + 63 ожидалось stdcall, cdecl, winapi или kosapi + 64 ожидалась '(' + 65 ожидалась ',' + 66 несовместимый параметр + 67 ожидалось 'OF' + 68 ожидался идентификатор типа + 69 тип результата не может быть массивом или записью + 70 процедура не возвращает результат + 71 ожидалась ']' + 72 требуется выражение типа BOOLEAN + 73 требуется запись или указатель + 74 поле записи не найдено + 75 требуется массив + 76 требуется выражение типа INTEGER + 77 требуется указатель + 78 охрана/проверка типа не применима + 79 требуется тип + 80 требуется тип-запись + 81 требуется тип-указатель + 82 охрана/проверка типа не применима (недопустимый тип) + 83 нарушение границ массива + 84 слишком большая размерность открытого массива + 85 нельзя использовать локальную процедуру + 86 требуется процедура + 87 несовместимое выражение (RETURN) + 88 ожидалось 'THEN' + 89 ожидалось 'DO' + 90 ожидалось 'UNTIL' + 91 несовместимость по присваиванию + 92 вызов функции вне выражения + 93 требуется переменная + 94 переменная доступна только для чтения + 95 недопустимый тип выражения CASE + 96 ожидалось ':=' + 97 требуется переменная типа INTEGER + 98 шаг цикла FOR равен нулю + 99 несовместимая метка + 100 метка дублирована + 101 слишком много типов-записей + 102 ожидалась метка + 103 неправильный диапазон CASE + 104 слишком большой размер типа + 105 доступ к промежуточным переменным запрещен + 106 ожидался уточненный идентификатор + 107 слишком большой аргумент CHR + 108 требуется переменная или процедура + 109 функции модуля SYSTEM недопустимы в константных выражениях + 110 ожидалось noalign + 111 запись [noalign] не может иметь базовый тип + 112 запись [noalign] не может быть базовым типом + 113 результат процедуры [winapi] или [kosapi] не может быть REAL + 114 идентификаторы lib_init и version зарезервированы \ No newline at end of file diff --git a/doc/KOSLib.txt b/doc/KOSLib.txt new file mode 100644 index 0000000..bae9dc3 --- /dev/null +++ b/doc/KOSLib.txt @@ -0,0 +1,563 @@ +============================================================================== + + Библиотека (KolibriOS) + +------------------------------------------------------------------------------ +MODULE Out - консольный вывод + + PROCEDURE Open + формально открывает консольный вывод + + PROCEDURE Int(x, width: INTEGER) + вывод целого числа x; + width - количество знакомест, используемых для вывода + + PROCEDURE Real(x: REAL; width: INTEGER) + вывод вещественного числа x в плавающем формате; + width - количество знакомест, используемых для вывода + + PROCEDURE Char(x: CHAR) + вывод символа x + + PROCEDURE FixReal(x: REAL; width, p: INTEGER) + вывод вещественного числа x в фиксированном формате; + width - количество знакомест, используемых для вывода; + p - количество знаков после десятичной точки + + PROCEDURE Ln + переход на следующую строку + + PROCEDURE String(s: ARRAY OF CHAR) + вывод строки s + +------------------------------------------------------------------------------ +MODULE In - консольный ввод + + VAR Done: BOOLEAN + принимает значение TRUE в случае успешного выполнения + операции ввода, иначе FALSE + + PROCEDURE Open + формально открывает консольный ввод, + также присваивает переменной Done значение TRUE + + PROCEDURE Int(VAR x: INTEGER) + ввод числа типа INTEGER + + PROCEDURE Char(VAR x: CHAR) + ввод символа + + PROCEDURE Real(VAR x: REAL) + ввод числа типа REAL + + PROCEDURE String(VAR s: ARRAY OF CHAR) + ввод строки + + PROCEDURE Ln + ожидание нажатия ENTER + +------------------------------------------------------------------------------ +MODULE Console - дополнительные процедуры консольного вывода + + CONST + + Следующие константы определяют цвет консольного вывода + + Black = 0 Blue = 1 Green = 2 + Cyan = 3 Red = 4 Magenta = 5 + Brown = 6 LightGray = 7 DarkGray = 8 + LightBlue = 9 LightGreen = 10 LightCyan = 11 + LightRed = 12 LightMagenta = 13 Yellow = 14 + White = 15 + + PROCEDURE Cls + очистка окна консоли + + PROCEDURE SetColor(FColor, BColor: INTEGER) + установка цвета консольного вывода: FColor - цвет текста, + BColor - цвет фона, возможные значения - вышеперечисленные + константы + + PROCEDURE SetCursor(x, y: INTEGER) + установка курсора консоли в позицию (x, y) + + PROCEDURE GetCursor(VAR x, y: INTEGER) + записывает в параметры текущие координаты курсора консоли + + PROCEDURE GetCursorX(): INTEGER + возвращает текущую x-координату курсора консоли + + PROCEDURE GetCursorY(): INTEGER + возвращает текущую y-координату курсора консоли + +------------------------------------------------------------------------------ +MODULE ConsoleLib - обертка библиотеки console.obj + +------------------------------------------------------------------------------ +MODULE Math - математические функции + + CONST + + pi = 3.141592653589793D+00 + e = 2.718281828459045D+00 + + + PROCEDURE IsNan(x: REAL): BOOLEAN + возвращает TRUE, если x - не число + + PROCEDURE IsInf(x: REAL): BOOLEAN + возвращает TRUE, если x - бесконечность + + PROCEDURE sqrt(x: REAL): REAL + квадратный корень x + + PROCEDURE exp(x: REAL): REAL + экспонента x + + PROCEDURE ln(x: REAL): REAL + натуральный логарифм x + + PROCEDURE sin(x: REAL): REAL + синус x + + PROCEDURE cos(x: REAL): REAL + косинус x + + PROCEDURE tan(x: REAL): REAL + тангенс x + + PROCEDURE arcsin(x: REAL): REAL + арксинус x + + PROCEDURE arccos(x: REAL): REAL + арккосинус x + + PROCEDURE arctan(x: REAL): REAL + арктангенс x + + PROCEDURE arctan2(y, x: REAL): REAL + арктангенс y/x + + PROCEDURE power(base, exponent: REAL): REAL + возведение числа base в степень exponent + + PROCEDURE log(base, x: REAL): REAL + логарифм x по основанию base + + PROCEDURE sinh(x: REAL): REAL + гиперболический синус x + + PROCEDURE cosh(x: REAL): REAL + гиперболический косинус x + + PROCEDURE tanh(x: REAL): REAL + гиперболический тангенс x + + PROCEDURE arcsinh(x: REAL): REAL + обратный гиперболический синус x + + PROCEDURE arccosh(x: REAL): REAL + обратный гиперболический косинус x + + PROCEDURE arctanh(x: REAL): REAL + обратный гиперболический тангенс x + + PROCEDURE round(x: REAL): REAL + округление x до ближайшего целого + + PROCEDURE frac(x: REAL): REAL; + дробная часть числа x + + PROCEDURE floor(x: REAL): REAL + наибольшее целое число (представление как REAL), + не больше x: floor(1.2) = 1.0 + + PROCEDURE ceil(x: REAL): REAL + наименьшее целое число (представление как REAL), + не меньше x: ceil(1.2) = 2.0 + + PROCEDURE sgn(x: REAL): INTEGER + если x > 0 возвращает 1 + если x < 0 возвращает -1 + если x = 0 возвращает 0 + +------------------------------------------------------------------------------ +MODULE Debug - вывод на доску отладки + Интерфейс как модуль Out + + PROCEDURE Open + открывает доску отладки + +------------------------------------------------------------------------------ +MODULE File - работа с файловой системой + + TYPE + + FNAME = ARRAY 520 OF CHAR + + FS = POINTER TO rFS + + rFS = RECORD (* информационная структура файла *) + subfunc, pos, hpos, bytes, buffer: INTEGER; + name: FNAME + END + + FD = POINTER TO rFD + + rFD = RECORD (* структура блока данных входа каталога *) + attr: INTEGER; + ntyp: CHAR; + reserved: ARRAY 3 OF CHAR; + time_create, date_create, + time_access, date_access, + time_modif, date_modif, + size, hsize: INTEGER; + name: FNAME + END + + CONST + + SEEK_BEG = 0 + SEEK_CUR = 1 + SEEK_END = 2 + + PROCEDURE Load(FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER; + Загружает в память файл с именем FName, записывает в параметр + size размер файла, возвращает адрес загруженного файла + или 0 (ошибка). При необходимости, распаковывает + файл (kunpack). + + PROCEDURE GetFileInfo(FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN + Записывает структуру блока данных входа каталога для файла + или папки с именем FName в параметр Info. + При ошибке возвращает FALSE. + + PROCEDURE Exists(FName: ARRAY OF CHAR): BOOLEAN + возвращает TRUE, если файл с именем FName существует + + PROCEDURE Close(VAR F: FS) + освобождает память, выделенную для информационной структуры + файла F и присваивает F значение NIL + + PROCEDURE Open(FName: ARRAY OF CHAR): FS + возвращает указатель на информационную структуру файла с + именем FName, при ошибке возвращает NIL + + PROCEDURE Delete(FName: ARRAY OF CHAR): BOOLEAN + удаляет файл с именем FName, при ошибке возвращает FALSE + + PROCEDURE Seek(F: FS; Offset, Origin: INTEGER): INTEGER + устанавливает позицию чтения-записи файла F на Offset, + относительно Origin = (SEEK_BEG - начало файла, + SEEK_CUR - текущая позиция, SEEK_END - конец файла), + возвращает позицию относительно начала файла, например: + Seek(F, 0, SEEK_END) + устанавливает позицию на конец файла и возвращает длину + файла; при ошибке возвращает -1 + + PROCEDURE Read(F: FS; Buffer, Count: INTEGER): INTEGER + Читает данные из файла в память. F - указатель на + информационную структуру файла, Buffer - адрес области + памяти, Count - количество байт, которое требуется прочитать + из файла; возвращает количество байт, которое было прочитано + и соответствующим образом изменяет позицию чтения/записи в + информационной структуре F. + + PROCEDURE Write(F: FS; Buffer, Count: INTEGER): INTEGER + Записывает данные из памяти в файл. F - указатель на + информационную структуру файла, Buffer - адрес области + памяти, Count - количество байт, которое требуется записать + в файл; возвращает количество байт, которое было записано и + соответствующим образом изменяет позицию чтения/записи в + информационной структуре F. + + PROCEDURE Create(FName: ARRAY OF CHAR): FS + создает новый файл с именем FName (полное имя), возвращает + указатель на информационную структуру файла, + при ошибке возвращает NIL + + PROCEDURE CreateDir(DirName: ARRAY OF CHAR): BOOLEAN + создает папку с именем DirName, все промежуточные папки + должны существовать, при ошибке возвращает FALSE + + PROCEDURE DeleteDir(DirName: ARRAY OF CHAR): BOOLEAN + удаляет пустую папку с именем DirName, + при ошибке возвращает FALSE + + PROCEDURE DirExists(DirName: ARRAY OF CHAR): BOOLEAN + возвращает TRUE, если папка с именем DirName существует + +------------------------------------------------------------------------------ +MODULE Read - чтение основных типов данных из файла F + + Процедуры возвращают TRUE в случае успешной операции чтения и + соответствующим образом изменяют позицию чтения/записи в + информационной структуре F + + PROCEDURE Char(F: File.FS; VAR x: CHAR): BOOLEAN + + PROCEDURE Int(F: File.FS; VAR x: INTEGER): BOOLEAN + + PROCEDURE Real(F: File.FS; VAR x: REAL): BOOLEAN + + PROCEDURE Boolean(F: File.FS; VAR x: BOOLEAN): BOOLEAN + + PROCEDURE Set(F: File.FS; VAR x: SET): BOOLEAN + + PROCEDURE Card16(F: File.FS; VAR x: SYSTEM.CARD16): BOOLEAN + +------------------------------------------------------------------------------ +MODULE Write - запись основных типов данных в файл F + + Процедуры возвращают TRUE в случае успешной операции записи и + соответствующим образом изменяют позицию чтения/записи в + информационной структуре F + + PROCEDURE Char(F: File.FS; x: CHAR): BOOLEAN + + PROCEDURE Int(F: File.FS; x: INTEGER): BOOLEAN + + PROCEDURE Real(F: File.FS; x: REAL): BOOLEAN + + PROCEDURE Boolean(F: File.FS; x: BOOLEAN): BOOLEAN + + PROCEDURE Set(F: File.FS; x: SET): BOOLEAN + + PROCEDURE Card16(F: File.FS; x: SYSTEM.CARD16): BOOLEAN + +------------------------------------------------------------------------------ +MODULE DateTime - дата, время + + CONST ERR = -7.0E5 + + PROCEDURE Now(VAR Year, Month, Day, Hour, Min, Sec: INTEGER) + записывает в параметры компоненты текущей системной даты и + времени + + PROCEDURE Encode(Year, Month, Day, Hour, Min, Sec: INTEGER): REAL + возвращает дату, полученную из компонентов + Year, Month, Day, Hour, Min, Sec; + при ошибке возвращает константу ERR = -7.0D5 + + PROCEDURE Decode(Date: REAL; VAR Year, Month, Day, + Hour, Min, Sec: INTEGER): BOOLEAN + извлекает компоненты + Year, Month, Day, Hour, Min, Sec из даты Date; + при ошибке возвращает FALSE + +------------------------------------------------------------------------------ +MODULE Args - параметры программы + + VAR argc: INTEGER + количество параметров программы, включая имя + исполняемого файла + + PROCEDURE GetArg(n: INTEGER; VAR s: ARRAY OF CHAR) + записывает в строку s n-й параметр программы, + нумерация параметров от 0 до argc - 1, + нулевой параметр -- имя исполняемого файла + +------------------------------------------------------------------------------ +MODULE KOSAPI + + PROCEDURE sysfunc1(arg1: INTEGER): INTEGER + PROCEDURE sysfunc2(arg1, arg2: INTEGER): INTEGER + ... + PROCEDURE sysfunc7(arg1, arg2, ..., arg7: INTEGER): INTEGER + Обертки для функций API ядра KolibriOS. + arg1 .. arg7 соответствуют регистрам + eax, ebx, ecx, edx, esi, edi, ebp; + возвращают значение регистра eax после системного вызова. + + PROCEDURE sysfunc22(arg1, arg2: INTEGER; VAR res2: INTEGER): INTEGER + Обертка для функций API ядра KolibriOS. + arg1 - регистр eax, arg2 - регистр ebx, + res2 - значение регистра ebx после системного вызова; + возвращает значение регистра eax после системного вызова. + + PROCEDURE malloc(size: INTEGER): INTEGER + Выделяет блок памяти. + size - размер блока в байтах, + возвращает адрес выделенного блока + + PROCEDURE free(ptr: INTEGER): INTEGER + Освобождает ранее выделенный блок памяти с адресом ptr, + возвращает 0 + + PROCEDURE realloc(ptr, size: INTEGER): INTEGER + Перераспределяет блок памяти, + ptr - адрес ранее выделенного блока, + size - новый размер, + возвращает указатель на перераспределенный блок, + 0 при ошибке + + PROCEDURE GetCommandLine(): INTEGER + Возвращает адрес строки параметров + + PROCEDURE GetName(): INTEGER + Возвращает адрес строки с именем программы + + PROCEDURE LoadLib(name: ARRAY OF CHAR): INTEGER + Загружает DLL с полным именем name. Возвращает адрес таблицы + экспорта. При ошибке возвращает 0. + + PROCEDURE GetProcAdr(name: ARRAY OF CHAR; lib: INTEGER): INTEGER + name - имя процедуры + lib - адрес таблицы экспорта DLL + Возвращает адрес процедуры. При ошибке возвращает 0. + +------------------------------------------------------------------------------ +MODULE ColorDlg - работа с диалогом "Color Dialog" + + TYPE + + Dialog = POINTER TO RECORD (* структура диалога *) + status: INTEGER (* состояние диалога: + 0 - пользователь нажал Cancel + 1 - пользователь нажал OK + 2 - диалог открыт *) + + color: INTEGER (* выбранный цвет *) + END + + PROCEDURE Create(draw_window: DRAW_WINDOW): Dialog + создать диалог + draw_window - процедура перерисовки основного окна + (TYPE DRAW_WINDOW = PROCEDURE); + процедура возвращает указатель на структуру диалога + + PROCEDURE Show(cd: Dialog) + показать диалог + cd - указатель на структуру диалога, который был создан ранее + процедурой Create + + PROCEDURE Destroy(VAR cd: Dialog) + уничтожить диалог + cd - указатель на структуру диалога + +------------------------------------------------------------------------------ +MODULE OpenDlg - работа с диалогом "Open Dialog" + + TYPE + + Dialog = POINTER TO RECORD (* структура диалога *) + status: INTEGER (* состояние диалога: + 0 - пользователь нажал Cancel + 1 - пользователь нажал OK + 2 - диалог открыт *) + + FileName: ARRAY 4096 OF CHAR (* имя выбранного файла *) + FilePath: ARRAY 4096 OF CHAR (* полное имя выбранного + файла *) + END + + PROCEDURE Create(draw_window: DRAW_WINDOW; type: INTEGER; def_path, + filter: ARRAY OF CHAR): Dialog + создать диалог + draw_window - процедура перерисовки основного окна + (TYPE DRAW_WINDOW = PROCEDURE) + type - тип диалога + 0 - открыть + 1 - сохранить + 2 - выбрать папку + def_path - путь по умолчанию, папка def_path будет открыта + при первом запуске диалога + filter - в строке записано перечисление расширений файлов, + которые будут показаны в диалоговом окне, расширения + разделяются символом "|", например: "ASM|TXT|INI" + процедура возвращает указатель на структуру диалога + + PROCEDURE Show(od: Dialog; Width, Height: INTEGER) + показать диалог + od - указатель на структуру диалога, который был создан ранее + процедурой Create + Width и Height - ширина и высота диалогового окна + + PROCEDURE Destroy(VAR od: Dialog) + уничтожить диалог + od - указатель на структуру диалога + +------------------------------------------------------------------------------ +MODULE kfonts - работа с kf-шрифтами + + CONST + + bold = 1 + italic = 2 + underline = 4 + strike_through = 8 + smoothing = 16 + bpp32 = 32 + + TYPE + + TFont = POINTER TO TFont_desc (* указатель на шрифт *) + + PROCEDURE LoadFont(file_name: ARRAY OF CHAR): TFont + загрузить шрифт из файла + file_name имя kf-файла + рез-т: указатель на шрифт/NIL (ошибка) + + PROCEDURE SetSize(Font: TFont; font_size: INTEGER): BOOLEAN + установить размер шрифта + Font указатель на шрифт + font_size размер шрифта + рез-т: TRUE/FALSE (ошибка) + + PROCEDURE Enabled(Font: TFont; font_size: INTEGER): BOOLEAN + проверить, есть ли шрифт, заданного размера + Font указатель на шрифт + font_size размер шрифта + рез-т: TRUE/FALSE (шрифта нет) + + PROCEDURE Destroy(VAR Font: TFont) + выгрузить шрифт, освободить динамическую память + Font указатель на шрифт + Присваивает переменной Font значение NIL + + PROCEDURE TextHeight(Font: TFont): INTEGER + получить высоту строки текста + Font указатель на шрифт + рез-т: высота строки текста в пикселях + + PROCEDURE TextWidth(Font: TFont; + str, length, params: INTEGER): INTEGER + получить ширину строки текста + Font указатель на шрифт + str адрес строки текста в кодировке Win-1251 + length количество символов в строке или -1, если строка + завершается нулем + params параметры-флаги см. ниже + рез-т: ширина строки текста в пикселях + + PROCEDURE TextOut(Font: TFont; + canvas, x, y, str, length, color, params: INTEGER) + вывести текст в буфер + для вывода буфера в окно, использовать ф.65 или + ф.7 (если буфер 24-битный) + Font указатель на шрифт + canvas адрес графического буфера + структура буфера: + Xsize dd + Ysize dd + picture rb Xsize * Ysize * 4 (32 бита) + или Xsize * Ysize * 3 (24 бита) + x, y координаты текста относительно левого верхнего + угла буфера + str адрес строки текста в кодировке Win-1251 + length количество символов в строке или -1, если строка + завершается нулем + color цвет текста 0x00RRGGBB + params параметры-флаги: + 1 жирный + 2 курсив + 4 подчеркнутый + 8 перечеркнутый + 16 применить сглаживание + 32 вывод в 32-битный буфер + возможно использование флагов в любых сочетаниях +------------------------------------------------------------------------------ +MODULE RasterWorks - обертка библиотеки Rasterworks.obj +------------------------------------------------------------------------------ +MODULE libimg - обертка библиотеки libimg.obj +------------------------------------------------------------------------------ \ No newline at end of file diff --git a/doc/Oberon07.Report_2016_05_03.pdf b/doc/Oberon07.Report_2016_05_03.pdf new file mode 100644 index 0000000..2bcb834 Binary files /dev/null and b/doc/Oberon07.Report_2016_05_03.pdf differ diff --git a/doc/WinLib.txt b/doc/WinLib.txt new file mode 100644 index 0000000..d744b52 --- /dev/null +++ b/doc/WinLib.txt @@ -0,0 +1,342 @@ +============================================================================== + + Библиотека (Windows) + +------------------------------------------------------------------------------ +MODULE Out - консольный вывод + + PROCEDURE Open + открывает консольный вывод + + PROCEDURE Int(x, width: INTEGER) + вывод целого числа x; + width - количество знакомест, используемых для вывода + + PROCEDURE Real(x: REAL; width: INTEGER) + вывод вещественного числа x в плавающем формате; + width - количество знакомест, используемых для вывода + + PROCEDURE Char(x: CHAR) + вывод символа x + + PROCEDURE FixReal(x: REAL; width, p: INTEGER) + вывод вещественного числа x в фиксированном формате; + width - количество знакомест, используемых для вывода; + p - количество знаков после десятичной точки + + PROCEDURE Ln + переход на следующую строку + + PROCEDURE String(s: ARRAY OF CHAR) + вывод строки s + +------------------------------------------------------------------------------ +MODULE In - консольный ввод + + VAR Done: BOOLEAN + принимает значение TRUE в случае успешного выполнения + операции ввода и FALSE в противном случае + + PROCEDURE Open + открывает консольный ввод, + также присваивает переменной Done значение TRUE + + PROCEDURE Int(VAR x: INTEGER) + ввод числа типа INTEGER + + PROCEDURE Char(VAR x: CHAR) + ввод символа + + PROCEDURE Real(VAR x: REAL) + ввод числа типа REAL + + PROCEDURE String(VAR s: ARRAY OF CHAR) + ввод строки + + PROCEDURE Ln + ожидание нажатия ENTER + +------------------------------------------------------------------------------ +MODULE Console - дополнительные процедуры консольного вывода + + CONST + + Следующие константы определяют цвет консольного вывода + + Black = 0 Blue = 1 Green = 2 + Cyan = 3 Red = 4 Magenta = 5 + Brown = 6 LightGray = 7 DarkGray = 8 + LightBlue = 9 LightGreen = 10 LightCyan = 11 + LightRed = 12 LightMagenta = 13 Yellow = 14 + White = 15 + + PROCEDURE Cls + очистка окна консоли + + PROCEDURE SetColor(FColor, BColor: INTEGER) + установка цвета консольного вывода: FColor - цвет текста, + BColor - цвет фона, возможные значения - вышеперечисленные + константы + + PROCEDURE SetCursor(x, y: INTEGER) + установка курсора консоли в позицию (x, y) + + PROCEDURE GetCursor(VAR x, y: INTEGER) + записывает в параметры текущие координаты курсора консоли + + PROCEDURE GetCursorX(): INTEGER + возвращает текущую x-координату курсора консоли + + PROCEDURE GetCursorY(): INTEGER + возвращает текущую y-координату курсора консоли + +------------------------------------------------------------------------------ +MODULE Math - математические функции + + CONST + + pi = 3.141592653589793D+00 + e = 2.718281828459045D+00 + + PROCEDURE IsNan(x: REAL): BOOLEAN + возвращает TRUE, если x - не число + + PROCEDURE IsInf(x: REAL): BOOLEAN + возвращает TRUE, если x - бесконечность + + PROCEDURE sqrt(x: REAL): REAL + квадратный корень x + + PROCEDURE exp(x: REAL): REAL + экспонента x + + PROCEDURE ln(x: REAL): REAL + натуральный логарифм x + + PROCEDURE sin(x: REAL): REAL + синус x + + PROCEDURE cos(x: REAL): REAL + косинус x + + PROCEDURE tan(x: REAL): REAL + тангенс x + + PROCEDURE arcsin(x: REAL): REAL + арксинус x + + PROCEDURE arccos(x: REAL): REAL + арккосинус x + + PROCEDURE arctan(x: REAL): REAL + арктангенс x + + PROCEDURE arctan2(y, x: REAL): REAL + арктангенс y/x + + PROCEDURE power(base, exponent: REAL): REAL + возведение числа base в степень exponent + + PROCEDURE log(base, x: REAL): REAL + логарифм x по основанию base + + PROCEDURE sinh(x: REAL): REAL + гиперболический синус x + + PROCEDURE cosh(x: REAL): REAL + гиперболический косинус x + + PROCEDURE tanh(x: REAL): REAL + гиперболический тангенс x + + PROCEDURE arcsinh(x: REAL): REAL + обратный гиперболический синус x + + PROCEDURE arccosh(x: REAL): REAL + обратный гиперболический косинус x + + PROCEDURE arctanh(x: REAL): REAL + обратный гиперболический тангенс x + + PROCEDURE round(x: REAL): REAL + округление x до ближайшего целого + + PROCEDURE frac(x: REAL): REAL; + дробная часть числа x + + PROCEDURE floor(x: REAL): REAL + наибольшее целое число (представление как REAL), + не больше x: floor(1.2) = 1.0 + + PROCEDURE ceil(x: REAL): REAL + наименьшее целое число (представление как REAL), + не меньше x: ceil(1.2) = 2.0 + + PROCEDURE sgn(x: REAL): INTEGER + если x > 0 возвращает 1 + если x < 0 возвращает -1 + если x = 0 возвращает 0 + +------------------------------------------------------------------------------ +MODULE File - работа с файлами + + CONST + + OPEN_R = 0 + OPEN_W = 1 + OPEN_RW = 2 + + SEEK_BEG = 0 + SEEK_CUR = 1 + SEEK_END = 2 + + PROCEDURE Create(FName: ARRAY OF CHAR): INTEGER + создает новый файл с именем FName (полное имя с путем), + открывет файл для записи и возвращает идентификатор файла + (целое число), в случае ошибки, возвращает -1 + + PROCEDURE Open(FName: ARRAY OF CHAR; Mode: INTEGER): INTEGER + открывает существующий файл с именем FName (полное имя с + путем) в режиме Mode = (OPEN_R (только чтение), OPEN_W + (только запись), OPEN_RW (чтение и запись)), возвращает + идентификатор файла (целое число), в случае ошибки, + возвращает -1 + + PROCEDURE Read(F, Buffer, Count: INTEGER): INTEGER + Читает данные из файла в память. F - числовой идентификатор + файла, Buffer - адрес области памяти, Count - количество байт, + которое требуется прочитать из файла; возвращает количество + байт, которое было прочитано из файла + + PROCEDURE Write(F, Buffer, Count: INTEGER): INTEGER + Записывает данные из памяти в файл. F - числовой идентификатор + файла, Buffer - адрес области памяти, Count - количество байт, + которое требуется записать в файл; возвращает количество байт, + которое было записано в файл + + PROCEDURE Seek(F, Offset, Origin: INTEGER): INTEGER + устанавливает позицию чтения-записи файла с идентификатором F + на Offset, относительно Origin = (SEEK_BEG - начало файла, + SEEK_CUR - текущая позиция, SEEK_END - конец файла), + возвращает позицию относительно начала файла, например: + Seek(F, 0, 2) - устанавливает позицию на конец файла и + возвращает длину файла; при ошибке возвращает -1 + + PROCEDURE Close(F: INTEGER) + закрывает ранее открытый файл с идентификатором F + + PROCEDURE Delete(FName: ARRAY OF CHAR): BOOLEAN + удаляет файл с именем FName (полное имя с путем), + возвращает TRUE, если файл успешно удален + + PROCEDURE Exists(FName: ARRAY OF CHAR): BOOLEAN + возвращает TRUE, если файл с именем FName (полное имя) + существует + + PROCEDURE Load(FName: ARRAY OF CHAR; VAR Size: INTEGER): INTEGER + загружает в память существующий файл с именем FName (полное имя с + путем), возвращает адрес памяти, куда был загружен файл, + записывает размер файла в параметр Size; + при ошибке возвращает 0 + +------------------------------------------------------------------------------ +MODULE Read - чтение основных типов данных из файла F + + Процедуры возвращают TRUE в случае успешной операции чтения + + PROCEDURE Char(F: INTEGER; VAR x: CHAR): BOOLEAN + + PROCEDURE Int(F: INTEGER; VAR x: INTEGER): BOOLEAN + + PROCEDURE Real(F: INTEGER; VAR x: REAL): BOOLEAN + + PROCEDURE Boolean(F: INTEGER; VAR x: BOOLEAN): BOOLEAN + + PROCEDURE Set(F: INTEGER; VAR x: SET): BOOLEAN + + PROCEDURE Card16(F: INTEGER; VAR x: SYSTEM.CARD16): BOOLEAN + +------------------------------------------------------------------------------ +MODULE Write - запись основных типов данных в файл F + + Процедуры возвращают TRUE в случае успешной операции записи + + PROCEDURE Char(F: INTEGER; x: CHAR): BOOLEAN + + PROCEDURE Int(F: INTEGER; x: INTEGER): BOOLEAN + + PROCEDURE Real(F: INTEGER; x: REAL): BOOLEAN + + PROCEDURE Boolean(F: INTEGER; x: BOOLEAN): BOOLEAN + + PROCEDURE Set(F: INTEGER; x: SET): BOOLEAN + + PROCEDURE Card16(F: INTEGER; x: SYSTEM.CARD16): BOOLEAN + +------------------------------------------------------------------------------ +MODULE Dir - работа с папками + + PROCEDURE Create(DirName: ARRAY OF CHAR): BOOLEAN + создает папку с именем DirName, все промежуточные папки + должны существовать + + PROCEDURE Remove(DirName: ARRAY OF CHAR): BOOLEAN + удаляет пустую папку с именем DirName + + PROCEDURE Exists(DirName: ARRAY OF CHAR): BOOLEAN + возвращает TRUE, если папка с именем DirName существует + +------------------------------------------------------------------------------ +MODULE DateTime - дата, время + + CONST ERR = -7.0E5 + + PROCEDURE Now(VAR Year, Month, Day, Hour, Min, Sec, MSec: INTEGER) + возвращает в параметрах компоненты текущей системной даты и + времени + + PROCEDURE NowEncode(): REAL; + возвращает текущую системную дату и + время (представление REAL) + + PROCEDURE Encode(Year, Month, Day, + Hour, Min, Sec, MSec: INTEGER): REAL + возвращает дату, полученную из компонентов + Year, Month, Day, Hour, Min, Sec, MSec; + при ошибке возвращает константу ERR = -7.0D5 + + PROCEDURE Decode(Date: REAL; VAR Year, Month, Day, + Hour, Min, Sec, MSec: INTEGER): BOOLEAN + извлекает компоненты + Year, Month, Day, Hour, Min, Sec, MSec из даты Date; + при ошибке возвращает FALSE + +------------------------------------------------------------------------------ +MODULE Args - параметры программы + + VAR argc: INTEGER + количество параметров программы, включая имя + исполняемого файла + + PROCEDURE GetArg(n: INTEGER; VAR s: ARRAY OF CHAR) + записывает в строку s n-й параметр программы, + нумерация параметров от 0 до argc - 1, + нулевой параметр -- имя исполняемого файла + +------------------------------------------------------------------------------ +MODULE Utils - разное + + PROCEDURE Utf8To16(source: ARRAY OF CHAR; + VAR dest: ARRAY OF CHAR): INTEGER; + преобразует символы строки source из кодировки UTF-8 в + кодировку UTF-16, результат записывает в строку dest, + возвращает количество 16-битных символов, записанных в dest + + PROCEDURE PutSeed(seed: INTEGER) + Инициализация генератора случайных чисел целым числом seed + + PROCEDURE Rnd(range: INTEGER): INTEGER + Целые случайные числа в диапазоне 0 <= x < range + +------------------------------------------------------------------------------ +MODULE WINAPI - привязки к некоторым API-функциям Windows \ No newline at end of file