Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 8096 → Rev 8097

/programs/develop/oberon07/doc/CC.txt
0,0 → 1,36
Условная компиляция
 
синтаксис:
 
$IF "(" ident {"|" ident} ")"
<...>
{$ELSIF "(" ident {"|" ident} ")"}
<...>
[$ELSE]
<...>
$END
 
где ident:
- одно из возможных значений параметра <target> в командной строке
- пользовательский идентификатор, переданный с ключом -def при компиляции
 
примеры:
 
$IF (win64con | win64gui | win64dll)
OS := "WIN64";
$ELSIF (win32con | win32gui | win32dll)
OS := "WIN32";
$ELSIF (linux64exe | linux64so)
OS := "LINUX64";
$ELSIF (linux32exe | linux32so)
OS := "LINUX32";
$ELSE
OS := "UNKNOWN";
$END
 
 
$IF (CPUX86_64) (* -def CPUX86_64 *)
bit_depth := 64;
$ELSE
bit_depth := 32;
$END
/programs/develop/oberon07/doc/KOSLib.txt
0,0 → 1,566
==============================================================================
 
Библиотека (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.141592653589793E+00
e = 2.718281828459045E+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 arsinh(x: REAL): REAL
обратный гиперболический синус x
 
PROCEDURE arcosh(x: REAL): REAL
обратный гиперболический косинус x
 
PROCEDURE artanh(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
 
PROCEDURE fact(n: INTEGER): REAL
факториал n
 
------------------------------------------------------------------------------
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 WChar(F: File.FS; VAR x: WCHAR): 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 WChar(F: File.FS; x: WCHAR): 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.0E5
 
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
------------------------------------------------------------------------------
/programs/develop/oberon07/doc/MSP430.txt
0,0 → 1,520
 Компилятор языка программирования Oberon-07/16 для
микроконтроллеров MSP430x{1,2}xx.
------------------------------------------------------------------------------
 
Параметры командной строки
 
Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или
UTF-8 с BOM-сигнатурой.
Выход - hex-файл прошивки.
Параметры:
1) имя главного модуля
2) "msp430"
3) необязательные параметры-ключи
-out <file_name> имя результирующего файла; по умолчанию,
совпадает с именем главного модуля, но с расширением ".hex"
-ram <size> размер ОЗУ в байтах (128 - 2048) по умолчанию 128
-rom <size> размер ПЗУ в байтах (2048 - 24576) по умолчанию 2048
-nochk <"ptibcwra"> отключить проверки при выполнении
-lower разрешить ключевые слова и встроенные идентификаторы в
нижнем регистре
-def <имя> задать символ условной компиляции
 
параметр -nochk задается в виде строки из символов:
"p" - указатели
"t" - типы
"i" - индексы
"b" - неявное приведение INTEGER к BYTE
"c" - диапазон аргумента функции CHR
"a" - все проверки
 
Порядок символов может быть любым. Наличие в строке того или иного
символа отключает соответствующую проверку.
 
Например: -nochk it - отключить проверку индексов и охрану типа.
-nochk a - отключить все отключаемые проверки.
 
Например:
 
Compiler.exe "C:\example.ob07" msp430 -ram 128 -rom 4096 -nochk pti
Compiler.exe "C:\example.ob07" msp430 -out "C:\Ex1.hex" -ram 512 -rom 16384
 
В случае успешной компиляции, компилятор передает код завершения 0, иначе 1.
При работе компилятора в KolibriOS, код завершения не передается.
 
------------------------------------------------------------------------------
Отличия от оригинала
 
1. Расширен псевдомодуль SYSTEM
2. В идентификаторах допускается символ "_"
3. Усовершенствован оператор CASE (добавлены константные выражения в
метках вариантов и необязательная ветка ELSE)
4. Расширен набор стандартных процедур
5. Семантика охраны/проверки типа уточнена для нулевого указателя
6. Добавлены однострочные комментарии (начинаются с пары символов "//")
7. Разрешено наследование от типа-указателя
8. "Строки" можно заключать также в одиночные кавычки: 'строка'
9. Добавлена операция конкатенации строковых и символьных констант
10. Добавлены кодовые процедуры
11. Не реализована вещественная арифметика
 
------------------------------------------------------------------------------
Особенности реализации
 
1. Основные типы
 
Тип Диапазон значений Размер, байт
 
INTEGER -32768 .. 32767 2
CHAR символ ASCII (0X .. 0FFX) 1
BOOLEAN FALSE, TRUE 1
SET множество из целых чисел {0 .. 15} 2
BYTE 0 .. 255 1
 
2. Максимальная длина идентификаторов - 1024 символов
3. Максимальная длина строковых констант - 1024 символов (UTF-8)
4. Максимальная размерность открытых массивов - 5
5. Процедура NEW заполняет нулями выделенный блок памяти
6. Локальные переменные инициализируются нулями
7. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая
модульность отсутствуют
8. Тип BYTE в выражениях всегда приводится к INTEGER
9. Контроль переполнения значений выражений не производится
10. Ошибки времени выполнения:
 
номер ошибка
 
1 ASSERT(x), при x = FALSE
2 разыменование нулевого указателя
3 целочисленное деление на неположительное число
4 вызов процедуры через процедурную переменную с нулевым значением
5 ошибка охраны типа
6 нарушение границ массива
7 непредусмотренное значение выражения в операторе CASE
8 ошибка копирования массивов v := x, если LEN(v) < LEN(x)
9 CHR(x), если (x < 0) OR (x > 255)
11 неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255)
 
------------------------------------------------------------------------------
Псевдомодуль 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 MOVE(Source, Dest, n: INTEGER)
Копирует n байт памяти из Source в Dest,
области Source и Dest не могут перекрываться
 
PROCEDURE GET(a: INTEGER;
VAR v: любой основной тип, PROCEDURE, POINTER)
v := Память[a]
 
PROCEDURE GET8(a: INTEGER; VAR x: INTEGER, SET, BYTE, CHAR)
Эквивалентно
SYSTEM.MOVE(a, SYSTEM.ADR(x), 1)
 
PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER)
Память[a] := x;
Если x: BYTE, то значение x будет расширено до 16 бит,
для записи байтов использовать SYSTEM.PUT8
 
PROCEDURE PUT8(a: INTEGER; x: INTEGER, SET, BYTE, CHAR)
Память[a] := младшие 8 бит (x)
 
PROCEDURE CODE(word1, word2,... : INTEGER)
Вставка машинного кода,
word1, word2 ... - целочисленные константы (константные
выражения) - машинные слова, например:
SYSTEM.CODE(0D032H, 0010H) (* BIS #16, SR; CPUOFF *)
 
 
Функции псевдомодуля 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
необязательна. Если значение x не соответствует ни одному варианту и ELSE
отсутствует, то программа прерывается с ошибкой времени выполнения.
 
------------------------------------------------------------------------------
Конкатенация строковых и символьных констант
 
Допускается конкатенация ("+") константных строк и символов типа CHAR:
 
str = CHR(39) + "string" + CHR(39); (* str = "'string'" *)
 
newline = 0DX + 0AX;
 
------------------------------------------------------------------------------
Проверка и охрана типа нулевого указателя
 
Оригинальное сообщение о языке не определяет поведение программы при
выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих
Oberon-реализациях выполнение такой операции приводит к ошибке времени
выполнения. В данной реализации охрана типа нулевого указателя не приводит к
ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет
значительно сократить частоту применения охраны типа.
 
------------------------------------------------------------------------------
Дополнительные стандартные процедуры
 
 
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. s не может быть константой.
 
------------------------------------------------------------------------------
Использование регистров общего назначения R4 - R15
 
R4 - R7: регистровый стэк (промежуточные значения выражений)
R8 - R13: не используются
R14: указатель кучи
R15: используется при обработке прерываний
 
------------------------------------------------------------------------------
Вызов процедур и кадр стэка
 
Правила вызова похожи на соглашение cdecl (x86):
- параметры передаются через стэк справа налево
- результат, если есть, передается через регистр R4
- вызывающая процедура очищает стэк
 
Состояние стэка при выполнении процедуры:
 
меньшие адреса <- |var3|var2|var1|PC|arg1|arg2|arg3| -> бОльшие адреса
 
PC - значение регистра PC перед вызовом (адрес возврата)
argX - параметры в порядке объявления (слева направо)
varX - локальные переменные в порядке использования в процедуре
 
Размер каждого элемента в стэке (кроме локальных переменных структурных
типов) - 1 машинное слово (2 байта). Структурные переменные (массивы и
записи) занимают место в стэке в соответствии с их размером (с учетом
выравнивания).
 
Размещение локальных переменных зависит от их размеров и порядка
использования, и в общем случае неопределенно. Если переменная не
используется явно, то компилятор не выделяет для нее место в стэке.
 
------------------------------------------------------------------------------
Скрытые параметры процедур
 
Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке
формальных параметров, но учитываются компилятором при трансляции вызовов.
Это возможно в следующих случаях:
 
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))
 
------------------------------------------------------------------------------
Кодовые процедуры
 
Компилятор поддерживает процедуры, написаные в машинных кодах.
Синтаксис:
 
PROCEDURE "[code]" имя [ (параметры): ТипРезультата ]
МашСлово, МашСлово,... МашСлово;
 
";" после заголовка и END "имя" в конце процедуры не ставятся.
МашСлово - целочисленная константа (в том числе и константное выражение).
Например:
 
PROCEDURE [code] asr (n, x: INTEGER): INTEGER (* ASR(x, n) -> R4 *)
4115H, 2, (* MOV 2(SP), R5; R5 <- n *)
4114H, 4, (* MOV 4(SP), R4; R4 <- x *)
0F035H, 15, (* AND #15, R5 *)
2400H + 3, (* JZ L1 *)
(* L2: *)
1104H, (* RRA R4 *)
8315H, (* SUB #1, R5 *)
2000H + 400H - 3; (* JNZ L2 *)
(* L1: *)
 
Компилятор автоматически добавляет к такой процедуре команду RET.
Способ передачи параметров и результата не изменяется.
 
Кодовые процедуры можно использовать также и для добавления в программу
константных данных:
 
PROCEDURE [code] sqr
0, 1, 4, 9, 16, 25, 36, 49, 64, 81;
 
Получить адрес такой "процедуры": SYSTEM.ADR(sqr).
Получить адрес n-го машинного слова: SYSTEM.ADR(sqr) + n * 2.
 
Чтобы использовать кодовые процедуры, необходимо импортировать псевдомодуль
SYSTEM.
 
------------------------------------------------------------------------------
Обработка прерываний
 
При появлении запроса на прерывание, процессор:
- помещает в стэк значение регистра PC
- помещает в стэк значение регистра SR
- очищает регистр SR
- выполняет переход по адресу IV[priority], где
IV - таблица векторов прерываний,
priority - приоритет прерывания (номер элемента в таблице IV) (0..30)
 
Компилятор генерирует код обработки прерываний:
 
; IV[0] = адрес следующей команды
PUSH #0 ; поместить в стэк приоритет прерывания
JMP Label ; перейти к обработчику
 
; IV[1] = адрес следующей команды
PUSH #1 ; поместить в стэк приоритет прерывания
JMP Label ; перейти к обработчику
 
...
; IV[priority] = адрес следующей команды
PUSH #priority ; поместить в стэк приоритет прерывания
JMP Label ; перейти к обработчику
 
...
; IV[30] = адрес следующей команды
PUSH #30 ; поместить в стэк приоритет прерывания
 
Label:
MOV SP, R15 ; настроить R15 на структуру данных прерывания (см. далее)
PUSH R4 ; сохранить рабочие регистры (R4 - R7)
...
PUSH R7
PUSH R15 ; передать параметр interrupt в обработчик (см. далее)
PUSH @R15 ; передать параметр priority в обработчик (см. далее)
CALL int ; вызвать обработчик (см. далее)
ADD #4, SP ; удалить из стэка параметры обработчика
POP R7 ; восстановить рабочие регистры (R7 - R4)
...
POP R4
ADD #2, SP ; удалить из стэка значение priority
RETI ; возврат из прерывания (восстановить SR и PC)
 
------------------------------------------------------------------------------
Обработка ошибок
 
В случае возникновения ошибки при выполнении программы, будет вызван общий
обработчик ошибок, который:
 
- запрещает прерывания
- сбрасывает стэк (во избежание переполнения в процессе обработки ошибки)
- передает параметры в пользовательский обработчик (см. далее)
- вызывает пользовательский обработчик (если он назначен)
- повторно запрещает прерывания
- выключает CPU и все тактовые сигналы
 
Если выключать CPU не требуется, то пользовательский обработчик может,
например, перезапустить программу.
 
------------------------------------------------------------------------------
Инициализация и финализация программы
 
В начало программы компилятор вставляет код, который:
- инициализирует регистры SP и R14
- выключает сторожевой таймер
- назначает пустой обработчик прерываний
- сбрасывает обработчик ошибок
 
В конец программы добавляет команду
BIS #16, SR; выключить CPU
 
------------------------------------------------------------------------------
Структура ОЗУ (RAM)
 
начало -> | спец. переменные | глобальные переменные | куча/стэк | <- конец
 
Компилятор поддерживает размер ОЗУ 128..2048 байт. В нижних адресах
располагаются специальные переменные, и далее пользовательские глобальные
переменные. Оставшаяся часть памяти отводится для кучи и стэка (не менее 64
байта). При старте программы, в регистр R14 записывается адрес начала области
кучи/стэка, а регистр SP настраивается на конец ОЗУ (начало_ОЗУ + размер_ОЗУ).
При выделении памяти процедурой NEW, значение регистра R14 увеличивается (если
есть свободная память). Таким образом, стэк и куча растут навстречу друг
другу. Проверка переполнения стэка не производится.
 
------------------------------------------------------------------------------
Структура ПЗУ (RОM)
 
начало -> |код|свободная область|спец. данные|векторы прерываний| <- конец
 
Компилятор поддерживает размер ПЗУ 2048..24576 байт. В верхних адресах
располагается таблица векторов прерываний (64 байта), адреса 0FFC0H..0FFFFH.
Непосредственно перед ней размещаются специальные данные. Программный
код начинается с адреса (10000H - размер_ПЗУ), этот адрес является также и
точкой входа в программу. Между кодом и спец. данными может оставаться
свободное пространство. Если размер ПЗУ больше, чем указан при компиляции,
то перед кодом будет свободная область. Таким способом можно зарезервировать
нижние сегменты флэш-памяти для записи во время выполнения программы.
 
==============================================================================
MODULE MSP430
 
CONST
 
биты регистра SR:
 
GIE = {3}
CPUOFF = {4}
OSCOFF = {5}
SCG0 = {6}
SCG1 = {7}
 
 
TYPE
 
TInterrupt = RECORD priority: INTEGER; sr: SET; pc: INTEGER END
структура данных прерывания
 
priority - приоритет прерывания:
 
адрес приоритет
0FFFEH 31
0FFFCH 30
0FFFAH 29
...
0FFC0H 0
 
sr - сохраненное значение регистра SR
pc - сохраненное значение регистра PC
 
 
TTrapProc = PROCEDURE (modNum, modName, err, line: INTEGER);
Процедура-обработчик ошибок.
 
modNum - номер модуля (в отчете о компиляции:
compiling (modNum) "modName" )
modName - адрес имени модуля
err - номер ошибки
line - номер строки
 
 
TIntProc = PROCEDURE (priority: INTEGER; interrupt: TInterrupt)
Процедура-обработчик прерываний.
 
priority - приоритет прерывания
interrupt - структура данных прерывания
 
 
PROCEDURE SetTrapProc (TrapProc: TTrapProc)
Назначить обработчик ошибок.
 
 
PROCEDURE SetIntProc (IntProc: TIntProc)
Назначить обработчик прерываний.
 
Нельзя вызывать эту процедуру с параметром NIL, т. к. для экономии
тактов, значение адреса обработчика прерываний не проверяется на NIL.
 
 
PROCEDURE Restart
Перезапустить программу.
При этом: очищается регистр SR, повторно выполняется код инициализации
программы (см. выше). Всё прочее состояние ОЗУ и регистров устройств
сохраняется.
 
 
PROCEDURE SetIntPC (interrupt: TInterrupt; NewPC: INTEGER)
interrupt.pc := NewPC
После возврата из прерывания, регистр PC получит значение NewPC.
 
 
PROCEDURE SetIntSR (interrupt: TInterrupt; NewSR: SET)
interrupt.sr := NewSR
После возврата из прерывания, регистр SR получит значение NewSR.
 
 
PROCEDURE DInt
Запретить прерывания.
 
 
PROCEDURE EInt
Разрешить прерывания.
 
 
PROCEDURE CpuOff
Выключить CPU (установить бит CPUOFF регистра SR).
 
 
PROCEDURE Halt
Запретить прерывания, выключить CPU и все тактовые сигналы.
 
 
PROCEDURE SetSR (bits: SET)
Установить биты bits регистра SR.
 
 
PROCEDURE ClrSR (bits: SET)
Сбросить биты bits регистра SR.
 
 
PROCEDURE GetFreeFlash (VAR address, size: INTEGER)
Получить адрес и размер свободной области Flash/ROM
(между кодом и данными).
 
 
PROCEDURE Delay (n: INTEGER)
Задержка выполнения программы на 1000*n тактов,
но не менее чем на 2000 тактов.
 
 
==============================================================================
/programs/develop/oberon07/doc/Oberon07.Report_2016_05_03.pdf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/develop/oberon07/doc/STM32.txt
0,0 → 1,404
 Компилятор языка программирования Oberon-07/16 для
микроконтроллеров STM32 Cortex-M3.
 
------------------------------------------------------------------------------
Параметры командной строки
 
Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или
UTF-8 с BOM-сигнатурой.
Выход - hex-файл прошивки.
Параметры:
1) имя главного модуля
2) "stm32cm3"
3) необязательные параметры-ключи
-out <file_name> имя результирующего файла; по умолчанию,
совпадает с именем главного модуля, но с расширением ".hex"
-ram <size> размер ОЗУ в килобайтах (4 - 65536) по умолчанию 4
-rom <size> размер ПЗУ в килобайтах (16 - 65536) по умолчанию 16
-nochk <"ptibcwra"> отключить проверки при выполнении
-lower разрешить ключевые слова и встроенные идентификаторы в
нижнем регистре
-def <имя> задать символ условной компиляции
 
параметр -nochk задается в виде строки из символов:
"p" - указатели
"t" - типы
"i" - индексы
"b" - неявное приведение INTEGER к BYTE
"c" - диапазон аргумента функции CHR
"w" - диапазон аргумента функции WCHR
"r" - эквивалентно "bcw"
"a" - все проверки
 
Порядок символов может быть любым. Наличие в строке того или иного
символа отключает соответствующую проверку.
 
Например: -nochk it - отключить проверку индексов и охрану типа.
-nochk a - отключить все отключаемые проверки.
 
Например:
 
Compiler.exe "C:\example.ob07" stm32cm3 -ram 32 -rom 256 -nochk pti
Compiler.exe "C:\example.ob07" stm32cm3 -out "C:\Ex1.hex" -ram 8 -rom 32
 
В случае успешной компиляции, компилятор передает код завершения 0, иначе 1.
При работе компилятора в KolibriOS, код завершения не передается.
 
------------------------------------------------------------------------------
Отличия от оригинала
 
1. Расширен псевдомодуль SYSTEM
2. В идентификаторах допускается символ "_"
3. Усовершенствован оператор CASE (добавлены константные выражения в
метках вариантов и необязательная ветка ELSE)
4. Расширен набор стандартных процедур
5. Семантика охраны/проверки типа уточнена для нулевого указателя
6. Добавлены однострочные комментарии (начинаются с пары символов "//")
7. Разрешено наследование от типа-указателя
8. "Строки" можно заключать также в одиночные кавычки: 'строка'
9. Добавлен тип WCHAR
10. Добавлена операция конкатенации строковых и символьных констант
11. Добавлены кодовые процедуры
 
------------------------------------------------------------------------------
Особенности реализации
 
1. Основные типы
 
Тип Диапазон значений Размер, байт
 
INTEGER -2147483648 .. 2147483647 4
REAL 1.17E-38 .. 3.40E+38 4
CHAR символ ASCII (0X .. 0FFX) 1
BOOLEAN FALSE, TRUE 1
SET множество из целых чисел {0 .. 31} 4
BYTE 0 .. 255 1
WCHAR символ юникода (0X .. 0FFFFX) 2
 
2. Максимальная длина идентификаторов - 1024 символов
3. Максимальная длина строковых констант - 1024 символов (UTF-8)
4. Максимальная размерность открытых массивов - 5
5. Процедура NEW заполняет нулями выделенный блок памяти
6. Локальные переменные инициализируются нулями
7. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая
модульность отсутствуют
8. Тип BYTE в выражениях всегда приводится к INTEGER
9. Контроль переполнения значений выражений не производится
 
------------------------------------------------------------------------------
Псевдомодуль SYSTEM
 
Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры,
ошибки при использовании процедур псевдомодуля SYSTEM могут привести к
повреждению данных времени выполнения и аварийному завершению программы.
 
PROCEDURE ADR(v: любой тип): INTEGER
v - переменная или процедура;
возвращает адрес v
 
PROCEDURE SADR(x: строковая константа (CHAR UTF-8)): INTEGER
возвращает адрес x
 
PROCEDURE WSADR(x: строковая константа (WCHAR)): INTEGER
возвращает адрес x
 
PROCEDURE SIZE(T): INTEGER
возвращает размер типа T
 
PROCEDURE TYPEID(T): INTEGER
T - тип-запись или тип-указатель,
возвращает номер типа в таблице типов-записей
 
PROCEDURE INF(): REAL
возвращает специальное вещественное значение "бесконечность"
 
PROCEDURE MOVE(Source, Dest, n: INTEGER)
Копирует n байт памяти из Source в Dest,
области Source и Dest не могут перекрываться
 
PROCEDURE GET(a: INTEGER;
VAR v: любой основной тип, PROCEDURE, POINTER)
v := Память[a]
 
PROCEDURE GET8(a: INTEGER;
VAR x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
Эквивалентно
SYSTEM.MOVE(a, SYSTEM.ADR(x), 1)
 
PROCEDURE GET16(a: INTEGER;
VAR x: INTEGER, SET, WCHAR, SYSTEM.CARD32)
Эквивалентно
SYSTEM.MOVE(a, SYSTEM.ADR(x), 2)
 
PROCEDURE GET32(a: INTEGER; VAR x: INTEGER, SET, SYSTEM.CARD32)
Эквивалентно
SYSTEM.MOVE(a, SYSTEM.ADR(x), 4)
 
PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER)
Память[a] := x;
Если x: BYTE или x: WCHAR, то значение x будет расширено
до 32 бит, для записи байтов использовать SYSTEM.PUT8,
для WCHAR -- SYSTEM.PUT16
 
PROCEDURE PUT8(a: INTEGER;
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
Память[a] := младшие 8 бит (x)
 
PROCEDURE PUT16(a: INTEGER;
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
Память[a] := младшие 16 бит (x)
 
PROCEDURE PUT32(a: INTEGER;
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
Память[a] := младшие 32 бит (x)
 
PROCEDURE CODE(hword1, hword2,... : INTEGER)
Вставка машинного кода,
hword1, hword2 ... - константы в диапазоне 0..65535,
например:
SYSTEM.CODE(0BF30H) (* wfi *)
 
Также, в модуле SYSTEM определен тип CARD32 (4 байта). Для типа CARD32 не
допускаются никакие явные операции, за исключением присваивания.
 
Функции псевдомодуля 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
необязательна. Если значение x не соответствует ни одному варианту и ELSE
отсутствует, то программа прерывается с ошибкой времени выполнения.
 
------------------------------------------------------------------------------
Тип WCHAR
 
Тип WCHAR добавлен в язык для удобной поддежки юникода. Для типов WCHAR и
ARRAY OF WCHAR допускаются все те же операции, как для типов CHAR и
ARRAY OF CHAR, за исключением встроенной процедуры CHR, которая возвращает
только тип CHAR. Для получения значения типа WCHAR, следует использовать
процедуру WCHR вместо CHR. Для правильной работы с типом, необходимо сохранять
исходный код в кодировке UTF-8 c BOM.
 
------------------------------------------------------------------------------
Конкатенация строковых и символьных констант
 
Допускается конкатенация ("+") константных строк и символов типа CHAR:
 
str = CHR(39) + "string" + CHR(39); (* str = "'string'" *)
 
newline = 0DX + 0AX;
 
------------------------------------------------------------------------------
Проверка и охрана типа нулевого указателя
 
Оригинальное сообщение о языке не определяет поведение программы при
выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих
Oberon-реализациях выполнение такой операции приводит к ошибке времени
выполнения. В данной реализации охрана типа нулевого указателя не приводит к
ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет
значительно сократить частоту применения охраны типа.
 
------------------------------------------------------------------------------
Дополнительные стандартные процедуры
 
 
COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR);
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/WCHAR): INTEGER
Длина 0X-завершенной строки s, без учета символа 0X.
Если символ 0X отсутствует, функция возвращает длину
массива s. s не может быть константой.
 
WCHR (n: INTEGER): WCHAR
Преобразование типа, аналогично CHR(n: INTEGER): CHAR
 
------------------------------------------------------------------------------
Использование регистров общего назначения R0 - R12
 
R0 - R3: регистровый стэк (промежуточные значения выражений)
R4 - R12: не используются
 
------------------------------------------------------------------------------
Вызов процедур и кадр стэка
 
Правила вызова похожи на соглашение cdecl (x86):
- параметры передаются через стэк справа налево
- результат, если есть, передается через регистр R0
- вызывающая процедура очищает стэк
 
Состояние стэка при выполнении процедуры:
 
меньшие адреса <- |var3|var2|var1|LR|arg1|arg2|arg3| -> бОльшие адреса
 
LR - сохраненный регистр LR (адрес возврата)
argX - параметры в порядке объявления (слева направо)
varX - локальные переменные в порядке использования в процедуре
 
Размер каждого элемента в стэке (кроме локальных переменных структурных
типов) - 1 машинное слово (4 байта). Структурные переменные (массивы и
записи) занимают место в стэке в соответствии с их размером (с учетом
выравнивания).
 
Размещение локальных переменных зависит от их размеров и порядка
использования, и в общем случае неопределенно. Если переменная не
используется явно, то компилятор не выделяет для нее место в стэке.
 
------------------------------------------------------------------------------
Скрытые параметры процедур
 
Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке
формальных параметров, но учитываются компилятором при трансляции вызовов.
Это возможно в следующих случаях:
 
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))
 
------------------------------------------------------------------------------
Кодовые процедуры
 
Компилятор поддерживает процедуры, написаные в машинных кодах.
Синтаксис:
 
PROCEDURE "[code]" имя [ (параметры): ТипРезультата ]
МашКом, МашКом,... МашКом;
 
";" после заголовка и END "имя" в конце процедуры не ставятся.
МашКом - целочисленная константа [0..65535] (в том числе и константное
выражение).
 
Например:
 
PROCEDURE [code] WFI
0BF30H; (* wfi *)
 
Компилятор автоматически добавляет к такой процедуре команду возврата
(bx LR). Способ передачи параметров и результата не изменяется. Регистр LR,
при входе в процедуру не сохраняется.
 
Чтобы использовать кодовые процедуры, необходимо импортировать псевдомодуль
SYSTEM.
 
------------------------------------------------------------------------------
Обработка прерываний
 
При возникновении прерывания, будет вызван обработчик (если он объявлен).
Объявление обработчика:
 
PROCEDURE handler_name [iv]; (* процедура без параметров *)
 
iv - целочисленная константа (константное выражение), номер вектора прерывания
в таблице векторов, iv >= 2:
 
0 начальное значение SP
1 сброс
...
15 SysTick
...
59 TIM6
60 TIM7
...
 
например:
 
(* обработчик прерываний от TIM6 *)
PROCEDURE tim6 [59];
BEGIN
(* код обработки *)
END tim6;
 
Также, можно объявить общий обработчик (iv = 0), который будет вызван, если
не назначен индивидуальный. Общий обработчик получает параметр - номер вектора
прерывания. По значению этого параметра, обработчик должен определить источник
прерывания и выполнить соответствующие действия:
 
PROCEDURE handler (iv: INTEGER) [0];
BEGIN
IF iv = 59 THEN
(* TIM6 *)
ELSIF iv = 60 THEN
(* TIM7 *)
ELSIF ....
....
END
END handler;
 
В конец программы компилятор добавляет команду ожидания прерывания.
 
------------------------------------------------------------------------------
Обработка ошибок
 
В случае возникновения ошибки при выполнении программы, будет вызван
пользовательский обработчик (если он объявлен).
 
Объявление обработчика ошибок:
 
PROCEDURE trap (modNum, modName, err, line: INTEGER) [1];
BEGIN
END trap;
 
где,
modNum - номер модуля (в отчете о компиляции:
compiling (modNum) "modName" )
modName - адрес имени модуля
err - код ошибки
line - номер строки
 
Коды ошибок:
 
1 ASSERT(x), при x = FALSE
2 разыменование нулевого указателя
3 целочисленное деление на неположительное число
4 вызов процедуры через процедурную переменную с нулевым значением
5 ошибка охраны типа
6 нарушение границ массива
7 непредусмотренное значение выражения в операторе CASE
8 ошибка копирования массивов v := x, если LEN(v) < LEN(x)
9 CHR(x), если (x < 0) OR (x > 255)
10 WCHR(x), если (x < 0) OR (x > 65535)
11 неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255)
 
После возврата из обработчика программа будет перезапущена.
 
------------------------------------------------------------------------------
/programs/develop/oberon07/doc/WinLib.txt
0,0 → 1,312
==============================================================================
 
Библиотека (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 (ASCII)
 
PROCEDURE StringW(s: ARRAY OF WCHAR)
вывод строки s (UTF-16)
 
------------------------------------------------------------------------------
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.141592653589793E+00
e = 2.718281828459045E+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 arsinh(x: REAL): REAL
обратный гиперболический синус x
 
PROCEDURE arcosh(x: REAL): REAL
обратный гиперболический косинус x
 
PROCEDURE artanh(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
 
PROCEDURE fact(n: INTEGER): REAL
факториал n
 
------------------------------------------------------------------------------
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
 
PROCEDURE CreateDir(DirName: ARRAY OF CHAR): BOOLEAN
создает папку с именем DirName, все промежуточные папки
должны существовать. В случае ошибки, возвращает FALSE
 
PROCEDURE RemoveDir(DirName: ARRAY OF CHAR): BOOLEAN
удаляет пустую папку с именем DirName. В случае ошибки,
возвращает FALSE
 
PROCEDURE ExistsDir(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.0E5
 
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
/programs/develop/oberon07/doc/x86.txt
0,0 → 1,401
 Компилятор языка программирования Oberon-07/16 для i486
Windows/Linux/KolibriOS.
------------------------------------------------------------------------------
 
Параметры командной строки
 
Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или
UTF-8 с BOM-сигнатурой.
Выход - испоняемый файл формата PE32, ELF или MENUET01/MSCOFF.
Параметры:
1) имя главного модуля
2) тип приложения
"win32con" - Windows console
"win32gui" - Windows GUI
"win32dll" - Windows DLL
"linux32exe" - Linux ELF-EXEC
"linux32so" - Linux ELF-SO
"kosexe" - KolibriOS
"kosdll" - KolibriOS DLL
 
3) необязательные параметры-ключи
-out <file_name> имя результирующего файла; по умолчанию,
совпадает с именем главного модуля, но с другим расширением
(соответствует типу исполняемого файла)
-stk <size> размер стэка в мегабайтах (по умолчанию 2 Мб,
допустимо от 1 до 32 Мб)
-nochk <"ptibcwra"> отключить проверки при выполнении (см. ниже)
-lower разрешить ключевые слова и встроенные идентификаторы в
нижнем регистре
-def <имя> задать символ условной компиляции
-ver <major.minor> версия программы (только для kosdll)
 
параметр -nochk задается в виде строки из символов:
"p" - указатели
"t" - типы
"i" - индексы
"b" - неявное приведение INTEGER к BYTE
"c" - диапазон аргумента функции CHR
"w" - диапазон аргумента функции WCHR
"r" - эквивалентно "bcw"
"a" - все проверки
 
Порядок символов может быть любым. Наличие в строке того или иного
символа отключает соответствующую проверку.
 
Например: -nochk it - отключить проверку индексов и охрану типа.
-nochk a - отключить все отключаемые проверки.
 
Например:
 
Compiler.exe "C:\example.ob07" win32con -out "C:\example.exe" -stk 1
Compiler.exe "C:\example.ob07" win32dll -out "C:\example.dll"
Compiler.exe "C:\example.ob07" win32gui -out "C:\example.exe" -stk 4
Compiler.exe "C:\example.ob07" win32con -out "C:\example.exe" -nochk pti
Compiler.kex "/tmp0/1/example.ob07" kosexe -out "/tmp0/1/example.kex" -stk 4
Compiler.kex "/tmp0/1/example.ob07" kosdll -out "/tmp0/1/mydll.obj" -ver 2.7
Compiler.exe "C:\example.ob07" linux32exe -out "C:\example" -stk 1 -nochk a
 
В случае успешной компиляции, компилятор передает код завершения 0, иначе 1.
При работе компилятора в KolibriOS, код завершения не передается.
 
------------------------------------------------------------------------------
Отличия от оригинала
 
1. Расширен псевдомодуль SYSTEM
2. В идентификаторах допускается символ "_"
3. Добавлены системные флаги
4. Усовершенствован оператор CASE (добавлены константные выражения в
метках вариантов и необязательная ветка ELSE)
5. Расширен набор стандартных процедур
6. Семантика охраны/проверки типа уточнена для нулевого указателя
7. Добавлены однострочные комментарии (начинаются с пары символов "//")
8. Разрешено наследование от типа-указателя
9. Добавлен синтаксис для импорта процедур из внешних библиотек
10. "Строки" можно заключать также в одиночные кавычки: 'строка'
11. Добавлен тип WCHAR
12. Добавлена операция конкатенации строковых и символьных констант
 
------------------------------------------------------------------------------
Особенности реализации
 
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
WCHAR символ юникода (0X .. 0FFFFX) 2
 
2. Максимальная длина идентификаторов - 1024 символов
3. Максимальная длина строковых констант - 1024 символов (UTF-8)
4. Максимальная размерность открытых массивов - 5
5. Процедура NEW заполняет нулями выделенный блок памяти
6. Глобальные и локальные переменные инициализируются нулями
7. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая
модульность отсутствуют
8. Тип BYTE в выражениях всегда приводится к INTEGER
9. Контроль переполнения значений выражений не производится
10. Ошибки времени выполнения:
 
1 ASSERT(x), при x = FALSE
2 разыменование нулевого указателя
3 целочисленное деление на неположительное число
4 вызов процедуры через процедурную переменную с нулевым значением
5 ошибка охраны типа
6 нарушение границ массива
7 непредусмотренное значение выражения в операторе CASE
8 ошибка копирования массивов v := x, если LEN(v) < LEN(x)
9 CHR(x), если (x < 0) OR (x > 255)
10 WCHR(x), если (x < 0) OR (x > 65535)
11 неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255)
 
------------------------------------------------------------------------------
Псевдомодуль SYSTEM
 
Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры,
ошибки при использовании процедур псевдомодуля SYSTEM могут привести к
повреждению данных времени выполнения и аварийному завершению программы.
 
PROCEDURE ADR(v: любой тип): INTEGER
v - переменная или процедура;
возвращает адрес v
 
PROCEDURE SADR(x: строковая константа (CHAR UTF-8)): INTEGER
возвращает адрес x
 
PROCEDURE WSADR(x: строковая константа (WCHAR)): INTEGER
возвращает адрес x
 
PROCEDURE SIZE(T): INTEGER
возвращает размер типа T
 
PROCEDURE TYPEID(T): INTEGER
T - тип-запись или тип-указатель,
возвращает номер типа в таблице типов-записей
 
PROCEDURE INF(): REAL
возвращает специальное вещественное значение "бесконечность"
 
PROCEDURE MOVE(Source, Dest, n: INTEGER)
Копирует n байт памяти из Source в Dest,
области Source и Dest не могут перекрываться
 
PROCEDURE GET(a: INTEGER;
VAR v: любой основной тип, PROCEDURE, POINTER)
v := Память[a]
 
PROCEDURE GET8(a: INTEGER;
VAR x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
Эквивалентно
SYSTEM.MOVE(a, SYSTEM.ADR(x), 1)
 
PROCEDURE GET16(a: INTEGER;
VAR x: INTEGER, SET, WCHAR, SYSTEM.CARD32)
Эквивалентно
SYSTEM.MOVE(a, SYSTEM.ADR(x), 2)
 
PROCEDURE GET32(a: INTEGER; VAR x: INTEGER, SET, SYSTEM.CARD32)
Эквивалентно
SYSTEM.MOVE(a, SYSTEM.ADR(x), 4)
 
PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER)
Память[a] := x;
Если x: BYTE или x: WCHAR, то значение x будет расширено
до 32 бит, для записи байтов использовать SYSTEM.PUT8,
для WCHAR -- SYSTEM.PUT16
 
PROCEDURE PUT8(a: INTEGER;
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
Память[a] := младшие 8 бит (x)
 
PROCEDURE PUT16(a: INTEGER;
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
Память[a] := младшие 16 бит (x)
 
PROCEDURE PUT32(a: INTEGER;
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
Память[a] := младшие 32 бит (x)
 
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 определен тип CARD32 (4 байта). Для типа CARD32 не
допускаются никакие явные операции, за исключением присваивания.
 
Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях.
 
------------------------------------------------------------------------------
Системные флаги
 
При объявлении процедурных типов и глобальных процедур, после ключевого
слова PROCEDURE может быть указан флаг соглашения о вызове: [stdcall],
[ccall], [ccall16], [windows], [linux], [oberon]. Например:
 
PROCEDURE [ccall] MyProc (x, y, z: INTEGER): INTEGER;
 
Если указан флаг [ccall16], то принимается соглашение ccall, но перед
вызовом указатель стэка будет выравнен по границе 16 байт.
Флаг [windows] - синоним для [stdcall], [linux] - синоним для [ccall16].
Знак "-" после имени флага ([stdcall-], [linux-], ...) означает, что
результат процедуры можно игнорировать (не допускается для типа REAL).
Если флаг не указан или указан флаг [oberon], то принимается внутреннее
соглашение о вызове.
 
При объявлении типов-записей, после ключевого слова 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
необязательна. Если значение x не соответствует ни одному варианту и ELSE
отсутствует, то программа прерывается с ошибкой времени выполнения.
 
------------------------------------------------------------------------------
Тип WCHAR
 
Тип WCHAR добавлен в язык для удобной поддежки юникода. Для типов WCHAR и
ARRAY OF WCHAR допускаются все те же операции, как для типов CHAR и
ARRAY OF CHAR, за исключением встроенной процедуры CHR, которая возвращает
только тип CHAR. Для получения значения типа WCHAR, следует использовать
процедуру WCHR вместо CHR. Для правильной работы с типом, необходимо сохранять
исходный код в кодировке UTF-8 c BOM.
 
------------------------------------------------------------------------------
Конкатенация строковых и символьных констант
 
Допускается конкатенация ("+") константных строк и символов типа CHAR:
 
str = CHR(39) + "string" + CHR(39); (* str = "'string'" *)
 
newline = 0DX + 0AX;
 
------------------------------------------------------------------------------
Проверка и охрана типа нулевого указателя
 
Оригинальное сообщение о языке не определяет поведение программы при
выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих
Oberon-реализациях выполнение такой операции приводит к ошибке времени
выполнения. В данной реализации охрана типа нулевого указателя не приводит к
ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет
значительно сократить частоту применения охраны типа.
 
------------------------------------------------------------------------------
Дополнительные стандартные процедуры
 
DISPOSE (VAR v: любой_указатель)
Освобождает память, выделенную процедурой NEW для
динамической переменной v^, и присваивает переменной v
значение NIL.
 
COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR);
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/WCHAR): INTEGER
Длина 0X-завершенной строки s, без учета символа 0X.
Если символ 0X отсутствует, функция возвращает длину
массива s. s не может быть константой.
 
WCHR (n: INTEGER): WCHAR
Преобразование типа, аналогично CHR(n: INTEGER): CHAR
 
------------------------------------------------------------------------------
Импортированные процедуры
 
Синтаксис импорта:
 
PROCEDURE [callconv, library, function] proc_name (FormalParam): Type;
 
- callconv -- соглашение о вызове
- library -- имя файла динамической библиотеки (строковая константа)
- function -- имя импортируемой процедуры (строковая константа), если
указана пустая строка, то имя процедуры = proc_name
 
например:
 
PROCEDURE [windows, "kernel32.dll", ""] ExitProcess (code: INTEGER);
 
PROCEDURE [stdcall, "Console.obj", "con_exit"] exit (bCloseWindow: BOOLEAN);
 
В конце объявления может быть добавлено (необязательно) "END proc_name;"
 
Объявления импортированных процедур должны располагаться в глобальной
области видимости модуля после объявления переменных, вместе с объявлением
"обычных" процедур, от которых импортированные отличаются только отсутствием
тела процедуры. В остальном, к таким процедурам применимы те же правила:
их можно вызвать, присвоить процедурной переменной или получить адрес.
 
Так как импортированная процедура всегда имеет явное указание соглашения о
вызове, то совместимый процедурный тип тоже должен быть объявлен с указанием
соглашения о вызове:
 
VAR
ExitProcess: PROCEDURE [windows] (code: INTEGER);
con_exit: PROCEDURE [stdcall] (bCloseWindow: BOOLEAN);
 
В KolibriOS импортировать процедуры можно только из библиотек, размещенных
в /rd/1/lib. Импортировать и вызывать функции инициализации библиотек
(lib_init, START) при этом не нужно.
 
Для Linux, импортированные процедуры не реализованы.
 
------------------------------------------------------------------------------
Скрытые параметры процедур
 
Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке
формальных параметров, но учитываются компилятором при трансляции вызовов.
Это возможно в следующих случаях:
 
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. Компилятор транслирует
некоторые операции (проверка и охрана типа, сравнение строк, сообщения об
ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не
следует вызывать эти процедуры явно.
Сообщения об ошибках времени выполнения выводятся в диалоговых окнах
(Windows), в терминал (Linux), на доску отладки (KolibriOS).
 
------------------------------------------------------------------------------
Модуль API
 
Существуют несколько реализаций модуля API (для различных ОС).
Как и модуль RTL, модуль API не предназначен для прямого использования.
Он обеспечивает связь RTL с ОС.
 
------------------------------------------------------------------------------
Генерация исполняемых файлов DLL
 
Разрешается экспортировать только процедуры. Для этого, процедура должна
находиться в главном модуле программы, и ее имя должно быть отмечено символом
экспорта ("*"). Нельзя экспортировать процедуры, которые импортированы из
других dll-библиотек.
 
KolibriOS DLL всегда экспортируют идентификаторы "version" (версия
программы) и "lib_init" - адрес процедуры инициализации DLL:
 
PROCEDURE [stdcall] lib_init (): INTEGER
 
Эта процедура должна быть вызвана перед использованием DLL.
Процедура всегда возвращает 1.
/programs/develop/oberon07/doc/x86_64.txt
0,0 → 1,381
 Компилятор языка программирования Oberon-07/16 для x86_64
Windows/Linux
------------------------------------------------------------------------------
 
Параметры командной строки
 
Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или
UTF-8 с BOM-сигнатурой.
Выход - испоняемый файл формата PE32+ или ELF64.
Параметры:
1) имя главного модуля
2) тип приложения
"win64con" - Windows64 console
"win64gui" - Windows64 GUI
"win64dll" - Windows64 DLL
"linux64exe" - Linux ELF64-EXEC
"linux64so" - Linux ELF64-SO
 
3) необязательные параметры-ключи
-out <file_name> имя результирующего файла; по умолчанию,
совпадает с именем главного модуля, но с другим расширением
(соответствует типу исполняемого файла)
-stk <size> размер стэка в мегабайтах (по умолчанию 2 Мб,
допустимо от 1 до 32 Мб)
-nochk <"ptibcwra"> отключить проверки при выполнении
-lower разрешить ключевые слова и встроенные идентификаторы в
нижнем регистре
-def <имя> задать символ условной компиляции
 
параметр -nochk задается в виде строки из символов:
"p" - указатели
"t" - типы
"i" - индексы
"b" - неявное приведение INTEGER к BYTE
"c" - диапазон аргумента функции CHR
"w" - диапазон аргумента функции WCHR
"r" - эквивалентно "bcw"
"a" - все проверки
 
Порядок символов может быть любым. Наличие в строке того или иного
символа отключает соответствующую проверку.
 
Например: -nochk it - отключить проверку индексов и охрану типа.
-nochk a - отключить все отключаемые проверки.
 
Например:
 
Compiler.exe "C:\example.ob07" win64con -out "C:\example.exe" -stk 1
Compiler.exe "C:\example.ob07" win64dll -out "C:\example.dll" -nochk pti
Compiler "source/Compiler.ob07" linux64exe -out "source/Compiler" -nochk a
 
В случае успешной компиляции, компилятор передает код завершения 0, иначе 1.
 
------------------------------------------------------------------------------
Отличия от оригинала
 
1. Расширен псевдомодуль SYSTEM
2. В идентификаторах допускается символ "_"
3. Добавлены системные флаги
4. Усовершенствован оператор CASE (добавлены константные выражения в
метках вариантов и необязательная ветка ELSE)
5. Расширен набор стандартных процедур
6. Семантика охраны/проверки типа уточнена для нулевого указателя
7. Добавлены однострочные комментарии (начинаются с пары символов "//")
8. Разрешено наследование от типа-указателя
9. Добавлен синтаксис для импорта процедур из внешних библиотек
10. "Строки" можно заключать также в одиночные кавычки: 'строка'
11. Добавлен тип WCHAR
12. Добавлена операция конкатенации строковых и символьных констант
 
------------------------------------------------------------------------------
Особенности реализации
 
1. Основные типы
 
Тип Диапазон значений Размер, байт
 
INTEGER -9223372036854775808 .. 9223372036854775807 8
REAL 4.94E-324 .. 1.70E+308 8
CHAR символ ASCII (0X .. 0FFX) 1
BOOLEAN FALSE, TRUE 1
SET множество из целых чисел {0 .. 63} 8
BYTE 0 .. 255 1
WCHAR символ юникода (0X .. 0FFFFX) 2
 
2. Максимальная длина идентификаторов - 1024 символов
3. Максимальная длина строковых констант - 1024 символов (UTF-8)
4. Максимальная размерность открытых массивов - 5
5. Процедура NEW заполняет нулями выделенный блок памяти
6. Глобальные и локальные переменные инициализируются нулями
7. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая
модульность отсутствуют
8. Тип BYTE в выражениях всегда приводится к INTEGER
9. Контроль переполнения значений выражений не производится
10. Ошибки времени выполнения:
 
1 ASSERT(x), при x = FALSE
2 разыменование нулевого указателя
3 целочисленное деление на неположительное число
4 вызов процедуры через процедурную переменную с нулевым значением
5 ошибка охраны типа
6 нарушение границ массива
7 непредусмотренное значение выражения в операторе CASE
8 ошибка копирования массивов v := x, если LEN(v) < LEN(x)
9 CHR(x), если (x < 0) OR (x > 255)
10 WCHR(x), если (x < 0) OR (x > 65535)
11 неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255)
 
------------------------------------------------------------------------------
Псевдомодуль SYSTEM
 
Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры,
ошибки при использовании процедур псевдомодуля SYSTEM могут привести к
повреждению данных времени выполнения и аварийному завершению программы.
 
PROCEDURE ADR(v: любой тип): INTEGER
v - переменная или процедура;
возвращает адрес v
 
PROCEDURE SADR(x: строковая константа (CHAR UTF-8)): INTEGER
возвращает адрес x
 
PROCEDURE WSADR(x: строковая константа (WCHAR)): INTEGER
возвращает адрес x
 
PROCEDURE SIZE(T): INTEGER
возвращает размер типа T
 
PROCEDURE TYPEID(T): INTEGER
T - тип-запись или тип-указатель,
возвращает номер типа в таблице типов-записей
 
PROCEDURE INF(): REAL
возвращает специальное вещественное значение "бесконечность"
 
PROCEDURE MOVE(Source, Dest, n: INTEGER)
Копирует n байт памяти из Source в Dest,
области Source и Dest не могут перекрываться
 
PROCEDURE GET(a: INTEGER;
VAR v: любой основной тип, PROCEDURE, POINTER)
v := Память[a]
 
PROCEDURE GET8(a: INTEGER;
VAR x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
Эквивалентно
SYSTEM.MOVE(a, SYSTEM.ADR(x), 1)
 
PROCEDURE GET16(a: INTEGER;
VAR x: INTEGER, SET, WCHAR, SYSTEM.CARD32)
Эквивалентно
SYSTEM.MOVE(a, SYSTEM.ADR(x), 2)
 
PROCEDURE GET32(a: INTEGER; VAR x: INTEGER, SET, SYSTEM.CARD32)
Эквивалентно
SYSTEM.MOVE(a, SYSTEM.ADR(x), 4)
 
PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER)
Память[a] := x;
Если x: BYTE или x: WCHAR, то значение x будет расширено
до 64 бит, для записи байтов использовать SYSTEM.PUT8,
для WCHAR -- SYSTEM.PUT16
 
PROCEDURE PUT8(a: INTEGER;
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
Память[a] := младшие 8 бит (x)
 
PROCEDURE PUT16(a: INTEGER;
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
Память[a] := младшие 16 бит (x)
 
PROCEDURE PUT32(a: INTEGER;
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
Память[a] := младшие 32 бит (x)
 
PROCEDURE COPY(VAR Source: любой тип; VAR Dest: любой тип; n: INTEGER)
Копирует n байт памяти из Source в Dest.
Эквивалентно
SYSTEM.MOVE(SYSTEM.ADR(Source), SYSTEM.ADR(Dest), n)
 
PROCEDURE CODE(byte1, byte2,... : BYTE)
Вставка машинного кода,
byte1, byte2 ... - константы в диапазоне 0..255,
например:
 
SYSTEM.CODE(048H,08BH,045H,010H) (* mov rax,qword[rbp+16] *)
 
Также, в модуле SYSTEM определен тип CARD32 (4 байта). Для типа CARD32 не
допускаются никакие явные операции, за исключением присваивания.
 
Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях.
 
------------------------------------------------------------------------------
Системные флаги
 
При объявлении процедурных типов и глобальных процедур, после ключевого
слова PROCEDURE может быть указан флаг соглашения о вызове:
[win64], [systemv], [windows], [linux], [oberon].
Например:
 
PROCEDURE [win64] MyProc (x, y, z: INTEGER): INTEGER;
 
Флаг [windows] - синоним для [win64], [linux] - синоним для [systemv].
Знак "-" после имени флага ([win64-], [linux-], ...) означает, что
результат процедуры можно игнорировать (не допускается для типа REAL).
Если флаг не указан или указан флаг [oberon], то принимается внутреннее
соглашение о вызове. [win64] и [systemv] используются для связи с
операционной системой и внешними приложениями.
 
При объявлении типов-записей, после ключевого слова 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
необязательна. Если значение x не соответствует ни одному варианту и ELSE
отсутствует, то программа прерывается с ошибкой времени выполнения.
 
------------------------------------------------------------------------------
Тип WCHAR
 
Тип WCHAR добавлен в язык для удобной поддежки юникода. Для типов WCHAR и
ARRAY OF WCHAR допускаются все те же операции, как для типов CHAR и
ARRAY OF CHAR, за исключением встроенной процедуры CHR, которая возвращает
только тип CHAR. Для получения значения типа WCHAR, следует использовать
процедуру WCHR вместо CHR. Для правильной работы с типом, необходимо сохранять
исходный код в кодировке UTF-8 c BOM.
 
------------------------------------------------------------------------------
Конкатенация строковых и символьных констант
 
Допускается конкатенация ("+") константных строк и символов типа CHAR:
 
str = CHR(39) + "string" + CHR(39); (* str = "'string'" *)
 
newline = 0DX + 0AX;
 
------------------------------------------------------------------------------
Проверка и охрана типа нулевого указателя
 
Оригинальное сообщение о языке не определяет поведение программы при
выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих
Oberon-реализациях выполнение такой операции приводит к ошибке времени
выполнения. В данной реализации охрана типа нулевого указателя не приводит к
ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет
значительно сократить частоту применения охраны типа.
 
------------------------------------------------------------------------------
Дополнительные стандартные процедуры
 
DISPOSE (VAR v: любой_указатель)
Освобождает память, выделенную процедурой NEW для
динамической переменной v^, и присваивает переменной v
значение NIL.
 
COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR);
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/WCHAR): INTEGER
Длина 0X-завершенной строки s, без учета символа 0X.
Если символ 0X отсутствует, функция возвращает длину
массива s. s не может быть константой.
 
WCHR (n: INTEGER): WCHAR
Преобразование типа, аналогично CHR(n: INTEGER): CHAR
 
------------------------------------------------------------------------------
Импортированные процедуры
 
Синтаксис импорта:
 
PROCEDURE [callconv, library, function] proc_name (FormalParam): Type;
 
- callconv -- соглашение о вызове
- library -- имя файла динамической библиотеки (строковая константа)
- function -- имя импортируемой процедуры (строковая константа), если
указана пустая строка, то имя процедуры = proc_name
 
например:
 
PROCEDURE [windows, "kernel32.dll", "ExitProcess"] exit (code: INTEGER);
 
PROCEDURE [windows, "kernel32.dll", ""] GetTickCount (): INTEGER;
 
В конце объявления может быть добавлено (необязательно) "END proc_name;"
 
Объявления импортированных процедур должны располагаться в глобальной
области видимости модуля после объявления переменных, вместе с объявлением
"обычных" процедур, от которых импортированные отличаются только отсутствием
тела процедуры. В остальном, к таким процедурам применимы те же правила:
их можно вызвать, присвоить процедурной переменной или получить адрес.
 
Так как импортированная процедура всегда имеет явное указание соглашения о
вызове, то совместимый процедурный тип тоже должен быть объявлен с указанием
соглашения о вызове:
 
VAR
ExitProcess: PROCEDURE [windows] (code: INTEGER);
 
Для Linux, импортированные процедуры не реализованы.
 
------------------------------------------------------------------------------
Скрытые параметры процедур
 
Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке
формальных параметров, но учитываются компилятором при трансляции вызовов.
Это возможно в следующих случаях:
 
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. Компилятор транслирует
некоторые операции (проверка и охрана типа, сравнение строк, сообщения об
ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не
следует вызывать эти процедуры явно.
Сообщения об ошибках времени выполнения выводятся в диалоговых окнах
(Windows), в терминал (Linux).
 
------------------------------------------------------------------------------
Модуль API
 
Существуют несколько реализаций модуля API (для различных ОС).
Как и модуль RTL, модуль API не предназначен для прямого использования.
Он обеспечивает связь RTL с ОС.
 
------------------------------------------------------------------------------
Генерация исполняемых файлов DLL
 
Разрешается экспортировать только процедуры. Для этого, процедура должна
находиться в главном модуле программы, ее имя должно быть отмечено символом
экспорта ("*") и должно быть указано соглашение о вызове. Нельзя
экспортировать процедуры, которые импортированы из других dll-библиотек.