Compare commits
28 Commits
rewrite_id
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 864210679c | |||
| 7f8e028ffd | |||
| e9b6cf3fc9 | |||
| 4658a928d4 | |||
| b6a5171cd9 | |||
|
|
668fd4deeb | ||
| dd9a7b92d8 | |||
|
|
1173ca7b26 | ||
| ccd0c183ec | |||
| f065cc6e69 | |||
| f1b99bad84 | |||
|
|
c580d4ac5b | ||
|
|
17c33521c3 | ||
|
|
f6395c9501 | ||
|
|
000288ce8b | ||
| 10d9e9f36f | |||
| f4c4a7e29a | |||
|
|
bc5b2f884a | ||
|
|
d0de275ab3 | ||
|
|
a83f6f7e4b | ||
|
|
d54c802297 | ||
|
|
29c42738b8 | ||
| c17d1a57a3 | |||
| 7b0867a6cf | |||
| c65da0d96f | |||
| a0c01e204e | |||
| d50642ce1f | |||
| 8d235ce49b |
@@ -29,6 +29,7 @@ jobs:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Get describe
|
||||
|
||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
[submodule "programs/develop/oberon07"]
|
||||
path = programs/develop/oberon07
|
||||
url = https://github.com/AntKrotov/oberon-07-compiler.git
|
||||
@@ -31,8 +31,8 @@ import lib_libini, \
|
||||
LIBINI_enum_keys , 'ini_enum_keys' , \
|
||||
LIBINI_get_str , 'ini_get_str' , \
|
||||
LIBINI_get_int , 'ini_get_int' , \
|
||||
LIBINI_get_color , 'int_get_color' , \
|
||||
LIBINI_get_shortcut , 'int_get_shortcut' , \
|
||||
LIBINI_get_color , 'ini_get_color' , \
|
||||
LIBINI_get_shortcut , 'ini_get_shortcut' , \
|
||||
LIBINI_set_str , 'ini_set_str' , \
|
||||
LIBINI_set_int , 'ini_set_int' , \
|
||||
LIBINI_set_color , 'ini_set_color'
|
||||
|
||||
@@ -864,7 +864,7 @@ void ff_set_mpeg4_time(MpegEncContext * s){
|
||||
}
|
||||
|
||||
static void mpeg4_encode_gop_header(MpegEncContext * s){
|
||||
int hours, minutes, seconds;
|
||||
int64_t hours, minutes, seconds;
|
||||
int64_t time;
|
||||
|
||||
put_bits(&s->pb, 16, 0);
|
||||
|
||||
@@ -2035,8 +2035,13 @@ static int vp3_decode_frame(AVCodecContext *avctx,
|
||||
if (ff_thread_get_buffer(avctx, &s->current_frame, AV_GET_BUFFER_FLAG_REF) < 0)
|
||||
goto error;
|
||||
|
||||
if (!s->edge_emu_buffer)
|
||||
if (!s->edge_emu_buffer) {
|
||||
s->edge_emu_buffer = av_malloc(9*FFABS(s->current_frame.f->linesize[0]));
|
||||
if (!s->edge_emu_buffer) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
if (s->keyframe) {
|
||||
if (!s->theora)
|
||||
|
||||
@@ -2580,8 +2580,10 @@ static int http_receive_data(HTTPContext *c)
|
||||
} else if (c->buffer_ptr - c->buffer >= 2 &&
|
||||
!memcmp(c->buffer_ptr - 1, "\r\n", 2)) {
|
||||
c->chunk_size = strtol(c->buffer, 0, 16);
|
||||
if (c->chunk_size == 0) // end of stream
|
||||
if (c->chunk_size <= 0) { // end of stream or invalid chunk size
|
||||
c->chunk_size = 0;
|
||||
goto fail;
|
||||
}
|
||||
c->buffer_ptr = c->buffer;
|
||||
break;
|
||||
} else if (++loop_run > 10)
|
||||
@@ -2603,6 +2605,7 @@ static int http_receive_data(HTTPContext *c)
|
||||
/* end of connection : close it */
|
||||
goto fail;
|
||||
else {
|
||||
av_assert0(len <= c->chunk_size);
|
||||
c->chunk_size -= len;
|
||||
c->buffer_ptr += len;
|
||||
c->data_count += len;
|
||||
|
||||
@@ -267,8 +267,12 @@ static int cine_read_header(AVFormatContext *avctx)
|
||||
|
||||
/* parse image offsets */
|
||||
avio_seek(pb, offImageOffsets, SEEK_SET);
|
||||
for (i = 0; i < st->duration; i++)
|
||||
for (i = 0; i < st->duration; i++) {
|
||||
if (avio_feof(pb))
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
av_add_index_entry(st, avio_rl64(pb), i, 0, 0, AVINDEX_KEYFRAME);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ diamond'ом. Она используется в проектах xonix и fara
|
||||
Kolibri-программу. Утилита всего лишь изменяет формат exe-шника, так что,
|
||||
чтобы действительно получилась работающая программа, нужно выполнение
|
||||
определённых условий. Понятно, что требуется, чтобы программа общалась
|
||||
с внешним миром средствами Колибри (т.е. int 0x40) и не использовала
|
||||
с внешним миром средствами КолибриОС (т.е. int 0x40) и не использовала
|
||||
никаких Windows-библиотек. Помимо этого, требуется также, чтобы программа
|
||||
размещалась по нулевому адресу (ключ линкера "/base:0"). Как писать такие
|
||||
программы - смотрите в уже упомянутых проектах xonix и fara.
|
||||
|
||||
@@ -38,7 +38,6 @@ img_files = {
|
||||
{"UNIMG", SRC_PROGS .. "/fs/unimg/unimg"},
|
||||
{"3D/HOUSE.3DS", "common/3d/house.3ds"},
|
||||
{"File Managers/ICONS.INI", "common/File Managers/icons.ini"},
|
||||
{"GAMES/FLPYBIRD", SRC_PROGS .. "/games/floppybird/Release/floppybird"},
|
||||
{"FONTS/TAHOMA.KF", "common/fonts/tahoma.kf"},
|
||||
-- {"LIB/ICONV.OBJ", "common/lib/iconv.obj"},
|
||||
{"LIB/KMENU.OBJ", "common/lib/kmenu.obj"},
|
||||
@@ -153,9 +152,6 @@ extra_files = {
|
||||
{"HD_Load/USB_boot_old/", SRC_PROGS .. "/hd_load/usb_boot_old/usb_boot_866.txt"},
|
||||
{"HD_Load/USB_boot_old/", SRC_PROGS .. "/hd_load/usb_boot_old/usb_boot_1251.txt"},
|
||||
{"kolibrios/3D/info3ds/INFO3DS.INI", SRC_PROGS .. "/develop/info3ds/info3ds.ini"},
|
||||
{"kolibrios/3D/info3ds/OBJECTS.PNG", SRC_PROGS .. "/develop/info3ds/objects.png"},
|
||||
{"kolibrios/3D/info3ds/TOOLBAR.PNG", SRC_PROGS .. "/develop/info3ds/toolbar.png"},
|
||||
{"kolibrios/3D/info3ds/FONT8X9.BMP", SRC_PROGS .. "/fs/kfar/trunk/font8x9.bmp"},
|
||||
{"kolibrios/3D/blocks/blocks.kex", "../programs/bcc32/games/blocks/bin/blocks.kex"},
|
||||
{"kolibrios/3D/blocks/models/", "../programs/bcc32/games/blocks/models/*"},
|
||||
{"kolibrios/3D/md2view/", "common/3d/md2view/*"},
|
||||
@@ -180,10 +176,15 @@ extra_files = {
|
||||
{"kolibrios/develop/c--/manual_c--.htm", SRC_PROGS .. "/cmm/c--/manual_c--.htm"},
|
||||
{"kolibrios/develop/fpc/", "common/develop/fpc/*"},
|
||||
{"kolibrios/develop/fpc/examples/", "../programs/develop/fp/examples/src/*"},
|
||||
{"kolibrios/develop/oberon07/", "../programs/develop/oberon07/*"},
|
||||
{"kolibrios/develop/oberon07/doc/", "../programs/develop/oberon07/doc/*"},
|
||||
{"kolibrios/develop/oberon07/lib/KolibriOS/", "../programs/develop/oberon07/lib/KolibriOS/*"},
|
||||
{"kolibrios/develop/oberon07/samples/", SRC_PROGS .. "/develop/oberon07/samples/*"},
|
||||
{"kolibrios/develop/oberon07/compiler.kex", SRC_PROGS .. "/develop/oberon07/Compiler.kex"},
|
||||
{"kolibrios/develop/oberon07/LICENSE", SRC_PROGS .. "/develop/oberon07/LICENSE"},
|
||||
{"kolibrios/develop/oberon07/doc/CC.txt", SRC_PROGS .. "/develop/oberon07/doc/CC.txt"},
|
||||
{"kolibrios/develop/oberon07/doc/KOSLib.txt", SRC_PROGS .. "/develop/oberon07/doc/KOSLib.txt"},
|
||||
{"kolibrios/develop/oberon07/doc/x86.txt", SRC_PROGS .. "/develop/oberon07/doc/x86.txt"},
|
||||
{"kolibrios/develop/oberon07/doc/Oberon07.Report_2016_05_03.pdf", SRC_PROGS .. "/develop/oberon07/doc/Oberon07.Report_2016_05_03.pdf"},
|
||||
{"kolibrios/develop/oberon07/lib/KolibriOS/", SRC_PROGS .. "/develop/oberon07/lib/KolibriOS/*"},
|
||||
{"kolibrios/develop/oberon07/lib/Math/", SRC_PROGS .. "/develop/oberon07/lib/Math/*"},
|
||||
{"kolibrios/develop/oberon07/samples/", SRC_PROGS .. "/develop/oberon07/samples/KolibriOS/*"},
|
||||
{"kolibrios/develop/tcc/lib/", SRC_PROGS .. "/develop/ktcc/trunk/bin/lib/*"},
|
||||
{"kolibrios/develop/tcc/include/", SRC_PROGS .. "/develop/ktcc/trunk/libc.obj/include/*"},
|
||||
{"kolibrios/develop/tcc/include/clayer/", SRC_PROGS .. "/develop/ktcc/trunk/libc.obj/include/clayer/*"},
|
||||
@@ -205,6 +206,7 @@ extra_files = {
|
||||
{"kolibrios/emul/chip8/roms/", SRC_PROGS .. "/emulator/chip8/roms/*"},
|
||||
{"kolibrios/emul/kwine/kwine", SRC_PROGS .. "/emulator/kwine/bin/kwine"},
|
||||
{"kolibrios/emul/kwine/lib/", SRC_PROGS .. "/emulator/kwine/bin/lib/*"},
|
||||
{"kolibrios/emul/uxn", SRC_PROGS .. "/emulator/uxn/uxn"},
|
||||
{"kolibrios/emul/uarm/", "common/emul/uarm/*"},
|
||||
{"kolibrios/emul/zsnes/", "common/emul/zsnes/*"},
|
||||
{"kolibrios/games/BabyPainter", "common/games/BabyPainter"},
|
||||
@@ -470,7 +472,6 @@ tup.append_table(img_files, {
|
||||
{"DEMOS/ZEROLINE", VAR_PROGS .. "/demos/zeroline/trunk/zeroline"},
|
||||
{"DEVELOP/BOARD", VAR_PROGS .. "/system/board/trunk/board"},
|
||||
{"DEVELOP/DBGBOARD", VAR_PROGS .. "/system/dbgboard/dbgboard"},
|
||||
{"DEVELOP/CEDIT", SRC_PROGS .. "/develop/cedit/CEDIT"},
|
||||
{"DEVELOP/CHARSETS", VAR_PROGS .. "/develop/charsets/charsets"},
|
||||
{"DEVELOP/COBJ", VAR_PROGS .. "/develop/cObj/trunk/cObj"},
|
||||
{"DEVELOP/ENTROPYV", VAR_PROGS .. "/develop/entropyview/entropyview"},
|
||||
@@ -724,6 +725,8 @@ tup.append_table(img_files, {
|
||||
{"NETWORK/WHOIS", VAR_PROGS .. "/network/whois/whois"},
|
||||
{"SHELL", VAR_PROGS .. "/system/shell/shell"},
|
||||
{"GAMES/DINO", VAR_PROGS .. "/games/dino/dino"},
|
||||
{"GAMES/FLPYBIRD", VAR_PROGS .. "/games/flpybird/flpybird"},
|
||||
{"LIB/LIBC.OBJ", VAR_PROGS .. "/develop/ktcc/trunk/libc.obj/source/libc.obj"},
|
||||
})
|
||||
tup.append_table(extra_files, {
|
||||
{"kolibrios/utils/thashview", VAR_PROGS .. "/other/TinyHashView/thashview"},
|
||||
@@ -742,12 +745,18 @@ tup.append_table(extra_files, {
|
||||
})
|
||||
end -- tup.getconfig('NO_TCC') ~= 'full'
|
||||
|
||||
-- Programs that require oberon07 compiler.
|
||||
if tup.getconfig('NO_OB07') ~= 'full' then
|
||||
tup.append_table(img_files, {
|
||||
{"DEVELOP/CEDIT", VAR_PROGS .. "/develop/cedit/cedit"},
|
||||
})
|
||||
end -- tup.getconfig('NO_OB07') ~= 'full'
|
||||
|
||||
-- Programs that require GCC to compile.
|
||||
if tup.getconfig('NO_GCC') ~= 'full' then
|
||||
tup.append_table(img_files, {
|
||||
{"GAMES/REVERSI", VAR_PROGS .. "/games/reversi/reversi"},
|
||||
{"LIB/BASE64.OBJ", VAR_PROGS .. "/develop/libraries/base64/base64.obj"},
|
||||
{"LIB/LIBC.OBJ", VAR_PROGS .. "/develop/ktcc/trunk/libc.obj/source/libc.obj"},
|
||||
{"LIB/ICONV.OBJ", VAR_PROGS .. "/develop/libraries/iconv/iconv.obj"},
|
||||
-- {"LIB/MTAR.OBJ", VAR_PROGS .. "/develop/libraries/microtar/mtar.obj"},
|
||||
})
|
||||
|
||||
@@ -162,6 +162,7 @@ min=23
|
||||
nes=23
|
||||
sna=23
|
||||
snes=23
|
||||
rom=23
|
||||
bat=24
|
||||
sh=24
|
||||
sys=25
|
||||
|
||||
@@ -68,6 +68,7 @@ sna=/kolibrios/emul/e80/e80
|
||||
gb=/kolibrios/emul/gameboy
|
||||
gbc=/kolibrios/emul/gameboy
|
||||
min=/kolibrios/emul/pokemini
|
||||
rom=/kolibrios/emul/uxn
|
||||
nc=/kolibrios/utils/cnc_editor/cnc_editor
|
||||
kf=/sys/KF_VIEW
|
||||
csv=/sys/table
|
||||
|
||||
@@ -22,3 +22,5 @@ ToggleBar=Tab
|
||||
path=/usbhd0/1/kolibri.img
|
||||
autoclose=0
|
||||
|
||||
[WebView]
|
||||
proxy=http://proxy.kolibrios.org:82/?site=
|
||||
@@ -192,6 +192,7 @@ nc=/kolibrios/utils/cnc_editor/cnc_editor
|
||||
ch8=/kolibrios/emul/chip8/chip8
|
||||
md=/kolibrios/emul/dgen/dgen
|
||||
gen=/kolibrios/emul/dgen/dgen
|
||||
rom=/kolibrios/emul/uxn
|
||||
|
||||
zip=$Unz
|
||||
7z=$Unz
|
||||
|
||||
@@ -9,15 +9,15 @@
|
||||
pre {white-space: pre-wrap;}
|
||||
h2 {margin-bottom:0;}
|
||||
blockquote {
|
||||
margin-bottom:0;
|
||||
border-left: 5px solid #EFE8D5;
|
||||
margin-bottom:0;
|
||||
border-left: 5px solid #EFE8D5;
|
||||
padding-left: 10px;}
|
||||
</style>
|
||||
</head>
|
||||
<body bgcolor="#FDF6E3" link="#5551FF"><pre><h1>Решение проблем и часто задаваемые вопросы</h1>
|
||||
<a href="guide.htm" param="d">< Назад</a>
|
||||
|
||||
<b>Какие есть варианты загрузки Колибри?</b>
|
||||
<b>Какие есть варианты загрузки КолибриОС?</b>
|
||||
С флешки, жесткого диска, CD, дискеты. Смотрите папку /HD_Load в скачанном дистрибутиве.
|
||||
При загрузке с флешки иногда может требоваться использование setmbr.exe, иногда нет. Вначале попробуйте загрузится без него, если не получится, то с ним.
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
2. Поменять настройки в BIOS: зайти в раздел с жесткими дисками и выставить режим совместимости с IDE или что-то похожее. (После всех эксперименов не забудьте поменять все обратно!)
|
||||
3. Воспользоваться драйвером ACHI. Для этого зайдите в SYSPANEL > <a href="/kolibrios/drivers/DRVINST.KEX">DriverInstall</a>.
|
||||
|
||||
<b>Как установить Колибри как основную ОС, скажем, на старенький ноутбук?</b>
|
||||
<b>Как установить КолибриОС как основную ОС, скажем, на старенький ноутбук?</b>
|
||||
Есть масса вариантов. Вот один из них.
|
||||
Если на ноутбуке нет ОС, то ставим на него Windows 98. Если на нем уже стоит Windows 95/98/2k/XP, то они тоже подойдут.
|
||||
Заходим в папку /HD_Load поставляемую в дистрибутиве. Там с помощью утилит устанавливаем Kolibri в дуалбут с Windows.
|
||||
@@ -49,7 +49,7 @@
|
||||
|
||||
MTRRs (Memory type range registers — Диапазонные регистры типа памяти) — используются для назначения типа (политики кеширования) участкам памяти. Регистры MTRR предоставляют механизм, связывающий типы памяти с физическими адресными диапазонами системной памяти. Они позволяют процессору оптимизировать операции для разных типов памяти, таких как ПЗУ, ОЗУ, кадровый буфер и отображаемые в памяти устройства ввода-вывода. Они также упрощают разработку системного оборудования, уменьшая количество контактов управляющих памятью, которые использовались для этой цели в ранних процессорах и внешних логических устройствах.
|
||||
|
||||
<b>На каких ещё языках программирования, кроме ассемблера, можно разрабатывать приложения для Колибри?</b>
|
||||
<b>На каких ещё языках программирования, кроме ассемблера, можно разрабатывать приложения для КолибриОС?</b>
|
||||
|
||||
Портированы:
|
||||
• Компилятор Oberon-07
|
||||
@@ -68,7 +68,7 @@ MTRRs (Memory type range registers — Диапазонные регистры
|
||||
Подробная статья по поддерживаемым компиляторам и их настройке <a href="http://kolibri-n.org/inf/hll/hll">здесь</a>.
|
||||
|
||||
<b>Wi-Fi работает?</b>
|
||||
Нет ни драйверов ни подсистемы.
|
||||
Нет ни драйверов ни подсистемы.
|
||||
Если вы хотите разработать подсистему и драйвер(а) WiFi - напишите нам на форум или в группу ВК, есть возможность оплатить разработку. Для этого нужно весьма неплохо знать ассемблер.
|
||||
|
||||
<b>Не работает мышь, флешка, клавиатура</b>
|
||||
@@ -79,28 +79,28 @@ MTRRs (Memory type range registers — Диапазонные регистры
|
||||
• Использовать PS/2 мышь...
|
||||
• Купить PCI карту на несколько USB 2.0 портов, благо стоит она копейки, часто продается на барахолках
|
||||
|
||||
<b>Можно ли в Колибри запускать EXE (приложения Windows)?</b>
|
||||
<b>Можно ли в КолибриОС запускать EXE (приложения Windows)?</b>
|
||||
Нет, это невозможно.
|
||||
Есть эмулятор DOS и <a href="http://board.kolibrios.org/viewtopic.php?f=9&t=2318&p=48991">PELoad</a> эмулятор некоторых функций WIN32 (в зачаточном состоянии).
|
||||
|
||||
<b>Когда будет нормальный браузер?</b>
|
||||
Браузер штука очень сложная, как в написании, так и в портировании. Есть наработки по портированию Netsurf, но пока все заглохло.
|
||||
Что и когда будет не известно.
|
||||
Что и когда будет не известно.
|
||||
|
||||
<b>У меня есть идея, давайте я вам ее напишу, а вы реализуете!</b>
|
||||
Чаще всего эти идеи мало полезны. Дело в том, что у каждого человека уже вовлеченного в проект, тоже есть множество нереализованных идей, подчас более ценных, чем у новичков, за счет того, что участники лучше разбираются в системе, ее возможностях и ограничениях. Проблема, как всегда, или в мотивации, или в отсутствии времени. Пожалуйста, учитывайте это приходя в проект и не требуйте ничего от незнакомых вам людей. Участвуйте, как наблюдатель и комментатор; и со временем вы сможете генерировать хорошие идеи предметно.
|
||||
К сожалению даже клевая идея не гарантирует ее скорейшей реализации, потому самый надежный шанс воплотить идею в жизнь - реализовать самому.
|
||||
Чаще всего эти идеи мало полезны. Дело в том, что у каждого человека уже вовлеченного в проект, тоже есть множество нереализованных идей, подчас более ценных, чем у новичков, за счет того, что участники лучше разбираются в системе, ее возможностях и ограничениях. Проблема, как всегда, или в мотивации, или в отсутствии времени. Пожалуйста, учитывайте это приходя в проект и не требуйте ничего от незнакомых вам людей. Участвуйте, как наблюдатель и комментатор; и со временем вы сможете генерировать хорошие идеи предметно.
|
||||
К сожалению даже клевая идея не гарантирует ее скорейшей реализации, потому самый надежный шанс воплотить идею в жизнь - реализовать самому.
|
||||
|
||||
<b>Почему в Колибри все еще нет ХХХ? Это же так важно!</b>
|
||||
Потому что это ХХХ еще никто не сделал.
|
||||
<b>Почему в КолибриОС все еще нет ХХХ? Это же так важно!</b>
|
||||
Потому что это ХХХ еще никто не сделал.
|
||||
См. предыдущий ответ.
|
||||
|
||||
<b>Какие у вас дальнейшие планы развития?</b>
|
||||
Большинство путей развития упирается не в планы, а в свободные руки. Особенно в квалифицированные рабочие руки.
|
||||
|
||||
<b>Как насчет версии для ARM вместо Android?</b>
|
||||
Нативно это невозможно. Абсолютно и полностью.
|
||||
Дело в том, что Колибри ОС написана на ассемблере x86, тем самым овермаксимально оптимизирована под процессоры x86. На мобильных девайсах используется другой тип процессора и другая архитектура - arm, что делает портирование невозможным.
|
||||
Нативно это невозможно. Абсолютно и полностью.
|
||||
Дело в том, что КолибриОС написана на ассемблере x86, тем самым овермаксимально оптимизирована под процессоры x86. На мобильных девайсах используется другой тип процессора и другая архитектура - arm, что делает портирование невозможным.
|
||||
Колибри - десктопная ОС для Пека, любите ее такой, какая она есть.
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
Загрузочный сектор для ОС Колибри (FAT12, дискета)
|
||||
Загрузочный сектор для КолибриОС (FAT12, дискета)
|
||||
|
||||
- Описание
|
||||
Позволяет загружать KERNEL.MNT с дискет/образов
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
Загрузочный сектор для ОС Колибри (FAT12, дискета)
|
||||
Загрузочный сектор для КолибриОС (FAT12, дискета)
|
||||
|
||||
- Описание
|
||||
Позволяет загружать KERNEL.MNT с дискет/образов
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
Загрузочный сектор для ОС Колибри (FAT12, дискета)
|
||||
Загрузочный сектор для КолибриОС (FAT12, дискета)
|
||||
|
||||
- Описание
|
||||
Позволяет загружать KERNEL.MNT с дискет/образов
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
Загрузочный сектор для ОС Колибри (FAT12, дискета)
|
||||
Загрузочный сектор для КолибриОС (FAT12, дискета)
|
||||
|
||||
- Описание
|
||||
Позволяет загружать KERNEL.MNT с дискет/образов
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
//Copyright 2007-2025 by Veliant & Leency
|
||||
//Asper, lev, Lrz, Barsuk, Nable, hidnplayr...
|
||||
//Asper, lev, Lrz, Barsuk, Nable, hidnplayr, Burer...
|
||||
|
||||
//BUGS
|
||||
//if maximize a window on image load => crash
|
||||
//issues with a long line
|
||||
//add proxy settings
|
||||
|
||||
//===================================================//
|
||||
// //
|
||||
@@ -13,6 +12,7 @@
|
||||
//===================================================//
|
||||
|
||||
#define MEMSIZE 1024 * 160
|
||||
|
||||
#include "..\lib\gui.h"
|
||||
#include "..\lib\draw_buf.h"
|
||||
#include "..\lib\list_box.h"
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "..\lib\random.h"
|
||||
#include "..\lib\clipboard.h"
|
||||
|
||||
#include "..\lib\obj\libini.h"
|
||||
#include "..\lib\obj\box_lib.h"
|
||||
#include "..\lib\obj\libimg.h"
|
||||
#include "..\lib\obj\http.h"
|
||||
@@ -67,6 +68,10 @@ _http http = 0;
|
||||
progress_bar prbar;
|
||||
proc_info Form;
|
||||
|
||||
char settings_file[256];
|
||||
char proxy_address[768];
|
||||
|
||||
#include "settings.h"
|
||||
#include "tabs.h"
|
||||
|
||||
dword cur_img_url;
|
||||
@@ -90,6 +95,7 @@ edit_box omnibox_edit = {250, 0, 0, 0xffffff,
|
||||
|
||||
void LoadLibraries()
|
||||
{
|
||||
load_dll(libini, #lib_init,1);
|
||||
load_dll(boxlib, #box_lib_init,0);
|
||||
load_dll(libimg, #libimg_init,1);
|
||||
load_dll(libHTTP, #http_lib_init,1);
|
||||
@@ -130,6 +136,7 @@ void main()
|
||||
TOOLBAR_H = PADDING+TSZE+PADDING+2;
|
||||
|
||||
LoadLibraries();
|
||||
LoadIniConfig();
|
||||
HandleParam();
|
||||
|
||||
omnibox_edit.left = PADDING+TSZE*2+PADDING+6;
|
||||
@@ -517,14 +524,17 @@ bool GetLocalFileData(dword _path)
|
||||
bool GetUrl(dword _http_url)
|
||||
{
|
||||
char new_url_full[URL_SIZE+1];
|
||||
if (!strncmp(_http_url,"http:",5)) {
|
||||
if (!strncmp(_http_url,"http://",7)) {
|
||||
http.get(_http_url);
|
||||
return true;
|
||||
} else if (!strncmp(_http_url,"https://",8)) {
|
||||
strcpy(#new_url_full, "http://gate.aspero.pro/?site=");
|
||||
strncat(#new_url_full, _http_url, URL_SIZE);
|
||||
http.get(#new_url_full);
|
||||
return true;
|
||||
if (#proxy_address) {
|
||||
strcpy(#new_url_full, #proxy_address);
|
||||
strncat(#new_url_full, _http_url, URL_SIZE);
|
||||
http.get(#new_url_full);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ Copy link
|
||||
Download link contents";
|
||||
char loading_text[] = "Loading...";
|
||||
char update_param[] = "-e http://builds.kolibrios.org/en_US/data/programs/cmm/browser/WebView.com";
|
||||
char update_download_error[] = "'WebView\nError receiving an up to date information!' -tE";
|
||||
char update_download_error[] = "'WebView\nError receiving update information!' -tE";
|
||||
char update_ok[] = "'WebView\nThe browser has been updated!' -tO";
|
||||
char update_is_current[] = "'WebView\nThe browser is up to date.' -tI";
|
||||
char update_can_not_copy[] = "'WebView\nError copying a new version from Downloads folder!\nProbably too litle space on Ramdisk.' -tE";
|
||||
@@ -112,4 +112,4 @@ char editbox_icons[] = FROM "res/editbox_icons.raw";
|
||||
|
||||
#define DEFAULT_URL URL_SERVICE_HOMEPAGE
|
||||
|
||||
char version[]="WebView 3.91";
|
||||
char version[]="WebView 3.92";
|
||||
@@ -14,7 +14,7 @@
|
||||
| || | | |
|
||||
\_____||__|________|__|<font color=#DDD>lc</font>
|
||||
|
||||
<font bg=#F8F15B> web <font bg=#FF5A7E color=#fff> 1.0 <font bg=#47D018> compatable
|
||||
<font bg=#F8F15B> web <font bg=#FF5A7E color=#fff> 1.0 <font bg=#47D018> compatible
|
||||
<font bg=#3CE7FF> </font></font></font></font>
|
||||
<td>
|
||||
|
||||
@@ -26,9 +26,9 @@
|
||||
|
||||
By the way,
|
||||
<font color="#555555">• You can check for browser updates from the main menu.
|
||||
• To run a web search, type a text in the adress box and press Ctrl+Enter.
|
||||
• Pressing F6 moves a text cursor to the omnibox.
|
||||
• You can manually change the encoding of a page by clicking on a label in the bottom right corner.
|
||||
• To run a web search, type text in the address box and press Ctrl+Enter.
|
||||
• Pressing F6 moves the text cursor to the omnibox.
|
||||
• You can manually change the encoding of a page by clicking on the label in the bottom right corner.
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
<h1> Webpage Not Available</h1>
|
||||
<h2> What could be done:</h2>
|
||||
<ul>
|
||||
<li>Make sure that evetything fine with Internet connection.<br>
|
||||
<li>Make sure that you have a working Internet connection.<br>
|
||||
Open <a href="/sys/network/netcfg">Netcfg</a> network diagnostic tool.<br>
|
||||
<li>Check page address, there may have been made a typo.<br>
|
||||
<li>Check the page address for any typos.<br>
|
||||
<li>Server is temporarily unavailable.<br>
|
||||
Refresh the page.<br>
|
||||
<li>Browser doesn't handled properly server's response.<br>
|
||||
<li>Browser didn't properly handle the server's response.<br>
|
||||
Please, report an error.<br>
|
||||
</ul>
|
||||
|
||||
9
programs/cmm/browser/settings.h
Normal file
9
programs/cmm/browser/settings.h
Normal file
@@ -0,0 +1,9 @@
|
||||
_ini ini;
|
||||
|
||||
void LoadIniConfig()
|
||||
{
|
||||
ini.path = GetIni(#settings_file, "app.ini");
|
||||
ini.section = "WebView";
|
||||
|
||||
ini.GetString("proxy", #proxy_address, sizeof(proxy_address), NULL);
|
||||
}
|
||||
@@ -1,7 +1,12 @@
|
||||
//Copyright 2020 - 2025 by Leency
|
||||
//Burer...
|
||||
|
||||
#define MEMSIZE 1024 * 40
|
||||
//Copyright 2020 - 2021 by Leency
|
||||
|
||||
#include "../lib/gui.h"
|
||||
#include "../lib/random.h"
|
||||
|
||||
#include "../lib/obj/libini.h"
|
||||
#include "../lib/obj/box_lib.h"
|
||||
#include "../lib/obj/http.h"
|
||||
|
||||
@@ -21,6 +26,11 @@ char uEdit[URL_SIZE];
|
||||
char filepath[4096];
|
||||
char save_dir[4096];
|
||||
|
||||
char settings_file[256];
|
||||
char proxy_address[768];
|
||||
|
||||
#include "settings.h"
|
||||
|
||||
char* active_status;
|
||||
|
||||
edit_box ed = {WIN_W-GAPX-GAPX,GAPX,20,0xffffff,0x94AECE,0xffffff,0xffffff,
|
||||
@@ -32,9 +42,13 @@ progress_bar pb = {0, GAPX, 52, WIN_W - GAPX - GAPX, 17, 0, NULL, NULL,
|
||||
void main()
|
||||
{
|
||||
dword shared_url;
|
||||
|
||||
load_dll(libini, #lib_init,1);
|
||||
load_dll(boxlib, #box_lib_init,0);
|
||||
load_dll(libHTTP, #http_lib_init,1);
|
||||
|
||||
LoadIniConfig();
|
||||
|
||||
strcpy(#save_dir, DEFAULT_SAVE_DIR);
|
||||
if (!dir_exists(#save_dir)) CreateDir(#save_dir);
|
||||
SetCurDir(#save_dir);
|
||||
@@ -167,10 +181,8 @@ void StartDownloading()
|
||||
if (http.transfer > 0) return;
|
||||
ResetDownloadSpeed();
|
||||
pb.back_color = 0xFFFfff;
|
||||
if (!strncmp(#uEdit,"https:",6)) {
|
||||
//miniprintf(#get_url, "http://gate.aspero.pro/?site=%s", #uEdit);
|
||||
notify("'HTTPS for download temporary is not supported,\ntrying to download the file via HTTP' -W");
|
||||
miniprintf(#uEdit, "http://%s", #uEdit+8);
|
||||
if (!strncmp(#uEdit,"https://",8)) {
|
||||
miniprintf(#get_url, "%s%s", #proxy_address, #uEdit);
|
||||
}
|
||||
strcpy(#get_url, #uEdit);
|
||||
|
||||
|
||||
9
programs/cmm/downloader/settings.h
Normal file
9
programs/cmm/downloader/settings.h
Normal file
@@ -0,0 +1,9 @@
|
||||
_ini ini;
|
||||
|
||||
void LoadIniConfig()
|
||||
{
|
||||
ini.path = GetIni(#settings_file, "app.ini");
|
||||
ini.section = "WebView";
|
||||
|
||||
ini.GetString("proxy", #proxy_address, sizeof(proxy_address), NULL);
|
||||
}
|
||||
@@ -112,7 +112,6 @@ struct _http
|
||||
dword _http::get(dword _url)
|
||||
{
|
||||
cur_url = _url;
|
||||
if (streqrp(cur_url, "http://gate.aspero.pro/?site=")) cur_url += 29;
|
||||
http_get stdcall (_url, 0, 0, #accept_language);
|
||||
transfer = EAX;
|
||||
return EAX;
|
||||
@@ -138,7 +137,7 @@ bool _http::stop()
|
||||
transfer=0;
|
||||
*/
|
||||
hfree();
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -47,3 +47,9 @@
|
||||
перемещение по тексту:
|
||||
(ctrl+)Home, (ctrl+)End, (ctrl+)PageUp, (ctrl+)PageDown
|
||||
ctrl+Left, ctrl+Right
|
||||
|
||||
перемещение в панели поиска:
|
||||
Tab к следующему полю ввода
|
||||
Shift-Tab к предыдущему полю ввода
|
||||
Enter поиск следующего вхождения
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ IMPORT
|
||||
RW, Ini, EB := EditBox, Tabs, Toolbar, SB := StatusBar;
|
||||
|
||||
CONST
|
||||
HEADER = "CEdit (30-apr-2025)";
|
||||
HEADER = "CEdit (11-jan-2026)";
|
||||
|
||||
ShellFilter = "";
|
||||
EditFilter = "sh|inc|txt|asm|ob07|c|cpp|h|pas|pp|lua|ini|json";
|
||||
@@ -1750,7 +1750,15 @@ BEGIN
|
||||
ELSE
|
||||
IF EditBox_Focus(FindEdit) THEN
|
||||
IF keyCode = 15 THEN (* Tab *)
|
||||
SetFocus(ReplaceEdit, TRUE)
|
||||
IF shift THEN
|
||||
SetFocus(GotoEdit, TRUE)
|
||||
ELSE
|
||||
SetFocus(ReplaceEdit, TRUE)
|
||||
END
|
||||
ELSIF keyCode = 28 THEN (* Enter *)
|
||||
IF searchOpened & (searchText # "") THEN
|
||||
notFound := ~T.findNext(text, BKW.value)
|
||||
END
|
||||
ELSE
|
||||
EB.key(FindEdit, key);
|
||||
EditBox_Get(FindEdit, new_searchText);
|
||||
@@ -1761,14 +1769,26 @@ BEGIN
|
||||
END
|
||||
ELSIF EditBox_Focus(ReplaceEdit) THEN
|
||||
IF keyCode = 15 THEN (* Tab *)
|
||||
SetFocus(GotoEdit, TRUE)
|
||||
IF shift THEN
|
||||
SetFocus(FindEdit, TRUE)
|
||||
ELSE
|
||||
SetFocus(GotoEdit, TRUE)
|
||||
END
|
||||
ELSIF keyCode = 28 THEN (* Enter *)
|
||||
IF searchOpened & (searchText # "") THEN
|
||||
notFound := ~T.findNext(text, BKW.value)
|
||||
END
|
||||
ELSE
|
||||
EB.key(ReplaceEdit, key);
|
||||
EditBox_Get(ReplaceEdit, replaceText)
|
||||
END
|
||||
ELSIF EditBox_Focus(GotoEdit) THEN
|
||||
IF keyCode = 15 THEN (* Tab *)
|
||||
SetFocus(FindEdit, TRUE)
|
||||
IF shift THEN
|
||||
SetFocus(ReplaceEdit, TRUE)
|
||||
ELSE
|
||||
SetFocus(FindEdit, TRUE)
|
||||
END
|
||||
ELSE
|
||||
IF (key DIV 256) MOD 256 = 13 THEN
|
||||
goto
|
||||
|
||||
9
programs/develop/cedit/Tupfile.lua
Normal file
9
programs/develop/cedit/Tupfile.lua
Normal file
@@ -0,0 +1,9 @@
|
||||
if tup.getconfig("NO_OB07") ~= "" then return end
|
||||
if tup.getconfig("HELPERDIR") == ""
|
||||
then
|
||||
HELPERDIR = "../../"
|
||||
end
|
||||
|
||||
tup.include(HELPERDIR .. "/use_ob07.lua")
|
||||
|
||||
build_ob07({"SRC/CEdit.ob07"}, "cedit");
|
||||
@@ -1,10 +1,7 @@
|
||||
if not exist bin mkdir bin
|
||||
@erase lang.inc
|
||||
@echo lang fix en_US >lang.inc
|
||||
@copy objects.png bin\objects.png
|
||||
if not exist bin\info3ds.ini @copy info3ds.ini bin\info3ds.ini
|
||||
if not exist bin\toolbar.png @copy toolbar.png bin\toolbar.png
|
||||
if not exist bin\font8x9.bmp @copy ..\..\fs\kfar\trunk\font8x9.bmp bin\font8x9.bmp
|
||||
@fasm.exe -m 16384 info3ds.asm bin\info3ds.kex
|
||||
@kpack bin\info3ds.kex
|
||||
@fasm.exe -m 16384 info3ds_u.asm bin\info3ds_u.kex
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
if not exist bin mkdir bin
|
||||
@erase lang.inc
|
||||
@echo lang fix ru_RU >lang.inc
|
||||
@copy objects.png bin\objects.png
|
||||
if not exist bin\info3ds.ini @copy info3ds.ini bin\info3ds.ini
|
||||
if not exist bin\toolbar.png @copy toolbar.png bin\toolbar.png
|
||||
if not exist bin\font8x9.bmp @copy ..\..\fs\kfar\trunk\font8x9.bmp bin\font8x9.bmp
|
||||
@fasm.exe -m 16384 info3ds.asm bin\info3ds.kex
|
||||
@kpack bin\info3ds.kex
|
||||
@fasm.exe -m 16384 info3ds_u.asm bin\info3ds_u.kex
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
; SPDX-License-Identifier: GPL-2.0-only
|
||||
; Info3ds - is a program for viewing the structure of *.3ds files
|
||||
; Copyright (C) 2011-2025 KolibriOS team
|
||||
|
||||
use32
|
||||
org 0
|
||||
db 'MENUET01' ;¨¤¥â¨ä. ¨á¯®«ï¥¬®£® ä ©« ¢á¥£¤ 8 ¡ ©â
|
||||
db 'MENUET01'
|
||||
dd 1, start, i_end, mem, stacktop, file_name, sys_path
|
||||
|
||||
version_edit equ 1
|
||||
@@ -22,36 +26,34 @@ include 'convert_stl_3ds.inc'
|
||||
|
||||
@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
|
||||
|
||||
ID_ICON_CHUNK_MAIN equ 0 ;¨ª®ª £« ¢®£® ¡«®ª
|
||||
ID_ICON_CHUNK_NOT_FOUND equ 1 ;¨ª®ª ¥ ¨§¢¥á⮣® ¡«®ª
|
||||
ID_ICON_DATA equ 2 ;¨ª®ª ¤«ï ¤ ëå ¡«®ª , ¥ ®¯à¥¤¥«¥®© áâàãªâãàë
|
||||
ID_ICON_CHUNK_MAIN equ 0 ;main block icon
|
||||
ID_ICON_CHUNK_NOT_FOUND equ 1 ;unknown block icon
|
||||
ID_ICON_DATA equ 2 ;icon for block data, undefined structure
|
||||
ID_ICON_POINT equ 8
|
||||
ID_ICON_POINT_SEL equ 9
|
||||
|
||||
FILE_ERROR_CHUNK_SIZE equ -3 ;®è¨¡ª ¢ à §¬¥à¥ ¡«®ª
|
||||
FILE_ERROR_CHUNK_SIZE equ -3 ;block size error
|
||||
|
||||
include 'info_o3d.inc'
|
||||
|
||||
main_wnd_height equ 460 ;¢ëá®â £« ¢®£® ®ª ¯à®£à ¬¬ë
|
||||
main_wnd_height equ 460 ;height of the main program window
|
||||
IMAGE_TOOLBAR_ICON_SIZE equ 21*21*3
|
||||
|
||||
align 4
|
||||
fl255 dd 255.0
|
||||
open_file_data dd 0 ;㪠§ â¥«ì ¯ ¬ïâì ¤«ï ®âªàëâ¨ï ä ©«®¢ 3ds
|
||||
open_file_size dd 0 ;à §¬¥à ®âªàë⮣® ä ©«
|
||||
open_file_data dd 0 ;pointer to memory for opening 3ds files
|
||||
open_file_size dd 0
|
||||
image_data_toolbar dd 0
|
||||
icon_tl_sys dd 0 ;㪠§ ⥥«ì ¯ ¬ïâì ¤«ï åà ¥¨ï á¨á⥬ëå ¨ª®®ª
|
||||
icon_toolbar dd 0 ;㪠§ ⥥«ì ¯ ¬ïâì ¤«ï åà ¥¨ï ¨ª®®ª ®¡ê¥ªâ®¢
|
||||
fn_toolbar db 'toolbar.png',0
|
||||
icon_tl_sys dd 0 ;pointer to memory for storing system icons
|
||||
icon_toolbar dd 0 ;pointer to memory for storing object icons
|
||||
|
||||
align 4
|
||||
level_stack dd 0
|
||||
offs_last_timer dd 0 ;¯®á«¥¤¨© ᤢ¨£ ¯®ª § ë© ¢ äãªæ¨¨ â ©¬¥à
|
||||
offs_last_timer dd 0 ;last shift shown in timer function
|
||||
|
||||
align 4
|
||||
file_3ds: ;¯¥à¥¬¥ë¥ ¨á¯®«ì§ã¥¬ë¥ ¯à¨ ®âªàë⨨ ä ©«
|
||||
.offs: dd 0 ;+0 㪠§ ⥫ì ç «® ¡«®ª
|
||||
.size: dd 0 ;+4 à §¬¥à ¡«®ª (¤«ï 1-£® ¯ à ¬¥âà = à §¬¥à ä ©« 3ds)
|
||||
file_3ds: ;variables used when opening a file
|
||||
.offs: dd 0 ;+0 pointer to the beginning of the block
|
||||
.size: dd 0 ;+4 block size (for 1st parameter = 3ds file size)
|
||||
rb 8*MAX_FILE_LEVEL
|
||||
|
||||
size_one_list equ 42
|
||||
@@ -81,7 +83,7 @@ start:
|
||||
stosd
|
||||
|
||||
load_libraries l_libs_start,l_libs_end
|
||||
;¯à®¢¥àª ᪮«ìª® ã¤ ç® § £ã§¨«¨áì ¡¨¡«¨®â¥ª¨
|
||||
;checking how successfully the libraries were loaded
|
||||
mov ebp,lib_0
|
||||
.test_lib_open:
|
||||
cmp dword [ebp+ll_struc_size-4],0
|
||||
@@ -94,7 +96,7 @@ start:
|
||||
mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
|
||||
mcall SF_SET_EVENTS_MASK,0xC0000027
|
||||
|
||||
stdcall [OpenDialog_Init],OpenDialog_data ;¯®¤£®â®¢ª ¤¨ «®£
|
||||
stdcall [OpenDialog_Init],OpenDialog_data ;preparation of dialogue
|
||||
|
||||
;kmenu initialisation
|
||||
stdcall [kmenu_init],sc
|
||||
@@ -143,70 +145,68 @@ start:
|
||||
stdcall [tl_data_init], tree1
|
||||
;á¨áâ¥¬ë¥ ¨ª®ª¨ 16*16 ¤«ï tree_list
|
||||
include_image_file 'tl_sys_16.png', icon_tl_sys
|
||||
;¥á«¨ ¨§®¡à ¦¥¨¥ ¥ ®âªàë«®áì, â® ¢ icon_tl_sys ¡ã¤ãâ
|
||||
;¥ ¨¨æ¨ «¨§¨à®¢ ë¥ ¤ ë¥, ® ®è¨¡ª¨ ¥ ¡ã¤¥â, â. ª. ¡ãä¥à 㦮£® à §¬¥à
|
||||
mov eax,dword[icon_tl_sys]
|
||||
mov dword[tree1.data_img_sys],eax
|
||||
mov eax,[icon_tl_sys]
|
||||
mov [tree1.data_img_sys],eax
|
||||
|
||||
load_image_file 'objects.png', icon_toolbar
|
||||
mov eax,dword[icon_toolbar]
|
||||
mov dword[tree1.data_img],eax
|
||||
include_image_file 'objects.png', icon_toolbar
|
||||
mov eax,[icon_toolbar]
|
||||
mov [tree1.data_img],eax
|
||||
|
||||
stdcall [buf2d_create], buf_0 ;á®§¤ ¨¥ ¡ãä¥à
|
||||
|
||||
load_image_file 'font8x9.bmp', image_data_toolbar
|
||||
include_image_file '../../fs/kfar/trunk/font8x9.bmp', image_data_toolbar
|
||||
stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;á®§¤ ¥¬ ¡ãä¥à
|
||||
stdcall mem.Free,[image_data_toolbar] ;®á¢®¡®¦¤ ¥¬ ¯ ¬ïâì
|
||||
stdcall [buf2d_conv_24_to_8], buf_1,1 ;¤¥« ¥¬ ¡ãä¥à ¯à®§à ç®á⨠8 ¡¨â
|
||||
stdcall [buf2d_convert_text_matrix], buf_1
|
||||
|
||||
load_image_file fn_toolbar, image_data_toolbar
|
||||
include_image_file 'toolbar.png', image_data_toolbar
|
||||
|
||||
;à ¡®â á ä ©«®¬ áâ஥ª
|
||||
copy_path ini_name,sys_path,file_name,0
|
||||
mov dword[def_dr_mode],0
|
||||
stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dv,1
|
||||
stdcall [ini_get_int],file_name,ini_sec_w3d,key_dv,1
|
||||
or eax,eax
|
||||
jz @f
|
||||
or dword[def_dr_mode], 1 shl bit_vertexes
|
||||
@@:
|
||||
stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_df,1
|
||||
stdcall [ini_get_int],file_name,ini_sec_w3d,key_df,1
|
||||
or eax,eax
|
||||
jz @f
|
||||
or dword[def_dr_mode], 1 shl bit_faces
|
||||
@@:
|
||||
stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dff,1
|
||||
stdcall [ini_get_int],file_name,ini_sec_w3d,key_dff,1
|
||||
or eax,eax
|
||||
jz @f
|
||||
or dword[def_dr_mode], 1 shl bit_faces_fill
|
||||
@@:
|
||||
stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dl,1
|
||||
stdcall [ini_get_int],file_name,ini_sec_w3d,key_dl,1
|
||||
or eax,eax
|
||||
jz @f
|
||||
or dword[def_dr_mode], 1 shl bit_light
|
||||
@@:
|
||||
stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_ds,1
|
||||
stdcall [ini_get_int],file_name,ini_sec_w3d,key_ds,1
|
||||
or eax,eax
|
||||
jz @f
|
||||
or dword[def_dr_mode], 1 shl bit_smooth
|
||||
@@:
|
||||
stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_ox,0x0000ff
|
||||
stdcall [ini_get_color],file_name,ini_sec_w3d,key_ox,0x0000ff
|
||||
mov [color_ox],eax
|
||||
stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_oy,0xff0000
|
||||
stdcall [ini_get_color],file_name,ini_sec_w3d,key_oy,0xff0000
|
||||
mov [color_oy],eax
|
||||
stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_oz,0x00ff00
|
||||
stdcall [ini_get_color],file_name,ini_sec_w3d,key_oz,0x00ff00
|
||||
mov [color_oz],eax
|
||||
stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_bk,0x000000
|
||||
stdcall [ini_get_color],file_name,ini_sec_w3d,key_bk,0x000000
|
||||
mov [color_bk],eax
|
||||
shr eax,8
|
||||
mov [color_bk+4],eax
|
||||
shr eax,8
|
||||
mov [color_bk+8],eax
|
||||
stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_vert,0xffffff
|
||||
stdcall [ini_get_color],file_name,ini_sec_w3d,key_vert,0xffffff
|
||||
mov [color_vert],eax
|
||||
stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_face,0x808080
|
||||
stdcall [ini_get_color],file_name,ini_sec_w3d,key_face,0x808080
|
||||
mov [color_face],eax
|
||||
stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_select,0xffff00
|
||||
stdcall [ini_get_color],file_name,ini_sec_w3d,key_select,0xffff00
|
||||
mov [color_select],eax
|
||||
finit
|
||||
fild dword[color_bk+8]
|
||||
@@ -262,19 +262,19 @@ still:
|
||||
or eax,eax
|
||||
jz timer_funct
|
||||
|
||||
cmp al,1
|
||||
cmp al,EV_REDRAW
|
||||
jne @f
|
||||
call draw_window
|
||||
jmp still
|
||||
@@:
|
||||
cmp al,2
|
||||
cmp al,EV_KEY
|
||||
jz key
|
||||
cmp al,3
|
||||
cmp al,EV_BUTTON
|
||||
jz button
|
||||
cmp al,6
|
||||
cmp al,EV_MOUSE
|
||||
jne @f
|
||||
mcall SF_THREAD_INFO,procinfo,-1
|
||||
cmp ax,word[procinfo+4]
|
||||
cmp ax,word[procinfo.window_stack_position]
|
||||
jne @f ;®ª® ¥ ªâ¨¢®
|
||||
call mouse
|
||||
@@:
|
||||
@@ -282,7 +282,7 @@ still:
|
||||
|
||||
align 4
|
||||
mouse:
|
||||
stdcall [tl_mouse], dword tree1
|
||||
stdcall [tl_mouse], tree1
|
||||
ret
|
||||
|
||||
align 4
|
||||
@@ -385,7 +385,7 @@ pushad
|
||||
mcall , (20 shl 16)+560, (20 shl 16)+main_wnd_height
|
||||
|
||||
mcall SF_THREAD_INFO,procinfo,-1
|
||||
mov eax,dword[procinfo.box.height]
|
||||
mov eax,[procinfo.box.height]
|
||||
cmp eax,250
|
||||
jge @f
|
||||
mov eax,250
|
||||
@@ -393,13 +393,14 @@ pushad
|
||||
sub eax,65
|
||||
mov dword[tree1.box_height],eax
|
||||
mov word[w_scr_t1.y_size],ax ;®¢ë¥ à §¬¥àë áªà®««¨£
|
||||
cmp eax,dword[buf_0.h] ;㢥«¨ç¨¢ ¥¬ ¢ëá®âã ¡ãä¥à
|
||||
jle @f
|
||||
cmp eax,dword[buf_0.h] ;change buffer height
|
||||
je @f
|
||||
stdcall [buf2d_resize],buf_0,0,eax,1
|
||||
mov dword[offs_last_timer],0 ;¤«ï ®¡®¢«¥¨ï ¡ãä¥à ¢ â ©¬¥à¥
|
||||
stdcall [buf2d_clear], buf_0, [buf_0.color] ;background update
|
||||
mov dword[offs_last_timer],0 ;for update buffer in the timer
|
||||
@@:
|
||||
|
||||
mov eax,dword[procinfo.box.width]
|
||||
mov eax,[procinfo.box.width]
|
||||
cmp eax,400
|
||||
jge @f
|
||||
mov eax,400
|
||||
@@ -457,7 +458,7 @@ popad
|
||||
align 4
|
||||
key:
|
||||
mcall SF_GET_KEY
|
||||
stdcall [tl_key], dword tree1
|
||||
stdcall [tl_key], tree1
|
||||
jmp still
|
||||
|
||||
|
||||
@@ -1087,53 +1088,6 @@ l_libs_start:
|
||||
lib_6 l_libs lib_name_6, file_name, system_dir_6, import_libini
|
||||
l_libs_end:
|
||||
|
||||
align 4
|
||||
import_libimg:
|
||||
dd alib_init1
|
||||
img_is_img dd aimg_is_img
|
||||
img_info dd aimg_info
|
||||
img_from_file dd aimg_from_file
|
||||
img_to_file dd aimg_to_file
|
||||
img_from_rgb dd aimg_from_rgb
|
||||
img_to_rgb dd aimg_to_rgb
|
||||
img_to_rgb2 dd aimg_to_rgb2
|
||||
img_decode dd aimg_decode
|
||||
img_encode dd aimg_encode
|
||||
img_create dd aimg_create
|
||||
img_destroy dd aimg_destroy
|
||||
img_destroy_layer dd aimg_destroy_layer
|
||||
img_count dd aimg_count
|
||||
img_lock_bits dd aimg_lock_bits
|
||||
img_unlock_bits dd aimg_unlock_bits
|
||||
img_flip dd aimg_flip
|
||||
img_flip_layer dd aimg_flip_layer
|
||||
img_rotate dd aimg_rotate
|
||||
img_rotate_layer dd aimg_rotate_layer
|
||||
img_draw dd aimg_draw
|
||||
|
||||
dd 0,0
|
||||
alib_init1 db 'lib_init',0
|
||||
aimg_is_img db 'img_is_img',0 ;®¯à¥¤¥«ï¥â ¯® ¤ ë¬, ¬®¦¥â «¨ ¡¨¡«¨®â¥ª ᤥ« âì ¨§ ¨å ¨§®¡à ¦¥¨¥
|
||||
aimg_info db 'img_info',0
|
||||
aimg_from_file db 'img_from_file',0
|
||||
aimg_to_file db 'img_to_file',0
|
||||
aimg_from_rgb db 'img_from_rgb',0
|
||||
aimg_to_rgb db 'img_to_rgb',0 ;¯à¥®¡à §®¢ ¨¥ ¨§®¡à ¦¥¨ï ¢ ¤ ë¥ RGB
|
||||
aimg_to_rgb2 db 'img_to_rgb2',0
|
||||
aimg_decode db 'img_decode',0 ; ¢â®¬ â¨ç¥áª¨ ®¯à¥¤¥«ï¥â ä®à¬ â £à ä¨ç¥áª¨å ¤ ëå
|
||||
aimg_encode db 'img_encode',0
|
||||
aimg_create db 'img_create',0
|
||||
aimg_destroy db 'img_destroy',0
|
||||
aimg_destroy_layer db 'img_destroy_layer',0
|
||||
aimg_count db 'img_count',0
|
||||
aimg_lock_bits db 'img_lock_bits',0
|
||||
aimg_unlock_bits db 'img_unlock_bits',0
|
||||
aimg_flip db 'img_flip',0
|
||||
aimg_flip_layer db 'img_flip_layer',0
|
||||
aimg_rotate db 'img_rotate',0
|
||||
aimg_rotate_layer db 'img_rotate_layer',0
|
||||
aimg_draw db 'img_draw',0
|
||||
|
||||
align 4
|
||||
import_proclib:
|
||||
OpenDialog_Init dd aOpenDialog_Init
|
||||
@@ -1146,122 +1100,9 @@ dd 0,0
|
||||
aOpenDialog_Set_file_name db 'OpenDialog_set_file_name',0
|
||||
aOpenDialog_Set_file_ext db 'OpenDialog_set_file_ext',0
|
||||
|
||||
align 4
|
||||
import_buf2d:
|
||||
dd sz_init0
|
||||
buf2d_create dd sz_buf2d_create
|
||||
buf2d_create_f_img dd sz_buf2d_create_f_img
|
||||
buf2d_clear dd sz_buf2d_clear
|
||||
buf2d_draw dd sz_buf2d_draw
|
||||
buf2d_delete dd sz_buf2d_delete
|
||||
buf2d_resize dd sz_buf2d_resize
|
||||
buf2d_line dd sz_buf2d_line
|
||||
buf2d_rect_by_size dd sz_buf2d_rect_by_size
|
||||
buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
|
||||
buf2d_circle dd sz_buf2d_circle
|
||||
buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
|
||||
buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
|
||||
buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
|
||||
buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
|
||||
buf2d_bit_blt dd sz_buf2d_bit_blt
|
||||
buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
|
||||
buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
|
||||
buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
|
||||
buf2d_draw_text dd sz_buf2d_draw_text
|
||||
buf2d_crop_color dd sz_buf2d_crop_color
|
||||
buf2d_offset_h dd sz_buf2d_offset_h
|
||||
buf2d_set_pixel dd sz_buf2d_set_pixel
|
||||
dd 0,0
|
||||
sz_init0 db 'lib_init',0
|
||||
sz_buf2d_create db 'buf2d_create',0
|
||||
sz_buf2d_create_f_img db 'buf2d_create_f_img',0
|
||||
sz_buf2d_clear db 'buf2d_clear',0
|
||||
sz_buf2d_draw db 'buf2d_draw',0
|
||||
sz_buf2d_delete db 'buf2d_delete',0
|
||||
sz_buf2d_resize db 'buf2d_resize',0
|
||||
sz_buf2d_line db 'buf2d_line',0
|
||||
sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
|
||||
sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
|
||||
sz_buf2d_circle db 'buf2d_circle',0
|
||||
sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
|
||||
sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
|
||||
sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
|
||||
sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
|
||||
sz_buf2d_bit_blt db 'buf2d_bit_blt',0
|
||||
sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
|
||||
sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
|
||||
sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
|
||||
sz_buf2d_draw_text db 'buf2d_draw_text',0
|
||||
sz_buf2d_crop_color db 'buf2d_crop_color',0
|
||||
sz_buf2d_offset_h db 'buf2d_offset_h',0
|
||||
sz_buf2d_set_pixel db 'buf2d_set_pixel',0
|
||||
|
||||
align 4
|
||||
import_box_lib:
|
||||
dd sz_init1
|
||||
edit_box_draw dd sz_edit_box_draw
|
||||
edit_box_key dd sz_edit_box_key
|
||||
edit_box_mouse dd sz_edit_box_mouse
|
||||
edit_box_set_text dd sz_edit_box_set_text
|
||||
scrollbar_ver_draw dd sz_scrollbar_ver_draw
|
||||
scrollbar_hor_draw dd sz_scrollbar_hor_draw
|
||||
|
||||
tl_data_init dd sz_tl_data_init
|
||||
tl_data_clear dd sz_tl_data_clear
|
||||
tl_info_clear dd sz_tl_info_clear
|
||||
tl_key dd sz_tl_key
|
||||
tl_mouse dd sz_tl_mouse
|
||||
tl_draw dd sz_tl_draw
|
||||
tl_info_undo dd sz_tl_info_undo
|
||||
tl_info_redo dd sz_tl_info_redo
|
||||
tl_node_add dd sz_tl_node_add
|
||||
tl_node_set_data dd sz_tl_node_set_data
|
||||
tl_node_get_data dd sz_tl_node_get_data
|
||||
tl_node_delete dd sz_tl_node_delete
|
||||
tl_node_move_up dd sz_tl_node_move_up
|
||||
tl_node_move_down dd sz_tl_node_move_down
|
||||
tl_cur_beg dd sz_tl_cur_beg
|
||||
tl_cur_next dd sz_tl_cur_next
|
||||
tl_cur_perv dd sz_tl_cur_perv
|
||||
tl_node_close_open dd sz_tl_node_close_open
|
||||
tl_node_lev_inc dd sz_tl_node_lev_inc
|
||||
tl_node_lev_dec dd sz_tl_node_lev_dec
|
||||
tl_node_poi_get_info dd sz_tl_node_poi_get_info
|
||||
tl_node_poi_get_next_info dd sz_tl_node_poi_get_next_info
|
||||
tl_node_poi_get_data dd sz_tl_node_poi_get_data
|
||||
|
||||
dd 0,0
|
||||
sz_init1 db 'lib_init',0
|
||||
sz_edit_box_draw db 'edit_box_draw',0
|
||||
sz_edit_box_key db 'edit_box_key',0
|
||||
sz_edit_box_mouse db 'edit_box_mouse',0
|
||||
sz_edit_box_set_text db 'edit_box_set_text',0
|
||||
sz_scrollbar_ver_draw db 'scrollbar_v_draw',0
|
||||
sz_scrollbar_hor_draw db 'scrollbar_h_draw',0
|
||||
|
||||
sz_tl_data_init db 'tl_data_init',0
|
||||
sz_tl_data_clear db 'tl_data_clear',0
|
||||
sz_tl_info_clear db 'tl_info_clear',0
|
||||
sz_tl_key db 'tl_key',0
|
||||
sz_tl_mouse db 'tl_mouse',0
|
||||
sz_tl_draw db 'tl_draw',0
|
||||
sz_tl_info_undo db 'tl_info_undo',0
|
||||
sz_tl_info_redo db 'tl_info_redo',0
|
||||
sz_tl_node_add db 'tl_node_add',0
|
||||
sz_tl_node_set_data db 'tl_node_set_data',0
|
||||
sz_tl_node_get_data db 'tl_node_get_data',0
|
||||
sz_tl_node_delete db 'tl_node_delete',0
|
||||
sz_tl_node_move_up db 'tl_node_move_up',0
|
||||
sz_tl_node_move_down db 'tl_node_move_down',0
|
||||
sz_tl_cur_beg db 'tl_cur_beg',0
|
||||
sz_tl_cur_next db 'tl_cur_next',0
|
||||
sz_tl_cur_perv db 'tl_cur_perv',0
|
||||
sz_tl_node_close_open db 'tl_node_close_open',0
|
||||
sz_tl_node_lev_inc db 'tl_node_lev_inc',0
|
||||
sz_tl_node_lev_dec db 'tl_node_lev_dec',0
|
||||
sz_tl_node_poi_get_info db 'tl_node_poi_get_info',0
|
||||
sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0
|
||||
sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0
|
||||
include '../../develop/libraries/libs-dev/libimg/import.inc'
|
||||
include '../../develop/libraries/box_lib/import.inc'
|
||||
include '../../develop/libraries/buf2d/import.inc'
|
||||
|
||||
align 4
|
||||
import_libkmenu:
|
||||
@@ -1287,23 +1128,7 @@ dd 0,0
|
||||
akmenuitem_delete db 'kmenuitem_delete',0
|
||||
akmenuitem_draw db 'kmenuitem_draw',0
|
||||
|
||||
align 4
|
||||
import_tinygl:
|
||||
macro E_LIB n
|
||||
{
|
||||
if defined sz_#n
|
||||
n dd sz_#n
|
||||
end if
|
||||
}
|
||||
include '../../develop/libraries/TinyGL/asm_fork/export.inc'
|
||||
dd 0,0
|
||||
macro E_LIB n
|
||||
{
|
||||
if used n
|
||||
sz_#n db `n,0
|
||||
end if
|
||||
}
|
||||
include '../../develop/libraries/TinyGL/asm_fork/export.inc'
|
||||
include '../../develop/libraries/TinyGL/asm_fork/import.inc'
|
||||
|
||||
align 4
|
||||
import_libini:
|
||||
@@ -1367,9 +1192,9 @@ white_light dd 0.8, 0.8, 0.8, 1.0 ;
|
||||
lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; <20> à ¬¥âàë ä®®¢®£® ®á¢¥é¥¨ï
|
||||
|
||||
if lang eq ru_RU
|
||||
capt db 'info 3ds ¢¥àá¨ï 04.05.25',0 ;¯®¤¯¨áì ®ª
|
||||
capt db 'info 3ds ¢¥àá¨ï 22.10.25',0
|
||||
else ; Default to en_US
|
||||
capt db 'info 3ds version 04.05.25',0 ;window caption
|
||||
capt db 'info 3ds version 22.10.25',0 ;window caption
|
||||
end if
|
||||
|
||||
align 16
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
; SPDX-License-Identifier: GPL-2.0-only
|
||||
; Info3ds_u - is a program for viewing the structure of *.3ds files
|
||||
; Copyright (C) 2015-2025 KolibriOS team
|
||||
|
||||
use32
|
||||
org 0
|
||||
db 'MENUET01' ;¨¤¥â¨ä. ¨á¯®«ï¥¬®£® ä ©« ¢á¥£¤ 8 ¡ ©â
|
||||
@@ -12,6 +16,7 @@ include '../../develop/libraries/libs-dev/libimg/libimg.inc'
|
||||
include '../../load_img.inc'
|
||||
include '../../load_lib.mac'
|
||||
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
|
||||
include '../../develop/libraries/TinyGL/asm_fork/kosgl.inc'
|
||||
include '../../develop/libraries/TinyGL/asm_fork/opengl_const.inc'
|
||||
include 'lang.inc' ; Language support for locales: ru_RU (CP866), en_US.
|
||||
include 'info_fun_float.inc'
|
||||
@@ -21,8 +26,8 @@ include 'convert_stl_3ds.inc'
|
||||
|
||||
3d_wnd_l equ 205 ;®âáâ㯠¤«ï tinygl ¡ãä¥à á«¥¢
|
||||
3d_wnd_t equ 47 ;®âáâ㯠¤«ï tinygl ¡ãä¥à ᢥàåã
|
||||
3d_wnd_w equ 344
|
||||
3d_wnd_h equ 312
|
||||
3d_wnd_w equ 345
|
||||
3d_wnd_h equ 384
|
||||
|
||||
@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
|
||||
|
||||
@@ -43,13 +48,13 @@ list_offs_text equ 14+sizeof.obj_3d ;ᤢ
|
||||
include 'info_o3d.inc'
|
||||
|
||||
align 4
|
||||
fl180 dd 180.0
|
||||
fl255 dd 255.0
|
||||
open_file_data dd 0 ;㪠§ â¥«ì ¯ ¬ïâì ¤«ï ®âªàëâ¨ï ä ©«®¢ 3ds
|
||||
open_file_size dd 0 ;à §¬¥à ®âªàë⮣® ä ©«
|
||||
|
||||
;
|
||||
main_wnd_height equ 460 ;¢ëá®â £« ¢®£® ®ª ¯à®£à ¬¬ë
|
||||
fn_toolbar db 'toolbar.png',0
|
||||
IMAGE_TOOLBAR_ICON_SIZE equ 21*21*3
|
||||
image_data_toolbar dd 0
|
||||
;
|
||||
@@ -140,17 +145,17 @@ start:
|
||||
mov eax,dword[icon_tl_sys]
|
||||
mov dword[tree1.data_img_sys],eax
|
||||
|
||||
load_image_file 'objects.png', icon_toolbar
|
||||
include_image_file 'objects.png', icon_toolbar
|
||||
mov eax,dword[icon_toolbar]
|
||||
mov dword[tree1.data_img],eax
|
||||
|
||||
load_image_file 'font8x9.bmp', image_data_toolbar
|
||||
include_image_file '../../fs/kfar/trunk/font8x9.bmp', image_data_toolbar
|
||||
stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;á®§¤ ¥¬ ¡ãä¥à
|
||||
stdcall mem.Free,[image_data_toolbar] ;®á¢®¡®¦¤ ¥¬ ¯ ¬ïâì
|
||||
stdcall [buf2d_conv_24_to_8], buf_1,1 ;¤¥« ¥¬ ¡ãä¥à ¯à®§à ç®á⨠8 ¡¨â
|
||||
stdcall [buf2d_convert_text_matrix], buf_1
|
||||
|
||||
load_image_file fn_toolbar, image_data_toolbar
|
||||
include_image_file 'toolbar.png', image_data_toolbar
|
||||
|
||||
;à ¡®â á ä ©«®¬ áâ஥ª
|
||||
copy_path ini_name,sys_path,file_name,0
|
||||
@@ -223,7 +228,7 @@ start:
|
||||
mcall SF_SYSTEM_GET,SSF_TIME_COUNT
|
||||
mov [last_time],eax
|
||||
|
||||
stdcall [kosglMakeCurrent], 3d_wnd_l,3d_wnd_t,3d_wnd_w,3d_wnd_h,ctx1
|
||||
stdcall [kosglMakeCurrent], 3d_wnd_l,3d_wnd_t,[buf_ogl.w],[buf_ogl.h],ctx1
|
||||
stdcall [glEnable], GL_DEPTH_TEST
|
||||
stdcall [glEnable], GL_NORMALIZE ;¤¥« ¬ ®à¬ «¨ ®¤¨ ª®¢®© ¢¥«¨ç¨ë ¢® ¨§¡¥¦ ¨¥ àâ¥ä ªâ®¢
|
||||
stdcall [glClearColor], [color_bk+8],[color_bk+4],[color_bk],0.0
|
||||
@@ -231,7 +236,7 @@ start:
|
||||
call [gluNewQuadric]
|
||||
mov [qObj],eax
|
||||
|
||||
mov eax,dword[ctx1] ;eax -> TinyGLContext.GLContext
|
||||
mov eax,[ctx1.gl_context]
|
||||
mov eax,[eax] ;eax -> ZBuffer
|
||||
mov eax,[eax+ZBuffer.pbuf]
|
||||
mov dword[buf_ogl],eax
|
||||
@@ -257,20 +262,20 @@ still:
|
||||
or eax,eax
|
||||
jz timer_funct
|
||||
|
||||
cmp al,1
|
||||
cmp al,EV_REDRAW
|
||||
jne @f
|
||||
call draw_window
|
||||
jmp still
|
||||
@@:
|
||||
cmp al,2
|
||||
cmp al,EV_KEY
|
||||
jz key
|
||||
cmp al,3
|
||||
cmp al,EV_BUTTON
|
||||
jz button
|
||||
cmp al,6
|
||||
cmp al,EV_MOUSE
|
||||
jne @f
|
||||
mcall SF_THREAD_INFO,procinfo,-1
|
||||
cmp ax,word[procinfo+4]
|
||||
jne @f ;®ª® ¥ ªâ¨¢®
|
||||
cmp ax,word[procinfo.window_stack_position]
|
||||
jne @f ;window is not active
|
||||
call mouse
|
||||
@@:
|
||||
jmp still
|
||||
@@ -301,9 +306,9 @@ mouse:
|
||||
mov ebx,3d_wnd_l
|
||||
@@:
|
||||
sub ebx,3d_wnd_l
|
||||
cmp ebx,3d_wnd_w
|
||||
cmp ebx,[buf_ogl.w]
|
||||
jle @f
|
||||
mov ebx,3d_wnd_w
|
||||
mov ebx,[buf_ogl.w]
|
||||
@@:
|
||||
movsx eax,ax ;mouse.y
|
||||
cmp eax,3d_wnd_t
|
||||
@@ -311,9 +316,9 @@ mouse:
|
||||
mov eax,3d_wnd_t
|
||||
@@:
|
||||
sub eax,3d_wnd_t
|
||||
cmp eax,3d_wnd_h
|
||||
cmp eax,[buf_ogl.h]
|
||||
jle @f
|
||||
mov eax,3d_wnd_h
|
||||
mov eax,[buf_ogl.h]
|
||||
@@:
|
||||
finit
|
||||
fild dword[mouse_y]
|
||||
@@ -351,13 +356,13 @@ mouse:
|
||||
cmp ebx,3d_wnd_l
|
||||
jl .end_d
|
||||
sub ebx,3d_wnd_l
|
||||
cmp ebx,3d_wnd_w
|
||||
cmp ebx,[buf_ogl.w]
|
||||
jg .end_d
|
||||
movsx eax,ax ;mouse.y
|
||||
cmp eax,3d_wnd_t
|
||||
jl .end_d
|
||||
sub eax,3d_wnd_t
|
||||
cmp eax,3d_wnd_h
|
||||
cmp eax,[buf_ogl.h]
|
||||
jg .end_d
|
||||
mov dword[mouse_drag],1
|
||||
mov dword[mouse_x],ebx
|
||||
@@ -440,16 +445,7 @@ pushad
|
||||
or edx,0x33000000
|
||||
mcall SF_CREATE_WINDOW, (20 shl 16)+560, (20 shl 16)+main_wnd_height,,, capt
|
||||
|
||||
mcall SF_THREAD_INFO,procinfo,-1
|
||||
mov eax,dword[procinfo.box.height]
|
||||
cmp eax,250
|
||||
jge @f
|
||||
mov eax,250
|
||||
@@:
|
||||
sub eax,30
|
||||
sub eax,[tree1.box_top]
|
||||
mov [tree1.box_height],eax
|
||||
mov word[w_scr_t1.y_size],ax ;®¢ë¥ à §¬¥àë áªà®««¨£
|
||||
call OnResize
|
||||
|
||||
stdcall [kmainmenu_draw], [main_menu]
|
||||
|
||||
@@ -493,6 +489,64 @@ pushad
|
||||
popad
|
||||
ret
|
||||
|
||||
align 4
|
||||
OnResize:
|
||||
mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT
|
||||
push eax
|
||||
mcall SF_THREAD_INFO,procinfo,-1
|
||||
mov eax,[procinfo.box.height]
|
||||
cmp eax,250
|
||||
jge @f
|
||||
mov eax,250
|
||||
@@:
|
||||
sub eax,[esp]
|
||||
sub eax,5
|
||||
sub eax,[tree1.box_top]
|
||||
mov [tree1.box_height],eax
|
||||
mov word[w_scr_t1.y_size],ax ;new scroll sizes
|
||||
|
||||
cmp [buf_ogl.h],eax
|
||||
je @f
|
||||
mov [buf_ogl.h],eax
|
||||
mov dword[buf_ogl.w],0 ;reset width
|
||||
@@:
|
||||
pop eax
|
||||
movzx eax,word[w_scr_t1.x_size]
|
||||
add eax,[tree1.box_left]
|
||||
add eax,[tree1.box_width]
|
||||
add eax,15 ;5 px * 3 borders
|
||||
sub eax,[procinfo.box.width]
|
||||
neg eax
|
||||
cmp eax,64
|
||||
jge @f
|
||||
mov eax,64
|
||||
@@:
|
||||
cmp [buf_ogl.w],eax
|
||||
je .end
|
||||
mov [buf_ogl.w],eax
|
||||
fild dword[buf_ogl.w]
|
||||
fld st0
|
||||
fdiv dword[fl180]
|
||||
fstp dword[angle_dxm]
|
||||
fidiv dword[buf_ogl.h]
|
||||
fstp dword[ratio]
|
||||
stdcall [glViewport], 0,0, [buf_ogl.w], [buf_ogl.h]
|
||||
|
||||
mov eax,[ctx1.gl_context]
|
||||
mov eax,[eax] ;eax -> ZBuffer
|
||||
mov eax,[eax+ZBuffer.pbuf]
|
||||
mov dword[buf_ogl],eax
|
||||
|
||||
stdcall [tl_node_get_data],tree1
|
||||
or eax,eax
|
||||
jz .end
|
||||
mov dword[offs_last_timer],0 ;for update buffer in the timer
|
||||
add eax,list_offs_obj3d
|
||||
stdcall obj_set_sizes, eax
|
||||
stdcall draw_3d, eax
|
||||
.end:
|
||||
ret
|
||||
|
||||
align 4
|
||||
key:
|
||||
mcall SF_GET_KEY
|
||||
@@ -1152,57 +1206,10 @@ l_libs_start:
|
||||
lib_2 l_libs lib_name_2, file_name, system_dir_2, import_box_lib
|
||||
lib_3 l_libs lib_name_3, file_name, system_dir_3, import_buf2d
|
||||
lib_4 l_libs lib_name_4, file_name, system_dir_4, import_libkmenu
|
||||
lib_5 l_libs lib_name_5, file_name, system_dir_5, import_lib_tinygl
|
||||
lib_5 l_libs lib_name_5, file_name, system_dir_5, import_tinygl
|
||||
lib_6 l_libs lib_name_6, file_name, system_dir_6, import_libini
|
||||
l_libs_end:
|
||||
|
||||
align 4
|
||||
import_libimg:
|
||||
dd alib_init1
|
||||
img_is_img dd aimg_is_img
|
||||
img_info dd aimg_info
|
||||
img_from_file dd aimg_from_file
|
||||
img_to_file dd aimg_to_file
|
||||
img_from_rgb dd aimg_from_rgb
|
||||
img_to_rgb dd aimg_to_rgb
|
||||
img_to_rgb2 dd aimg_to_rgb2
|
||||
img_decode dd aimg_decode
|
||||
img_encode dd aimg_encode
|
||||
img_create dd aimg_create
|
||||
img_destroy dd aimg_destroy
|
||||
img_destroy_layer dd aimg_destroy_layer
|
||||
img_count dd aimg_count
|
||||
img_lock_bits dd aimg_lock_bits
|
||||
img_unlock_bits dd aimg_unlock_bits
|
||||
img_flip dd aimg_flip
|
||||
img_flip_layer dd aimg_flip_layer
|
||||
img_rotate dd aimg_rotate
|
||||
img_rotate_layer dd aimg_rotate_layer
|
||||
img_draw dd aimg_draw
|
||||
|
||||
dd 0,0
|
||||
alib_init1 db 'lib_init',0
|
||||
aimg_is_img db 'img_is_img',0 ;®¯à¥¤¥«ï¥â ¯® ¤ ë¬, ¬®¦¥â «¨ ¡¨¡«¨®â¥ª ᤥ« âì ¨§ ¨å ¨§®¡à ¦¥¨¥
|
||||
aimg_info db 'img_info',0
|
||||
aimg_from_file db 'img_from_file',0
|
||||
aimg_to_file db 'img_to_file',0
|
||||
aimg_from_rgb db 'img_from_rgb',0
|
||||
aimg_to_rgb db 'img_to_rgb',0 ;¯à¥®¡à §®¢ ¨¥ ¨§®¡à ¦¥¨ï ¢ ¤ ë¥ RGB
|
||||
aimg_to_rgb2 db 'img_to_rgb2',0
|
||||
aimg_decode db 'img_decode',0 ; ¢â®¬ â¨ç¥áª¨ ®¯à¥¤¥«ï¥â ä®à¬ â £à ä¨ç¥áª¨å ¤ ëå
|
||||
aimg_encode db 'img_encode',0
|
||||
aimg_create db 'img_create',0
|
||||
aimg_destroy db 'img_destroy',0
|
||||
aimg_destroy_layer db 'img_destroy_layer',0
|
||||
aimg_count db 'img_count',0
|
||||
aimg_lock_bits db 'img_lock_bits',0
|
||||
aimg_unlock_bits db 'img_unlock_bits',0
|
||||
aimg_flip db 'img_flip',0
|
||||
aimg_flip_layer db 'img_flip_layer',0
|
||||
aimg_rotate db 'img_rotate',0
|
||||
aimg_rotate_layer db 'img_rotate_layer',0
|
||||
aimg_draw db 'img_draw',0
|
||||
|
||||
align 4
|
||||
import_proclib:
|
||||
OpenDialog_Init dd aOpenDialog_Init
|
||||
@@ -1215,122 +1222,9 @@ dd 0,0
|
||||
aOpenDialog_Set_file_name db 'OpenDialog_set_file_name',0
|
||||
aOpenDialog_Set_file_ext db 'OpenDialog_set_file_ext',0
|
||||
|
||||
align 4
|
||||
import_buf2d:
|
||||
dd sz_init0
|
||||
buf2d_create dd sz_buf2d_create
|
||||
buf2d_create_f_img dd sz_buf2d_create_f_img
|
||||
buf2d_clear dd sz_buf2d_clear
|
||||
buf2d_draw dd sz_buf2d_draw
|
||||
buf2d_delete dd sz_buf2d_delete
|
||||
buf2d_resize dd sz_buf2d_resize
|
||||
buf2d_line dd sz_buf2d_line
|
||||
buf2d_rect_by_size dd sz_buf2d_rect_by_size
|
||||
buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
|
||||
buf2d_circle dd sz_buf2d_circle
|
||||
buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
|
||||
buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
|
||||
buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
|
||||
buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
|
||||
buf2d_bit_blt dd sz_buf2d_bit_blt
|
||||
buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
|
||||
buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
|
||||
buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
|
||||
buf2d_draw_text dd sz_buf2d_draw_text
|
||||
buf2d_crop_color dd sz_buf2d_crop_color
|
||||
buf2d_offset_h dd sz_buf2d_offset_h
|
||||
buf2d_set_pixel dd sz_buf2d_set_pixel
|
||||
dd 0,0
|
||||
sz_init0 db 'lib_init',0
|
||||
sz_buf2d_create db 'buf2d_create',0
|
||||
sz_buf2d_create_f_img db 'buf2d_create_f_img',0
|
||||
sz_buf2d_clear db 'buf2d_clear',0
|
||||
sz_buf2d_draw db 'buf2d_draw',0
|
||||
sz_buf2d_delete db 'buf2d_delete',0
|
||||
sz_buf2d_resize db 'buf2d_resize',0
|
||||
sz_buf2d_line db 'buf2d_line',0
|
||||
sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
|
||||
sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
|
||||
sz_buf2d_circle db 'buf2d_circle',0
|
||||
sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
|
||||
sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
|
||||
sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
|
||||
sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
|
||||
sz_buf2d_bit_blt db 'buf2d_bit_blt',0
|
||||
sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
|
||||
sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
|
||||
sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
|
||||
sz_buf2d_draw_text db 'buf2d_draw_text',0
|
||||
sz_buf2d_crop_color db 'buf2d_crop_color',0
|
||||
sz_buf2d_offset_h db 'buf2d_offset_h',0
|
||||
sz_buf2d_set_pixel db 'buf2d_set_pixel',0
|
||||
|
||||
align 4
|
||||
import_box_lib:
|
||||
dd sz_init1
|
||||
edit_box_draw dd sz_edit_box_draw
|
||||
edit_box_key dd sz_edit_box_key
|
||||
edit_box_mouse dd sz_edit_box_mouse
|
||||
edit_box_set_text dd sz_edit_box_set_text
|
||||
scrollbar_ver_draw dd sz_scrollbar_ver_draw
|
||||
scrollbar_hor_draw dd sz_scrollbar_hor_draw
|
||||
|
||||
tl_data_init dd sz_tl_data_init
|
||||
tl_data_clear dd sz_tl_data_clear
|
||||
tl_info_clear dd sz_tl_info_clear
|
||||
tl_key dd sz_tl_key
|
||||
tl_mouse dd sz_tl_mouse
|
||||
tl_draw dd sz_tl_draw
|
||||
tl_info_undo dd sz_tl_info_undo
|
||||
tl_info_redo dd sz_tl_info_redo
|
||||
tl_node_add dd sz_tl_node_add
|
||||
tl_node_set_data dd sz_tl_node_set_data
|
||||
tl_node_get_data dd sz_tl_node_get_data
|
||||
tl_node_delete dd sz_tl_node_delete
|
||||
tl_node_move_up dd sz_tl_node_move_up
|
||||
tl_node_move_down dd sz_tl_node_move_down
|
||||
tl_cur_beg dd sz_tl_cur_beg
|
||||
tl_cur_next dd sz_tl_cur_next
|
||||
tl_cur_perv dd sz_tl_cur_perv
|
||||
tl_node_close_open dd sz_tl_node_close_open
|
||||
tl_node_lev_inc dd sz_tl_node_lev_inc
|
||||
tl_node_lev_dec dd sz_tl_node_lev_dec
|
||||
tl_node_poi_get_info dd sz_tl_node_poi_get_info
|
||||
tl_node_poi_get_next_info dd sz_tl_node_poi_get_next_info
|
||||
tl_node_poi_get_data dd sz_tl_node_poi_get_data
|
||||
|
||||
dd 0,0
|
||||
sz_init1 db 'lib_init',0
|
||||
sz_edit_box_draw db 'edit_box_draw',0
|
||||
sz_edit_box_key db 'edit_box_key',0
|
||||
sz_edit_box_mouse db 'edit_box_mouse',0
|
||||
sz_edit_box_set_text db 'edit_box_set_text',0
|
||||
sz_scrollbar_ver_draw db 'scrollbar_v_draw',0
|
||||
sz_scrollbar_hor_draw db 'scrollbar_h_draw',0
|
||||
|
||||
sz_tl_data_init db 'tl_data_init',0
|
||||
sz_tl_data_clear db 'tl_data_clear',0
|
||||
sz_tl_info_clear db 'tl_info_clear',0
|
||||
sz_tl_key db 'tl_key',0
|
||||
sz_tl_mouse db 'tl_mouse',0
|
||||
sz_tl_draw db 'tl_draw',0
|
||||
sz_tl_info_undo db 'tl_info_undo',0
|
||||
sz_tl_info_redo db 'tl_info_redo',0
|
||||
sz_tl_node_add db 'tl_node_add',0
|
||||
sz_tl_node_set_data db 'tl_node_set_data',0
|
||||
sz_tl_node_get_data db 'tl_node_get_data',0
|
||||
sz_tl_node_delete db 'tl_node_delete',0
|
||||
sz_tl_node_move_up db 'tl_node_move_up',0
|
||||
sz_tl_node_move_down db 'tl_node_move_down',0
|
||||
sz_tl_cur_beg db 'tl_cur_beg',0
|
||||
sz_tl_cur_next db 'tl_cur_next',0
|
||||
sz_tl_cur_perv db 'tl_cur_perv',0
|
||||
sz_tl_node_close_open db 'tl_node_close_open',0
|
||||
sz_tl_node_lev_inc db 'tl_node_lev_inc',0
|
||||
sz_tl_node_lev_dec db 'tl_node_lev_dec',0
|
||||
sz_tl_node_poi_get_info db 'tl_node_poi_get_info',0
|
||||
sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0
|
||||
sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0
|
||||
include '../../develop/libraries/libs-dev/libimg/import.inc'
|
||||
include '../../develop/libraries/box_lib/import.inc'
|
||||
include '../../develop/libraries/buf2d/import.inc'
|
||||
|
||||
align 4
|
||||
import_libkmenu:
|
||||
@@ -1356,19 +1250,7 @@ dd 0,0
|
||||
akmenuitem_delete db 'kmenuitem_delete',0
|
||||
akmenuitem_draw db 'kmenuitem_draw',0
|
||||
|
||||
align 4
|
||||
import_lib_tinygl:
|
||||
macro E_LIB n
|
||||
{
|
||||
n dd sz_#n
|
||||
}
|
||||
include '../../develop/libraries/TinyGL/asm_fork/export.inc'
|
||||
dd 0,0
|
||||
macro E_LIB n
|
||||
{
|
||||
sz_#n db `n,0
|
||||
}
|
||||
include '../../develop/libraries/TinyGL/asm_fork/export.inc'
|
||||
include '../../develop/libraries/TinyGL/asm_fork/import.inc'
|
||||
|
||||
align 4
|
||||
import_libini:
|
||||
@@ -1387,7 +1269,7 @@ mouse_dd dd 0
|
||||
last_time dd 0
|
||||
angle_dxm dd 1.9111 ;~ 3d_wnd_w/180 - ¯à¨¡ ¢«¥¨¥ 㣫®¢ ¯®¢®à®â áæ¥ë ¯à¨ ¢à 饨¨ ¬ë襩
|
||||
angle_dym dd 1.7333 ;~ 3d_wnd_h/180
|
||||
ratio dd 1.1025 ;~ 3d_wnd_w/3d_wnd_h
|
||||
ratio dd 0.8984375 ;~ 3d_wnd_w/3d_wnd_h
|
||||
|
||||
align 4
|
||||
buf_ogl:
|
||||
@@ -1427,14 +1309,14 @@ white_light dd 0.8, 0.8, 0.8, 1.0 ;
|
||||
lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; <20> à ¬¥âàë ä®®¢®£® ®á¢¥é¥¨ï
|
||||
|
||||
if lang eq ru_RU
|
||||
capt db 'info 3ds [user] ¢¥àá¨ï 14.04.25',0 ; ¯®¤¯¨áì ®ª
|
||||
capt db 'info 3ds [user] ¢¥àá¨ï 24.10.25',0 ; ¯®¤¯¨áì ®ª
|
||||
else ; Default to en_US
|
||||
capt db 'info 3ds [user] version 14.04.25',0 ; Window caption
|
||||
capt db 'info 3ds [user] version 24.10.25',0 ; Window caption
|
||||
end if
|
||||
|
||||
align 16
|
||||
i_end:
|
||||
ctx1 rb 28 ;sizeof.TinyGLContext = 28
|
||||
ctx1 TinyGLContext
|
||||
procinfo process_information
|
||||
run_file_70 FileInfoBlock
|
||||
sc system_colors
|
||||
|
||||
@@ -802,7 +802,14 @@ align 4
|
||||
proc draw_3d uses eax ebx ecx edi, o_data:dword
|
||||
mov edi,[o_data]
|
||||
cmp dword[edi+obj_3d.poi_count],2
|
||||
if version_edit eq 0
|
||||
jge @f
|
||||
stdcall [buf2d_clear], buf_ogl, [buf_ogl.color]
|
||||
jmp .end_f
|
||||
@@:
|
||||
else
|
||||
jl .end_f
|
||||
end if
|
||||
stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;®ç¨á⨬ ¡ãä¥à 梥⠨ £«ã¡¨ë
|
||||
call [glPushMatrix]
|
||||
bt dword[draw_mode],bit_light
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
;
|
||||
; ¢ í⮬ ä ©«¥ ᮡà ë äãªæ¨¨ ã¦ë¥ ¤«ï á®§¤ ¨ï ¨
|
||||
; à ¡®âë ®ª á ª®®à¤¨ â ¬¨ ¢¥àè¨
|
||||
; This file contains functions needed to create
|
||||
; and operate a window with vertex coordinates
|
||||
;
|
||||
|
||||
prop_wnd_width equ 340 ;è¨à¨ ®ª ᮠ᢮©á⢠¬¨ ®¡ê¥ªâ
|
||||
prop_wnd_height equ 460 ;¢ëá®â ®ª ᮠ᢮©á⢠¬¨ ®¡ê¥ªâ
|
||||
3d_wnd_l equ 5 ;®âáâ㯠¤«ï tinygl ¡ãä¥à á«¥¢
|
||||
3d_wnd_t equ 23 ;®âáâ㯠¤«ï tinygl ¡ãä¥à ᢥàåã
|
||||
3d_wnd_w equ 320
|
||||
3d_wnd_l equ 5 ;tinygl buffer left indent
|
||||
3d_wnd_t equ 23 ;tinygl buffer top indent
|
||||
3d_wnd_w equ 396
|
||||
3d_wnd_h equ 240
|
||||
SIZE_ONE_FLOAT equ 14
|
||||
MAX_OBJECT_SIZE equ (4+SIZE_ONE_FLOAT*3+1)
|
||||
|
||||
prop_wnd_run db 0 ;¯¥à¥¬¥ ï á«¥¤ïé ï § ⥬ çâ®-¡ë ¥ § ¯ã᪠âì ¡®«ìè¥ 1-£® ®ª ᮠ᢮©á⢠¬¨ ®¤®¢à¥¬¥®
|
||||
align 4
|
||||
fl180 dd 180.0
|
||||
|
||||
prop_wnd_run db 0 ;variable that ensures that no more than 1 window with properties is launched at the same time
|
||||
|
||||
txt_q db '?',0
|
||||
txt_space:
|
||||
@@ -173,20 +174,23 @@ prop_still:
|
||||
jmp .end
|
||||
@@:
|
||||
|
||||
cmp al,1 ;¨§¬. ¯®«®¦¥¨¥ ®ª
|
||||
cmp al,EV_REDRAW
|
||||
jne @f
|
||||
call prop_red_win
|
||||
jmp .end
|
||||
@@:
|
||||
cmp al,2
|
||||
cmp al,EV_KEY
|
||||
jne @f
|
||||
call prop_key
|
||||
jmp .end
|
||||
@@:
|
||||
cmp al,3
|
||||
cmp al,EV_BUTTON
|
||||
jz prop_button
|
||||
cmp al,6
|
||||
cmp al,EV_MOUSE
|
||||
jne @f
|
||||
mcall SF_THREAD_INFO,procinfo,-1
|
||||
cmp ax,word[procinfo.window_stack_position]
|
||||
jne @f ;window is not active
|
||||
call prop_mouse
|
||||
@@:
|
||||
.end:
|
||||
@@ -198,20 +202,65 @@ prop_red_win:
|
||||
pushad
|
||||
mcall SF_REDRAW,SSF_BEGIN_DRAW
|
||||
|
||||
xor eax,eax
|
||||
mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT
|
||||
push eax
|
||||
mcall SF_THREAD_INFO,procinfo,-1
|
||||
cmp dword[procinfo.box.height],0
|
||||
je .resize_end
|
||||
mov eax,[procinfo.box.height]
|
||||
sub eax,[esp]
|
||||
sub eax,[tree3.box_top]
|
||||
sub eax,5
|
||||
cmp eax,48
|
||||
jge @f
|
||||
mov eax,48 ;min size
|
||||
@@:
|
||||
mov dword[tree3.box_height],eax
|
||||
mov word[w_scr_t3.y_size],ax
|
||||
mov ebx,[procinfo.box.width]
|
||||
sub ebx,37
|
||||
cmp ebx,240
|
||||
jge @f
|
||||
mov ebx,240
|
||||
@@:
|
||||
mov [tree3.box_width],ebx
|
||||
add ebx,[tree3.box_left]
|
||||
mov word[w_scr_t3.x_pos],bx
|
||||
;todo: resize scroll slider
|
||||
|
||||
mov eax,[tree3.box_width]
|
||||
add eax,16
|
||||
cmp [buf_ogl.w],eax
|
||||
je .resize_end
|
||||
mov [buf_ogl.w],eax
|
||||
fild dword[buf_ogl.w]
|
||||
fld st0
|
||||
fdiv dword[fl180]
|
||||
fstp dword[angle_dxm]
|
||||
fidiv dword[buf_ogl.h]
|
||||
fstp dword[ratio]
|
||||
stdcall [glViewport], 0,0, [buf_ogl.w], 3d_wnd_h
|
||||
stdcall obj_set_sizes, o3d
|
||||
.resize_end:
|
||||
|
||||
mov edi,dword[capt_p] ;children window caption
|
||||
mov bx,word[procinfo.box.left]
|
||||
add bx,word[buf_0.l]
|
||||
add bx,5 ;è¨à¨ ¡®ª®¢®© à ¬ª¨
|
||||
add bx,5 ;side frame width
|
||||
shl ebx,16
|
||||
mov bx,prop_wnd_width
|
||||
mov bx,word[tree3.box_width]
|
||||
add bx,37
|
||||
mov cx,word[procinfo.box.top]
|
||||
add cx,word[buf_0.t]
|
||||
shl ecx,16
|
||||
mov cx,prop_wnd_height
|
||||
pop eax
|
||||
add eax,[tree3.box_height]
|
||||
add eax,[tree3.box_top]
|
||||
add eax,5
|
||||
mov cx,ax
|
||||
mov edx,[sc.work]
|
||||
or edx,0x33000000
|
||||
int 0x40
|
||||
mcall SF_CREATE_WINDOW
|
||||
|
||||
mov esi,[sc.work_button]
|
||||
mcall SF_DEFINE_BUTTON, (5 shl 16)+20, (266 shl 16)+20, 0x40000003
|
||||
@@ -226,7 +275,7 @@ pushad
|
||||
int 0x40
|
||||
|
||||
mov dword[w_scr_t3.all_redraw],1
|
||||
stdcall [scrollbar_ver_draw],dword w_scr_t3
|
||||
stdcall [scrollbar_v_draw], w_scr_t3
|
||||
stdcall [tl_draw], tree3
|
||||
stdcall [edit_box_draw], edit1
|
||||
stdcall [edit_box_draw], edit2
|
||||
@@ -316,9 +365,9 @@ prop_mouse:
|
||||
mov ebx,3d_wnd_l
|
||||
@@:
|
||||
sub ebx,3d_wnd_l
|
||||
cmp ebx,3d_wnd_w
|
||||
cmp ebx,[buf_ogl.w]
|
||||
jle @f
|
||||
mov ebx,3d_wnd_w
|
||||
mov ebx,[buf_ogl.w]
|
||||
@@:
|
||||
and eax,0xffff ;mouse.y
|
||||
cmp eax,3d_wnd_t
|
||||
@@ -334,14 +383,14 @@ prop_mouse:
|
||||
fild dword[mouse_y]
|
||||
mov [mouse_y],eax
|
||||
fisub dword[mouse_y]
|
||||
fdiv dword[angle_dxm] ;¥á«¨ ªãàá®à ¤¢¨¦¥âáï ¯® ®á¨ y (¢¢¥àå ¨«¨ ¢¨§) â® ¯®¢®à®â ¤¥« ¥¬ ¢®ªà㣠®á¨ x
|
||||
fdiv dword[angle_dym] ;if the cursor moves along the y axis
|
||||
fadd dword[angle_x]
|
||||
fstp dword[angle_x]
|
||||
|
||||
fild dword[mouse_x]
|
||||
mov [mouse_x],ebx
|
||||
fisub dword[mouse_x]
|
||||
fdiv dword[angle_dym] ;¥á«¨ ªãàá®à ¤¢¨¦¥âáï ¯® ®á¨ x (¢¢¥àå ¨«¨ ¢¨§) â® ¯®¢®à®â ¤¥« ¥¬ ¢®ªà㣠®á¨ y
|
||||
fdiv dword[angle_dxm] ;if the cursor moves along the x axis
|
||||
fadd dword[angle_y]
|
||||
fstp dword[angle_y]
|
||||
|
||||
@@ -363,7 +412,7 @@ prop_mouse:
|
||||
cmp ebx,3d_wnd_l
|
||||
jl .end_d
|
||||
sub ebx,3d_wnd_l
|
||||
cmp ebx,3d_wnd_w
|
||||
cmp ebx,[buf_ogl.w]
|
||||
jg .end_d
|
||||
and eax,0xffff ;mouse.y
|
||||
cmp eax,3d_wnd_t
|
||||
@@ -811,7 +860,7 @@ capt_p dd 0
|
||||
|
||||
;¤¥à¥¢® á ®¡ê¥ªâ ¬¨ ¢ ¯®«ì§®¢ ⥫ì᪮¬ ä ©«¥
|
||||
tree3 tree_list MAX_OBJECT_SIZE,3, tl_key_no_edit+tl_list_box_mode,\
|
||||
16,16, 0xffffff,0xb0d0ff,0x400040, 5,290,303,140, 16, 4,0, el_focus,\
|
||||
16,16, 0xffffff,0xb0d0ff,0x10400040, 5,290,380,140, 16, 4,0, el_focus,\
|
||||
w_scr_t3,get_point_coords
|
||||
|
||||
edit1 edit_box 80, 76, 269, 0xffd0d0, 0xff, 0x80ff, 0, 0x8000, 32, string1, mouse_dd, 0
|
||||
|
||||
@@ -204,6 +204,7 @@ ksys_dll_t EXPORTS[] = {
|
||||
{ "strstr", &strstr },
|
||||
{ "strtok", &strtok },
|
||||
{ "strxfrm", &strxfrm },
|
||||
{ "strpbrk", &strpbrk },
|
||||
{ "__errno", &__errno },
|
||||
{ "closedir", &closedir },
|
||||
{ "opendir", &opendir },
|
||||
|
||||
@@ -100,6 +100,10 @@ lib_init: ;//////////////////////////////////////////////////////////////////;;
|
||||
mov [mem.alloc], eax
|
||||
mov [mem.free], ebx
|
||||
mov [mem.realloc], ecx
|
||||
|
||||
cmp [dll.load], edx
|
||||
je .ok
|
||||
|
||||
mov [dll.load], edx
|
||||
|
||||
invoke dll.load, @IMPORT
|
||||
@@ -115,6 +119,7 @@ lib_init: ;//////////////////////////////////////////////////////////////////;;
|
||||
invoke ini.get_str, inifile, sec_proxy, key_password, proxyPassword, 256, proxyPassword
|
||||
popa
|
||||
|
||||
.ok:
|
||||
DEBUGF 1, "HTTP library: init OK\n"
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
@@ -78,6 +78,10 @@ proc lib_init ;///////////////////////////////////////////////////////////////;;
|
||||
mov [mem.alloc], eax
|
||||
mov [mem.free], ebx
|
||||
mov [mem.realloc], ecx
|
||||
|
||||
cmp [dll.load], edx
|
||||
je .ok
|
||||
|
||||
mov [dll.load], edx
|
||||
|
||||
or edx, edx
|
||||
|
||||
@@ -34,21 +34,25 @@ proc libini._.init ;////////////////////////////////////////////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< eax = 1 (fail) / 0 (ok) (library initialization result) ;;
|
||||
;;================================================================================================;;
|
||||
mov [mem.alloc], eax
|
||||
mov [mem.free], ebx
|
||||
mov [mem.realloc], ecx
|
||||
mov [dll.load], edx
|
||||
mov [mem.alloc], eax
|
||||
mov [mem.free], ebx
|
||||
mov [mem.realloc], ecx
|
||||
|
||||
invoke dll.load, @IMPORT
|
||||
or eax, eax
|
||||
jz .ok
|
||||
cmp [dll.load], edx
|
||||
je .ok
|
||||
|
||||
xor eax, eax
|
||||
inc eax
|
||||
ret
|
||||
mov [dll.load], edx
|
||||
|
||||
.ok: xor eax,eax
|
||||
ret
|
||||
invoke dll.load, @IMPORT
|
||||
or eax, eax
|
||||
jz .ok
|
||||
|
||||
xor eax, eax
|
||||
inc eax
|
||||
ret
|
||||
|
||||
.ok: xor eax,eax
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -60,16 +64,16 @@ proc libini._.unget_char _f ;///////////////////////////////////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< --- TBD --- ;;
|
||||
;;================================================================================================;;
|
||||
push eax ecx
|
||||
mov ecx, [_f]
|
||||
inc [ecx + IniFile.cnt]
|
||||
dec esi
|
||||
mov eax, [ecx + IniFile.bsize]
|
||||
cmp [ecx + IniFile.cnt], eax
|
||||
jle @f
|
||||
stdcall libini._.unload_block, [_f]
|
||||
@@: pop ecx eax
|
||||
ret
|
||||
push eax ecx
|
||||
mov ecx, [_f]
|
||||
inc [ecx + IniFile.cnt]
|
||||
dec esi
|
||||
mov eax, [ecx + IniFile.bsize]
|
||||
cmp [ecx + IniFile.cnt], eax
|
||||
jle @f
|
||||
stdcall libini._.unload_block, [_f]
|
||||
@@: pop ecx eax
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -81,13 +85,13 @@ proc libini._.get_char _f ;/////////////////////////////////////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< --- TBD --- ;;
|
||||
;;================================================================================================;;
|
||||
mov ecx, [_f]
|
||||
dec [ecx + IniFile.cnt]
|
||||
jns @f
|
||||
stdcall libini._.preload_block, [_f]
|
||||
dec [ecx + IniFile.cnt]
|
||||
mov ecx, [_f]
|
||||
dec [ecx + IniFile.cnt]
|
||||
jns @f
|
||||
stdcall libini._.preload_block, [_f]
|
||||
dec [ecx + IniFile.cnt]
|
||||
@@: lodsb
|
||||
ret
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -99,22 +103,22 @@ proc libini._.skip_nonblanks _f ;///////////////////////////////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< --- TBD --- ;;
|
||||
;;================================================================================================;;
|
||||
mov ecx, [_f]
|
||||
mov ecx, [_f]
|
||||
@@: stdcall libini._.get_char, [_f]
|
||||
cmp al, 32
|
||||
je @b
|
||||
cmp al, 13
|
||||
je @b
|
||||
cmp al, 10
|
||||
je @b
|
||||
cmp al, 9
|
||||
je @b
|
||||
cmp al, ini.COMMENT_CHAR
|
||||
jne @f
|
||||
stdcall libini._.skip_line, [_f]
|
||||
jmp @b
|
||||
cmp al, 32
|
||||
je @b
|
||||
cmp al, 13
|
||||
je @b
|
||||
cmp al, 10
|
||||
je @b
|
||||
cmp al, 9
|
||||
je @b
|
||||
cmp al, ini.COMMENT_CHAR
|
||||
jne @f
|
||||
stdcall libini._.skip_line, [_f]
|
||||
jmp @b
|
||||
@@: stdcall libini._.unget_char, [_f]
|
||||
ret
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -126,14 +130,14 @@ proc libini._.skip_spaces _f ;//////////////////////////////////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< --- TBD --- ;;
|
||||
;;================================================================================================;;
|
||||
mov ecx, [_f]
|
||||
mov ecx, [_f]
|
||||
@@: stdcall libini._.get_char, [_f]
|
||||
cmp al, 32
|
||||
je @b
|
||||
cmp al, 9
|
||||
je @b
|
||||
cmp al, 32
|
||||
je @b
|
||||
cmp al, 9
|
||||
je @b
|
||||
@@: stdcall libini._.unget_char, [_f]
|
||||
ret
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -145,16 +149,16 @@ proc libini._.skip_line _f ;////////////////////////////////////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< --- TBD --- ;;
|
||||
;;================================================================================================;;
|
||||
mov ecx, [_f]
|
||||
mov ecx, [_f]
|
||||
@@: stdcall libini._.get_char, [_f]
|
||||
or al, al
|
||||
jz @f
|
||||
cmp al, 13
|
||||
je @f
|
||||
cmp al, 10
|
||||
jne @b
|
||||
or al, al
|
||||
jz @f
|
||||
cmp al, 13
|
||||
je @f
|
||||
cmp al, 10
|
||||
jne @b
|
||||
@@: stdcall libini._.unget_char, [_f]
|
||||
ret
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -166,16 +170,16 @@ proc libini._.unload_block _f ;/////////////////////////////////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< --- TBD --- ;;
|
||||
;;================================================================================================;;
|
||||
push eax ebx ecx
|
||||
mov ebx, [_f]
|
||||
mov eax, [ebx + IniFile.pos]
|
||||
add eax, -ini.BLOCK_SIZE
|
||||
invoke file.seek, [ebx + IniFile.fh], eax, SEEK_SET
|
||||
stdcall libini._.preload_block, ebx
|
||||
add esi, eax
|
||||
mov [ebx + IniFile.cnt], 0
|
||||
pop ecx ebx eax
|
||||
ret
|
||||
push eax ebx ecx
|
||||
mov ebx, [_f]
|
||||
mov eax, [ebx + IniFile.pos]
|
||||
add eax, -ini.BLOCK_SIZE
|
||||
invoke file.seek, [ebx + IniFile.fh], eax, SEEK_SET
|
||||
stdcall libini._.preload_block, ebx
|
||||
add esi, eax
|
||||
mov [ebx + IniFile.cnt], 0
|
||||
pop ecx ebx eax
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -187,25 +191,25 @@ proc libini._.preload_block _f ;////////////////////////////////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< --- TBD --- ;;
|
||||
;;================================================================================================;;
|
||||
push eax ebx ecx
|
||||
mov ebx, [_f]
|
||||
@@: mov esi, [ebx + IniFile.buf]
|
||||
push edi
|
||||
mov edi, esi
|
||||
mov ecx, ini.BLOCK_SIZE / 4
|
||||
xor eax, eax
|
||||
rep stosd
|
||||
pop edi
|
||||
invoke file.tell, [ebx + IniFile.fh]
|
||||
mov [ebx + IniFile.pos], eax
|
||||
invoke file.read, [ebx + IniFile.fh], esi, ini.BLOCK_SIZE
|
||||
mov esi,[ebx + IniFile.buf]
|
||||
cmp eax,ini.BLOCK_SIZE
|
||||
jl @f
|
||||
@@: mov [ebx + IniFile.cnt], eax
|
||||
mov [ebx + IniFile.bsize], eax
|
||||
pop ecx ebx eax
|
||||
ret
|
||||
push eax ebx ecx
|
||||
mov ebx, [_f]
|
||||
@@: mov esi, [ebx + IniFile.buf]
|
||||
push edi
|
||||
mov edi, esi
|
||||
mov ecx, ini.BLOCK_SIZE / 4
|
||||
xor eax, eax
|
||||
rep stosd
|
||||
pop edi
|
||||
invoke file.tell, [ebx + IniFile.fh]
|
||||
mov [ebx + IniFile.pos], eax
|
||||
invoke file.read, [ebx + IniFile.fh], esi, ini.BLOCK_SIZE
|
||||
mov esi,[ebx + IniFile.buf]
|
||||
cmp eax,ini.BLOCK_SIZE
|
||||
jl @f
|
||||
@@: mov [ebx + IniFile.cnt], eax
|
||||
mov [ebx + IniFile.bsize], eax
|
||||
pop ecx ebx eax
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -217,18 +221,18 @@ proc libini._.reload_block _f ;/////////////////////////////////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< --- TBD --- ;;
|
||||
;;================================================================================================;;
|
||||
push eax ebx ecx
|
||||
mov ebx, [_f]
|
||||
push [ebx + IniFile.bsize]
|
||||
push esi [ebx + IniFile.cnt]
|
||||
invoke file.seek, [ebx + IniFile.fh], [ebx + IniFile.pos], SEEK_SET
|
||||
stdcall libini._.preload_block, ebx
|
||||
pop [ebx + IniFile.cnt] esi
|
||||
pop eax
|
||||
sub eax,[ebx + IniFile.bsize]
|
||||
sub [ebx + IniFile.cnt], eax
|
||||
pop ecx ebx eax
|
||||
ret
|
||||
push eax ebx ecx
|
||||
mov ebx, [_f]
|
||||
push [ebx + IniFile.bsize]
|
||||
push esi [ebx + IniFile.cnt]
|
||||
invoke file.seek, [ebx + IniFile.fh], [ebx + IniFile.pos], SEEK_SET
|
||||
stdcall libini._.preload_block, ebx
|
||||
pop [ebx + IniFile.cnt] esi
|
||||
pop eax
|
||||
sub eax,[ebx + IniFile.bsize]
|
||||
sub [ebx + IniFile.cnt], eax
|
||||
pop ecx ebx eax
|
||||
ret
|
||||
endp
|
||||
|
||||
; f_info - contains current file block number
|
||||
@@ -249,91 +253,91 @@ locals
|
||||
buf dd ?
|
||||
endl
|
||||
|
||||
xor eax, eax
|
||||
cmp [_delta], 0
|
||||
je .skip
|
||||
xor eax, eax
|
||||
cmp [_delta], 0
|
||||
je .skip
|
||||
|
||||
push ebx ecx
|
||||
invoke mem.alloc, ini.BLOCK_SIZE
|
||||
or eax, eax
|
||||
jz .fail
|
||||
mov [buf], eax
|
||||
push ebx ecx
|
||||
invoke mem.alloc, ini.BLOCK_SIZE
|
||||
or eax, eax
|
||||
jz .fail
|
||||
mov [buf], eax
|
||||
|
||||
cmp [_delta], 0
|
||||
jl .down
|
||||
cmp [_delta], 0
|
||||
jl .down
|
||||
|
||||
mov ebx, [_f]
|
||||
mov ecx, [ebx + IniFile.cnt]
|
||||
mov ebx, [ebx + IniFile.fh]
|
||||
invoke file.tell, ebx
|
||||
sub eax, ecx
|
||||
invoke file.seek, ebx, eax, SEEK_SET
|
||||
@@: invoke file.seek, ebx, [_delta], SEEK_CUR
|
||||
invoke file.eof?, ebx
|
||||
or eax, eax
|
||||
jnz .done
|
||||
invoke file.read, ebx, [buf], ini.BLOCK_SIZE
|
||||
mov ecx, eax
|
||||
mov eax, [_delta]
|
||||
neg eax
|
||||
sub eax, ecx
|
||||
invoke file.seek, ebx, eax, SEEK_CUR
|
||||
push ecx
|
||||
invoke file.write, ebx, [buf], ecx
|
||||
pop ecx
|
||||
cmp eax, ecx
|
||||
jz @b
|
||||
mov ebx, [_f]
|
||||
mov ecx, [ebx + IniFile.cnt]
|
||||
mov ebx, [ebx + IniFile.fh]
|
||||
invoke file.tell, ebx
|
||||
sub eax, ecx
|
||||
invoke file.seek, ebx, eax, SEEK_SET
|
||||
@@: invoke file.seek, ebx, [_delta], SEEK_CUR
|
||||
invoke file.eof?, ebx
|
||||
or eax, eax
|
||||
jnz .done
|
||||
invoke file.read, ebx, [buf], ini.BLOCK_SIZE
|
||||
mov ecx, eax
|
||||
mov eax, [_delta]
|
||||
neg eax
|
||||
sub eax, ecx
|
||||
invoke file.seek, ebx, eax, SEEK_CUR
|
||||
push ecx
|
||||
invoke file.write, ebx, [buf], ecx
|
||||
pop ecx
|
||||
cmp eax, ecx
|
||||
jz @b
|
||||
.fail:
|
||||
or eax, -1
|
||||
pop ecx ebx
|
||||
ret
|
||||
or eax, -1
|
||||
pop ecx ebx
|
||||
ret
|
||||
.done:
|
||||
mov eax, [_delta]
|
||||
neg eax
|
||||
invoke file.seek, ebx, eax, SEEK_CUR
|
||||
invoke file.seteof, ebx
|
||||
stdcall libini._.reload_block, [_f]
|
||||
invoke mem.free, [buf]
|
||||
pop ecx ebx
|
||||
mov eax, [_delta]
|
||||
neg eax
|
||||
invoke file.seek, ebx, eax, SEEK_CUR
|
||||
invoke file.seteof, ebx
|
||||
stdcall libini._.reload_block, [_f]
|
||||
invoke mem.free, [buf]
|
||||
pop ecx ebx
|
||||
.skip:
|
||||
ret
|
||||
ret
|
||||
|
||||
.down:
|
||||
neg [_delta]
|
||||
neg [_delta]
|
||||
|
||||
mov ebx, [_f]
|
||||
mov ecx, [ebx + IniFile.cnt]
|
||||
mov ebx, [ebx + IniFile.fh]
|
||||
invoke file.tell, ebx
|
||||
sub eax, ecx
|
||||
lea edx, [eax - 1]
|
||||
push edx
|
||||
@@: invoke file.seek, ebx, edx, SEEK_SET
|
||||
invoke file.eof?, ebx
|
||||
or eax, eax
|
||||
jnz @f
|
||||
add edx, ini.BLOCK_SIZE
|
||||
jmp @b
|
||||
@@: cmp edx, [esp]
|
||||
je .skip.2
|
||||
add edx, -ini.BLOCK_SIZE
|
||||
cmp edx, [esp]
|
||||
jl @f
|
||||
invoke file.seek, ebx, edx, SEEK_SET
|
||||
invoke file.read, ebx, [buf], ini.BLOCK_SIZE
|
||||
mov ecx, eax
|
||||
mov eax, [_delta]
|
||||
sub eax, ecx
|
||||
invoke file.seek, ebx, eax, SEEK_CUR
|
||||
invoke file.write, ebx, [buf], ecx
|
||||
jmp @b
|
||||
mov ebx, [_f]
|
||||
mov ecx, [ebx + IniFile.cnt]
|
||||
mov ebx, [ebx + IniFile.fh]
|
||||
invoke file.tell, ebx
|
||||
sub eax, ecx
|
||||
lea edx, [eax - 1]
|
||||
push edx
|
||||
@@: invoke file.seek, ebx, edx, SEEK_SET
|
||||
invoke file.eof?, ebx
|
||||
or eax, eax
|
||||
jnz @f
|
||||
add edx, ini.BLOCK_SIZE
|
||||
jmp @b
|
||||
@@: cmp edx, [esp]
|
||||
je .skip.2
|
||||
add edx, -ini.BLOCK_SIZE
|
||||
cmp edx, [esp]
|
||||
jl @f
|
||||
invoke file.seek, ebx, edx, SEEK_SET
|
||||
invoke file.read, ebx, [buf], ini.BLOCK_SIZE
|
||||
mov ecx, eax
|
||||
mov eax, [_delta]
|
||||
sub eax, ecx
|
||||
invoke file.seek, ebx, eax, SEEK_CUR
|
||||
invoke file.write, ebx, [buf], ecx
|
||||
jmp @b
|
||||
@@:
|
||||
.skip.2:
|
||||
add esp, 4
|
||||
stdcall libini._.reload_block, [_f]
|
||||
invoke mem.free, [buf]
|
||||
pop ecx ebx
|
||||
ret
|
||||
add esp, 4
|
||||
stdcall libini._.reload_block, [_f]
|
||||
invoke mem.free, [buf]
|
||||
pop ecx ebx
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -345,25 +349,25 @@ proc libini._.get_value_length _f ;/////////////////////////////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< --- TBD --- ;;
|
||||
;;================================================================================================;;
|
||||
push ebx ecx edx eax
|
||||
mov ebx, [_f]
|
||||
invoke file.tell, [ebx + IniFile.fh]
|
||||
push esi [ebx + IniFile.cnt] [ebx + IniFile.pos]
|
||||
sub eax, [ebx + IniFile.cnt]
|
||||
mov edx, eax
|
||||
push ebx ecx edx eax
|
||||
mov ebx, [_f]
|
||||
invoke file.tell, [ebx + IniFile.fh]
|
||||
push esi [ebx + IniFile.cnt] [ebx + IniFile.pos]
|
||||
sub eax, [ebx + IniFile.cnt]
|
||||
mov edx, eax
|
||||
|
||||
stdcall libini._.skip_line, [_f]
|
||||
invoke file.tell, [ebx + IniFile.fh]
|
||||
sub eax, [ebx + IniFile.cnt]
|
||||
sub eax, edx
|
||||
mov [esp + 4 * 3], eax
|
||||
stdcall libini._.skip_line, [_f]
|
||||
invoke file.tell, [ebx + IniFile.fh]
|
||||
sub eax, [ebx + IniFile.cnt]
|
||||
sub eax, edx
|
||||
mov [esp + 4 * 3], eax
|
||||
|
||||
pop eax
|
||||
invoke file.seek, [ebx + IniFile.fh], eax, SEEK_SET
|
||||
stdcall libini._.preload_block, [_f]
|
||||
pop [ebx + IniFile.cnt] esi
|
||||
pop eax edx ecx ebx
|
||||
ret
|
||||
pop eax
|
||||
invoke file.seek, [ebx + IniFile.fh], eax, SEEK_SET
|
||||
stdcall libini._.preload_block, [_f]
|
||||
pop [ebx + IniFile.cnt] esi
|
||||
pop eax edx ecx ebx
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -376,10 +380,10 @@ proc libini._.string_copy ;/////////////////////////////////////////////////////
|
||||
;< --- TBD --- ;;
|
||||
;;================================================================================================;;
|
||||
@@: lodsb
|
||||
or al, al
|
||||
jz @f
|
||||
stosb
|
||||
jmp @b
|
||||
or al, al
|
||||
jz @f
|
||||
stosb
|
||||
jmp @b
|
||||
@@: ret
|
||||
endp
|
||||
|
||||
@@ -392,26 +396,26 @@ proc libini._.find_next_section _f ;////////////////////////////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< --- TBD --- ;;
|
||||
;;================================================================================================;;
|
||||
push ebx edi
|
||||
push ebx edi
|
||||
|
||||
@@: stdcall libini._.skip_nonblanks, [_f]
|
||||
cmp al, '['
|
||||
je @f
|
||||
or al, al
|
||||
jz .exit_error
|
||||
stdcall libini._.skip_line, [_f]
|
||||
or al, al
|
||||
jz .exit_error
|
||||
jmp @b
|
||||
cmp al, '['
|
||||
je @f
|
||||
or al, al
|
||||
jz .exit_error
|
||||
stdcall libini._.skip_line, [_f]
|
||||
or al, al
|
||||
jz .exit_error
|
||||
jmp @b
|
||||
@@:
|
||||
pop edi ebx
|
||||
xor eax, eax
|
||||
ret
|
||||
pop edi ebx
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
.exit_error:
|
||||
pop edi ebx
|
||||
or eax, -1
|
||||
ret
|
||||
pop edi ebx
|
||||
or eax, -1
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -425,50 +429,50 @@ proc libini._.find_section _f, _sec_name ;//////////////////////////////////////
|
||||
;< eax = -1 (fail) / 0 (ok) ;;
|
||||
;< [_f.pos] = new cursor position (right after ']' char if eax = 0, at the end of file otherwise) ;;
|
||||
;;================================================================================================;;
|
||||
push ebx edi
|
||||
push ebx edi
|
||||
|
||||
mov ecx, [_f]
|
||||
invoke file.seek, [ecx + IniFile.fh], 0, SEEK_SET
|
||||
stdcall libini._.preload_block, [_f]
|
||||
mov ecx, [_f]
|
||||
invoke file.seek, [ecx + IniFile.fh], 0, SEEK_SET
|
||||
stdcall libini._.preload_block, [_f]
|
||||
|
||||
.next_section:
|
||||
stdcall libini._.find_next_section, [_f]
|
||||
or eax, eax
|
||||
jnz .exit_error
|
||||
stdcall libini._.find_next_section, [_f]
|
||||
or eax, eax
|
||||
jnz .exit_error
|
||||
|
||||
stdcall libini._.get_char, [_f]
|
||||
stdcall libini._.skip_spaces, [_f]
|
||||
mov edi, [_sec_name]
|
||||
stdcall libini._.get_char, [_f]
|
||||
stdcall libini._.skip_spaces, [_f]
|
||||
mov edi, [_sec_name]
|
||||
@@: stdcall libini._.get_char, [_f]
|
||||
cmp al, ']'
|
||||
je @f
|
||||
or al, al
|
||||
jz .exit_error
|
||||
cmp al, 13
|
||||
je .next_section
|
||||
cmp al, 10
|
||||
je .next_section
|
||||
scasb
|
||||
je @b
|
||||
cmp byte[edi - 1], 0
|
||||
jne .next_section
|
||||
dec edi
|
||||
stdcall libini._.unget_char, [_f]
|
||||
stdcall libini._.skip_spaces, [_f]
|
||||
stdcall libini._.get_char, [_f]
|
||||
cmp al, ']'
|
||||
jne .next_section
|
||||
cmp al, ']'
|
||||
je @f
|
||||
or al, al
|
||||
jz .exit_error
|
||||
cmp al, 13
|
||||
je .next_section
|
||||
cmp al, 10
|
||||
je .next_section
|
||||
scasb
|
||||
je @b
|
||||
cmp byte[edi - 1], 0
|
||||
jne .next_section
|
||||
dec edi
|
||||
stdcall libini._.unget_char, [_f]
|
||||
stdcall libini._.skip_spaces, [_f]
|
||||
stdcall libini._.get_char, [_f]
|
||||
cmp al, ']'
|
||||
jne .next_section
|
||||
@@:
|
||||
cmp byte[edi], 0
|
||||
jne .next_section
|
||||
pop edi ebx
|
||||
xor eax, eax
|
||||
ret
|
||||
cmp byte[edi], 0
|
||||
jne .next_section
|
||||
pop edi ebx
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
.exit_error:
|
||||
pop edi ebx
|
||||
or eax, -1
|
||||
ret
|
||||
pop edi ebx
|
||||
or eax, -1
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -483,44 +487,44 @@ proc libini._.find_key _f, _key_name ;//////////////////////////////////////////
|
||||
;< [_f.pos] = new cursor position (right after '=' char if eax = 0, at the end of file or right ;;
|
||||
;< before '[' char otherwise) ;;
|
||||
;;================================================================================================;;
|
||||
push ebx edi
|
||||
push ebx edi
|
||||
|
||||
.next_value:
|
||||
mov edi, [_key_name]
|
||||
stdcall libini._.skip_line, [_f]
|
||||
stdcall libini._.skip_nonblanks, [_f]
|
||||
or al, al
|
||||
jz .exit_error
|
||||
cmp al, '['
|
||||
je .exit_error
|
||||
mov edi, [_key_name]
|
||||
stdcall libini._.skip_line, [_f]
|
||||
stdcall libini._.skip_nonblanks, [_f]
|
||||
or al, al
|
||||
jz .exit_error
|
||||
cmp al, '['
|
||||
je .exit_error
|
||||
@@: stdcall libini._.get_char, [_f]
|
||||
or al, al
|
||||
jz .exit_error
|
||||
cmp al, '='
|
||||
je @f
|
||||
scasb
|
||||
je @b
|
||||
cmp byte[edi - 1], 0
|
||||
jne .next_value
|
||||
dec edi
|
||||
stdcall libini._.unget_char, [_f]
|
||||
stdcall libini._.skip_spaces, [_f]
|
||||
stdcall libini._.get_char, [_f]
|
||||
cmp al, '='
|
||||
je @f
|
||||
jmp .next_value
|
||||
or al, al
|
||||
jz .exit_error
|
||||
cmp al, '='
|
||||
je @f
|
||||
scasb
|
||||
je @b
|
||||
cmp byte[edi - 1], 0
|
||||
jne .next_value
|
||||
dec edi
|
||||
stdcall libini._.unget_char, [_f]
|
||||
stdcall libini._.skip_spaces, [_f]
|
||||
stdcall libini._.get_char, [_f]
|
||||
cmp al, '='
|
||||
je @f
|
||||
jmp .next_value
|
||||
@@:
|
||||
cmp byte[edi], 0
|
||||
jne .next_value
|
||||
cmp byte[edi], 0
|
||||
jne .next_value
|
||||
|
||||
pop edi ebx
|
||||
xor eax, eax
|
||||
ret
|
||||
pop edi ebx
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
.exit_error:
|
||||
pop edi ebx
|
||||
or eax, -1
|
||||
ret
|
||||
pop edi ebx
|
||||
or eax, -1
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -532,31 +536,31 @@ proc libini._.low.read_value _f_addr, _buffer, _buf_len ;///////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< --- TBD --- ;;
|
||||
;;================================================================================================;;
|
||||
push edi eax
|
||||
mov edi, [_buffer]
|
||||
stdcall libini._.skip_spaces, [_f_addr]
|
||||
@@: dec [_buf_len]
|
||||
jz @f
|
||||
stdcall libini._.get_char, [_f_addr]
|
||||
cmp al, 13
|
||||
je @f
|
||||
cmp al, 10
|
||||
je @f
|
||||
stosb
|
||||
or al, al
|
||||
jnz @b
|
||||
push edi eax
|
||||
mov edi, [_buffer]
|
||||
stdcall libini._.skip_spaces, [_f_addr]
|
||||
@@: dec [_buf_len]
|
||||
jz @f
|
||||
stdcall libini._.get_char, [_f_addr]
|
||||
cmp al, 13
|
||||
je @f
|
||||
cmp al, 10
|
||||
je @f
|
||||
stosb
|
||||
or al, al
|
||||
jnz @b
|
||||
@@: stdcall libini._.unget_char, [_f_addr]
|
||||
mov byte[edi], 0
|
||||
dec edi
|
||||
@@: cmp edi, [_buffer]
|
||||
jb @f
|
||||
cmp byte[edi], 32
|
||||
ja @f
|
||||
mov byte[edi], 0
|
||||
dec edi
|
||||
jmp @b
|
||||
@@: pop eax edi
|
||||
ret
|
||||
mov byte[edi], 0
|
||||
dec edi
|
||||
@@: cmp edi, [_buffer]
|
||||
jb @f
|
||||
cmp byte[edi], 32
|
||||
ja @f
|
||||
mov byte[edi], 0
|
||||
dec edi
|
||||
jmp @b
|
||||
@@: pop eax edi
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -568,25 +572,25 @@ proc libini._.str_to_int ;//////////////////////////////////////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< eax = binary number representation (no overflow checks made) ;;
|
||||
;;================================================================================================;;
|
||||
push edx
|
||||
push edx
|
||||
|
||||
xor eax, eax
|
||||
xor edx, edx
|
||||
xor eax, eax
|
||||
xor edx, edx
|
||||
|
||||
@@: lodsb
|
||||
cmp al, '0'
|
||||
jb @f
|
||||
cmp al, '9'
|
||||
ja @f
|
||||
add eax, -'0'
|
||||
imul edx, 10
|
||||
add edx, eax
|
||||
jmp @b
|
||||
cmp al, '0'
|
||||
jb @f
|
||||
cmp al, '9'
|
||||
ja @f
|
||||
add eax, -'0'
|
||||
imul edx, 10
|
||||
add edx, eax
|
||||
jmp @b
|
||||
|
||||
@@: dec esi
|
||||
mov eax, edx
|
||||
pop edx
|
||||
ret
|
||||
@@: dec esi
|
||||
mov eax, edx
|
||||
pop edx
|
||||
ret
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -600,29 +604,29 @@ proc libini._.int_to_str ;//////////////////////////////////////////////////////
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< --- TBD --- ;;
|
||||
;;================================================================================================;;
|
||||
push ecx edx
|
||||
push ecx edx
|
||||
|
||||
or eax, eax
|
||||
jns @f
|
||||
mov byte[edi], '-'
|
||||
inc edi
|
||||
@@: call .recurse
|
||||
pop edx ecx
|
||||
ret
|
||||
or eax, eax
|
||||
jns @f
|
||||
mov byte[edi], '-'
|
||||
inc edi
|
||||
@@: call .recurse
|
||||
pop edx ecx
|
||||
ret
|
||||
|
||||
.recurse:
|
||||
cmp eax,ecx
|
||||
jb @f
|
||||
xor edx,edx
|
||||
div ecx
|
||||
push edx
|
||||
call .recurse
|
||||
pop eax
|
||||
@@: cmp al,10
|
||||
sbb al,0x69
|
||||
das
|
||||
stosb
|
||||
retn
|
||||
cmp eax,ecx
|
||||
jb @f
|
||||
xor edx,edx
|
||||
div ecx
|
||||
push edx
|
||||
call .recurse
|
||||
pop eax
|
||||
@@: cmp al,10
|
||||
sbb al,0x69
|
||||
das
|
||||
stosb
|
||||
retn
|
||||
endp
|
||||
|
||||
;;================================================================================================;;
|
||||
@@ -635,50 +639,50 @@ proc libini._.ascii_to_scan ;_ascii_code ;//////////////////////////////////////
|
||||
;< eax = 0 (error) / scancode (success) ;;
|
||||
;;================================================================================================;;
|
||||
; /sys/keymap.key
|
||||
sub esp, 256
|
||||
mov eax, esp
|
||||
push ebx
|
||||
push 'key'
|
||||
push 'map.'
|
||||
push '/key'
|
||||
push '/sys'
|
||||
push eax ; buffer in the stack
|
||||
push 0x100 ; read 0x100 bytes
|
||||
push 0
|
||||
push 0 ; from position zero
|
||||
push 0 ; subfunction: read
|
||||
mov ebx, esp
|
||||
push 70
|
||||
pop eax
|
||||
mcall
|
||||
add esp, 36
|
||||
pop ebx
|
||||
test eax, eax
|
||||
jnz .die
|
||||
mov al, [esp+256+4] ; get ASCII code
|
||||
push edi
|
||||
sub esp, 256
|
||||
mov eax, esp
|
||||
push ebx
|
||||
push 'key'
|
||||
push 'map.'
|
||||
push '/key'
|
||||
push '/sys'
|
||||
push eax ; buffer in the stack
|
||||
push 0x100 ; read 0x100 bytes
|
||||
push 0
|
||||
push 0 ; from position zero
|
||||
push 0 ; subfunction: read
|
||||
mov ebx, esp
|
||||
push 70
|
||||
pop eax
|
||||
mcall
|
||||
add esp, 36
|
||||
pop ebx
|
||||
test eax, eax
|
||||
jnz .die
|
||||
mov al, [esp+256+4] ; get ASCII code
|
||||
push edi
|
||||
; first keytable - no modifiers pressed
|
||||
; check scancodes from 1 to 36h (inclusive)
|
||||
lea edi, [esp+4+1]
|
||||
mov edx, edi
|
||||
mov ecx, 36h
|
||||
repnz scasb
|
||||
jz .found
|
||||
lea edi, [esp+4+1]
|
||||
mov edx, edi
|
||||
mov ecx, 36h
|
||||
repnz scasb
|
||||
jz .found
|
||||
; second keytable - Shift pressed
|
||||
lea edi, [esp+4+128+1]
|
||||
mov edx, edi
|
||||
mov ecx, 36h
|
||||
repnz scasb
|
||||
jz .found
|
||||
pop edi
|
||||
lea edi, [esp+4+128+1]
|
||||
mov edx, edi
|
||||
mov ecx, 36h
|
||||
repnz scasb
|
||||
jz .found
|
||||
pop edi
|
||||
.die:
|
||||
xor eax, eax
|
||||
jmp .ret
|
||||
xor eax, eax
|
||||
jmp .ret
|
||||
.found:
|
||||
mov eax, edi
|
||||
sub eax, edx
|
||||
pop edi
|
||||
mov eax, edi
|
||||
sub eax, edx
|
||||
pop edi
|
||||
.ret:
|
||||
add esp, 256
|
||||
ret 4
|
||||
add esp, 256
|
||||
ret 4
|
||||
endp
|
||||
|
||||
@@ -33,38 +33,39 @@ use_ColorDialog
|
||||
;--------------------------------------------------
|
||||
align 16
|
||||
lib_init:
|
||||
ret
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
;--------------------------------------------------
|
||||
align 16
|
||||
EXPORTS:
|
||||
|
||||
|
||||
dd sz_init, lib_init
|
||||
dd sz_version, 0x00000001
|
||||
dd sz_init, lib_init
|
||||
dd sz_version, 0x00000001
|
||||
|
||||
dd sz_OpenDialog_init, OpenDialog.init
|
||||
dd sz_OpenDialog_start, OpenDialog.start
|
||||
dd sz_OpenDialog_set_file_name, OpenDialog.set_file_name
|
||||
dd sz_OpenDialog_set_file_ext, OpenDialog.set_file_ext
|
||||
dd szVersion_OpenDialog, 0x00010001
|
||||
dd sz_OpenDialog_init, OpenDialog.init
|
||||
dd sz_OpenDialog_start, OpenDialog.start
|
||||
dd sz_OpenDialog_set_file_name, OpenDialog.set_file_name
|
||||
dd sz_OpenDialog_set_file_ext, OpenDialog.set_file_ext
|
||||
dd szVersion_OpenDialog, 0x00010001
|
||||
|
||||
dd sz_ColorDialog_init, ColorDialog.init
|
||||
dd sz_ColorDialog_start, ColorDialog.start
|
||||
dd szVersion_ColorDialog, 0x00010001
|
||||
dd sz_ColorDialog_init, ColorDialog.init
|
||||
dd sz_ColorDialog_start, ColorDialog.start
|
||||
dd szVersion_ColorDialog, 0x00010001
|
||||
|
||||
dd 0,0
|
||||
dd 0,0
|
||||
;-----------------------------------------------------------------------------
|
||||
sz_init db 'lib_init',0
|
||||
sz_version db 'version',0
|
||||
sz_init db 'lib_init',0
|
||||
sz_version db 'version',0
|
||||
|
||||
sz_OpenDialog_init db 'OpenDialog_init',0
|
||||
sz_OpenDialog_start db 'OpenDialog_start',0
|
||||
sz_OpenDialog_set_file_name db 'OpenDialog_set_file_name',0
|
||||
sz_OpenDialog_set_file_ext db 'OpenDialog_set_file_ext',0
|
||||
szVersion_OpenDialog db 'Version_OpenDialog',0
|
||||
sz_OpenDialog_init db 'OpenDialog_init',0
|
||||
sz_OpenDialog_start db 'OpenDialog_start',0
|
||||
sz_OpenDialog_set_file_name db 'OpenDialog_set_file_name',0
|
||||
sz_OpenDialog_set_file_ext db 'OpenDialog_set_file_ext',0
|
||||
szVersion_OpenDialog db 'Version_OpenDialog',0
|
||||
|
||||
sz_ColorDialog_init db 'ColorDialog_init',0
|
||||
sz_ColorDialog_start db 'ColorDialog_start',0
|
||||
szVersion_ColorDialog db 'Version_ColorDialog',0
|
||||
sz_ColorDialog_init db 'ColorDialog_init',0
|
||||
sz_ColorDialog_start db 'ColorDialog_start',0
|
||||
szVersion_ColorDialog db 'Version_ColorDialog',0
|
||||
;-----------------------------------------------------------------------------
|
||||
|
||||
@@ -122,7 +122,13 @@ struc fpcvt
|
||||
.sizeof:
|
||||
}
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; Command flags
|
||||
|
||||
CMD_WITHOUT_PARAM = 1b ; command may be called without parameters
|
||||
CMD_WITH_PARAM = 10b ; command may be called with parameters
|
||||
CMD_WITHOUT_LOADED_APP = 100b ; command may be called without loaded program
|
||||
CMD_WITH_LOADED_APP = 1000b ; command may be called with loaded program
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; Entry point
|
||||
@@ -449,63 +455,56 @@ z1:
|
||||
mov esi, commands
|
||||
call find_cmd
|
||||
mov eax, aUnknownCommand
|
||||
jc .x11
|
||||
|
||||
; check command requirements
|
||||
; flags field:
|
||||
; &1: command may be called without parameters
|
||||
; &2: command may be called with parameters
|
||||
; &4: command may be called without loaded program
|
||||
; &8: command may be called with loaded program
|
||||
jc .cmd_procg
|
||||
mov eax, [esi+8]
|
||||
mov ecx, [curarg]
|
||||
cmp byte [ecx], 0
|
||||
jz .noargs
|
||||
test byte [esi+16], 2
|
||||
jz .x11
|
||||
test byte [esi+16], CMD_WITH_PARAM
|
||||
jz .cmd_procg
|
||||
jmp @f
|
||||
|
||||
.noargs:
|
||||
test byte [esi+16], 1
|
||||
jz .x11
|
||||
test byte [esi+16], CMD_WITHOUT_PARAM
|
||||
jz .cmd_procg
|
||||
|
||||
@@:
|
||||
cmp [debuggee_pid], 0
|
||||
jz .nodebuggee
|
||||
mov eax, aAlreadyLoaded
|
||||
test byte [esi+16], 8
|
||||
jz .x11
|
||||
jmp .x9
|
||||
test byte [esi+16], CMD_WITH_LOADED_APP
|
||||
jz .cmd_procg
|
||||
jmp .run_cmd
|
||||
|
||||
.nodebuggee:
|
||||
mov eax, need_debuggee
|
||||
test byte [esi+16], 4
|
||||
jnz .x9
|
||||
test byte [esi+16], CMD_WITHOUT_LOADED_APP
|
||||
jnz .run_cmd
|
||||
|
||||
.x11:
|
||||
.cmd_procg:
|
||||
xchg esi, eax
|
||||
call put_message
|
||||
|
||||
; store cmdline for repeating
|
||||
.x10:
|
||||
.cmd_procg_no_put_msg:
|
||||
mov esi, cmdline
|
||||
mov ecx, [cmdline_len]
|
||||
|
||||
@@:
|
||||
cmp ecx, 0
|
||||
jle .we
|
||||
jle .wait_event
|
||||
mov al, [esi + ecx]
|
||||
mov [cmdline_prev + ecx], al
|
||||
dec ecx
|
||||
jmp @b
|
||||
|
||||
.we:
|
||||
.wait_event:
|
||||
mov [cmdline_len], 0
|
||||
jmp waitevent
|
||||
|
||||
.x9:
|
||||
.run_cmd:
|
||||
call dword [esi+4]
|
||||
jmp .x10
|
||||
jmp .cmd_procg_no_put_msg
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; Cmdline handling
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
COLOR_THEME fix MOVIEOS
|
||||
|
||||
format binary as ""
|
||||
|
||||
include '../../macros.inc'
|
||||
include '../../KOSfuncs.inc'
|
||||
|
||||
use32
|
||||
db 'MENUET01'
|
||||
dd 1
|
||||
@@ -1145,6 +1148,105 @@ OnDump:
|
||||
.ret:
|
||||
ret
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; Print Backtrace
|
||||
|
||||
struct STACK_FRAME
|
||||
prev_frame rd 1
|
||||
ret_addr rd 1
|
||||
ends
|
||||
|
||||
OnBacktrace:
|
||||
push ebp
|
||||
|
||||
; Set max depth counter
|
||||
xor eax, eax
|
||||
dec eax
|
||||
|
||||
mov esi, [curarg]
|
||||
cmp byte [esi], 0
|
||||
jz .save_depth
|
||||
|
||||
call get_hex_number
|
||||
mov esi, aParseError
|
||||
jc .exit
|
||||
|
||||
; If depth 0
|
||||
test eax, eax
|
||||
jz .done
|
||||
|
||||
.save_depth:
|
||||
mov [bt_depth], eax
|
||||
|
||||
; Get start frame addres
|
||||
mov ebp, [_ebp]
|
||||
test ebp, ebp
|
||||
jz .done
|
||||
|
||||
mov edi, stack_frame_dump
|
||||
|
||||
.next:
|
||||
mcall SF_DEBUG, SSF_READ_MEMORY, [debuggee_pid], sizeof.STACK_FRAME, ebp
|
||||
cmp eax, -1
|
||||
mov esi, read_mem_err
|
||||
jz .exit
|
||||
|
||||
; The address of the previous frame must be less than the current one
|
||||
mov eax, [edi + STACK_FRAME.prev_frame]
|
||||
test eax, eax
|
||||
jz .done
|
||||
|
||||
; Save stack_frame_dump
|
||||
push edi
|
||||
; Save previous frame
|
||||
push ebp
|
||||
; Save return address
|
||||
mov eax, [edi + STACK_FRAME.ret_addr]
|
||||
push eax
|
||||
|
||||
; Print frame address and return address
|
||||
push eax ; pop in put_message_nodraw
|
||||
push ebp ; pop in put_message_nodraw
|
||||
mov esi, aBacktraceFmt
|
||||
call put_message_nodraw
|
||||
|
||||
; Restore return address
|
||||
pop eax
|
||||
|
||||
; Find symbol by return address
|
||||
call find_near_symbol
|
||||
test esi, esi
|
||||
jnz .print_sym
|
||||
|
||||
mov esi, aBacktraceSymStub
|
||||
|
||||
.print_sym:
|
||||
call put_message_nodraw
|
||||
mov esi, newline
|
||||
call put_message_nodraw
|
||||
|
||||
; Restore previous frame
|
||||
pop ebp
|
||||
; Restore stack_frame_dump
|
||||
pop edi
|
||||
|
||||
; The address of the previous frame must be greater than the current one.
|
||||
cmp [edi + STACK_FRAME.prev_frame], ebp
|
||||
jna .done
|
||||
|
||||
; Set previous frame
|
||||
mov ebp, [edi + STACK_FRAME.prev_frame]
|
||||
dec [bt_depth]
|
||||
jnz .next
|
||||
|
||||
.done:
|
||||
mov esi, newline
|
||||
|
||||
.exit:
|
||||
call put_message
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; Dissassemble block of executable event
|
||||
|
||||
@@ -1864,7 +1966,7 @@ include 'disasm.inc'
|
||||
|
||||
caption_str db 'Kolibri Debugger',0
|
||||
|
||||
begin_str db 'Kolibri Debugger, version 0.35',10
|
||||
begin_str db 'Kolibri Debugger, version 0.36',10
|
||||
db 'Hint: type "help" for help, "quit" to quit'
|
||||
newline db 10,0
|
||||
prompt db '> ',0
|
||||
@@ -1880,66 +1982,88 @@ help_groups:
|
||||
;-----------------------------------------------------------------------------
|
||||
; Commands format definitions
|
||||
|
||||
; TODO: make it with macros
|
||||
|
||||
; flags field:
|
||||
; &1: command may be called without parameters
|
||||
; &2: command may be called with parameters
|
||||
; &4: command may be called without loaded program
|
||||
; &8: command may be called with loaded program
|
||||
commands:
|
||||
dd _aH, OnHelp, HelpSyntax, HelpHelp
|
||||
db 0Fh
|
||||
db CMD_WITHOUT_PARAM or CMD_WITH_PARAM or CMD_WITHOUT_LOADED_APP or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aHelp, OnHelp, HelpSyntax, HelpHelp
|
||||
db 0Fh
|
||||
db CMD_WITHOUT_PARAM or CMD_WITH_PARAM or CMD_WITHOUT_LOADED_APP or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aQuit, OnQuit, QuitSyntax, QuitHelp
|
||||
db 0Dh
|
||||
db CMD_WITHOUT_PARAM or CMD_WITHOUT_LOADED_APP or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aLoad, OnLoad, LoadSyntax, LoadHelp
|
||||
db 6
|
||||
db CMD_WITH_PARAM or CMD_WITHOUT_LOADED_APP
|
||||
|
||||
dd aReload, OnReload, ReloadSyntax, ReloadHelp
|
||||
db 0Dh
|
||||
db CMD_WITHOUT_PARAM or CMD_WITHOUT_LOADED_APP or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aTerminate, OnTerminate, TerminateSyntax, TerminateHelp
|
||||
db 9
|
||||
db CMD_WITHOUT_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aDetach, OnDetach, DetachSyntax, DetachHelp
|
||||
db 9
|
||||
db CMD_WITHOUT_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aSuspend, OnSuspend, SuspendSyntax, SuspendHelp
|
||||
db 9
|
||||
db CMD_WITHOUT_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aResume, OnResume, ResumeSyntax, ResumeHelp
|
||||
db 0Bh
|
||||
db CMD_WITHOUT_PARAM or CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aStep, OnStepMultiple, StepSyntax, StepHelp
|
||||
db 0Bh
|
||||
db CMD_WITHOUT_PARAM or CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aProceed, OnProceedMultiple, ProceedSyntax, ProceedHelp
|
||||
db 0Bh
|
||||
db CMD_WITHOUT_PARAM or CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aCalc, OnCalc, CalcSyntax, CalcHelp
|
||||
db 0Eh
|
||||
db CMD_WITH_PARAM or CMD_WITHOUT_LOADED_APP or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aDump, OnDump, DumpSyntax, DumpHelp
|
||||
db 0Bh
|
||||
db CMD_WITHOUT_PARAM or CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aBacktrace, OnBacktrace, BacktraceSyntax, BacktraceHelp
|
||||
db CMD_WITHOUT_PARAM or CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aUnassemble, OnUnassemble, UnassembleSyntax, UnassembleHelp
|
||||
db 0Bh
|
||||
db CMD_WITHOUT_PARAM or CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aBp, OnBp, BpSyntax, BpHelp
|
||||
db 0Ah
|
||||
db CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aBpm, OnBpmb, BpmSyntax, BpmHelp
|
||||
db 0Ah
|
||||
db CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aBpmb, OnBpmb, BpmSyntax, BpmHelp
|
||||
db 0Ah
|
||||
db CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aBpmw, OnBpmw, BpmSyntax, BpmHelp
|
||||
db 0Ah
|
||||
db CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aBpmd, OnBpmd, BpmSyntax, BpmHelp
|
||||
db 0Ah
|
||||
db CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aBl, OnBl, BlSyntax, BlHelp
|
||||
db 0Bh
|
||||
db CMD_WITHOUT_PARAM or CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aBc, OnBc, BcSyntax, BcHelp
|
||||
db 0Ah
|
||||
db CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aBd, OnBd, BdSyntax, BdHelp
|
||||
db 0Ah
|
||||
db CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aBe, OnBe, BeSyntax, BeHelp
|
||||
db 0Ah
|
||||
db CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aReg, OnReg, RSyntax, RHelp
|
||||
db 0Ah
|
||||
db CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aUnpack, OnUnpack, UnpackSyntax, UnpackHelp
|
||||
db 9
|
||||
db CMD_WITHOUT_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd aLoadSymbols, OnLoadSymbols, LoadSymbolsSyntax, LoadSymbolsHelp
|
||||
db 0Ah
|
||||
db CMD_WITH_PARAM or CMD_WITH_LOADED_APP
|
||||
|
||||
dd 0
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
@@ -1980,7 +2104,8 @@ help_data_msg db 'List of data commands:',10
|
||||
db 'd [<expression>] - dump data at given address',10
|
||||
db 'u [<expression>] - unassemble instructions at given address',10
|
||||
db 'r <register> <expression> or',10
|
||||
db 'r <register>=<expression> - set register value',10,0
|
||||
db 'r <register>=<expression> - set register value',10
|
||||
db 'bt [<number>] - display backtrace / stacktrace',10,0
|
||||
|
||||
; Breakpoints commands group
|
||||
|
||||
@@ -2038,6 +2163,11 @@ DumpHelp db 'Dump data of debugged program',10
|
||||
DumpSyntax db 'Usage: d <expression> - dump data at specified address',10
|
||||
db ' or: d - continue current dump',10,0
|
||||
|
||||
aBacktrace db 3,'bt',0
|
||||
BacktraceHelp db 'Display backtrace / stacktrace',10
|
||||
BacktraceSyntax db 'Usage: bt <number> - display backtrace with depth',10
|
||||
db ' or: bt display all backtrace',10,0
|
||||
|
||||
aCalc db 2,'?',0
|
||||
CalcHelp db 'Calculate value of expression',10
|
||||
CalcSyntax db 'Usage: ? <expression>',10,0
|
||||
@@ -2102,6 +2232,11 @@ LoadSymbolsSyntax db 'Usage: load-symbols <symbols-file-name>',10,0
|
||||
|
||||
aUnknownCommand db 'Unknown command',10,0
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; Info messages
|
||||
aBacktraceSymStub db '??',0
|
||||
aBacktraceFmt db '[0x%8X] 0x%8X in ',0
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; Error messages
|
||||
|
||||
@@ -2474,11 +2609,13 @@ disasm_cur_pos dd ?
|
||||
disasm_cur_str dd ?
|
||||
disasm_string rb 256
|
||||
|
||||
thread_info process_information
|
||||
stack_frame_dump rb sizeof.STACK_FRAME
|
||||
bt_depth rd 1
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
; Coordinates and sizes for GUI
|
||||
|
||||
thread_info process_information
|
||||
data_x_size_dd dd ?, ?
|
||||
messages_x_size_dd dd ?, ?
|
||||
registers_x_pos_dd dd ?, ?
|
||||
|
||||
@@ -4,6 +4,11 @@
|
||||
|
||||
include 'sort.inc'
|
||||
|
||||
struct DEBUG_SYMBOL
|
||||
addr rd 1
|
||||
string rd 0
|
||||
ends
|
||||
|
||||
; compare proc for sorter
|
||||
compare:
|
||||
cmpsd
|
||||
@@ -459,4 +464,69 @@ find_symbol_name:
|
||||
|
||||
@@:
|
||||
pop esi
|
||||
ret
|
||||
ret
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
;
|
||||
; Find the nearest symol using binary search
|
||||
;
|
||||
; in: eax - target addres
|
||||
; out: esi - symbol name
|
||||
; destroys: ebx, ecx, edx, edi, ebp
|
||||
;
|
||||
find_near_symbol:
|
||||
mov edi, [symbols]
|
||||
|
||||
xor esi, esi ; Result
|
||||
mov ecx, esi ; Left
|
||||
mov edx, [num_symbols] ; Right
|
||||
dec edx
|
||||
js .end
|
||||
|
||||
; If the first address is already greater than the target
|
||||
mov ebp, [edi + ecx * sizeof.DEBUG_SYMBOL]
|
||||
cmp [ebp + DEBUG_SYMBOL.addr], eax
|
||||
ja .end
|
||||
|
||||
; If the last address is less than or equal to the target
|
||||
mov ebp, [edi + edx * sizeof.DEBUG_SYMBOL]
|
||||
cmp [ebp + DEBUG_SYMBOL.addr], eax
|
||||
jbe .found
|
||||
|
||||
.loop:
|
||||
cmp ecx, edx
|
||||
ja .end
|
||||
|
||||
; Calc middle:
|
||||
mov ebx, edx ; Middle
|
||||
sub ebx, ecx ; (right - left)
|
||||
shr ebx, 1 ; / 2
|
||||
add ebx, ecx ; + left
|
||||
|
||||
; Equal
|
||||
mov ebp, [edi + ebx * sizeof.DEBUG_SYMBOL]
|
||||
cmp [ebp + DEBUG_SYMBOL.addr], eax
|
||||
jz .found
|
||||
jb .update_left
|
||||
|
||||
; Update right
|
||||
mov edx, ebx
|
||||
dec edx
|
||||
jmp .loop
|
||||
|
||||
.update_left:
|
||||
; Save potential result
|
||||
mov esi, ebp
|
||||
add esi, DEBUG_SYMBOL.string
|
||||
|
||||
; Update left
|
||||
mov ecx, ebx
|
||||
inc ecx
|
||||
jmp .loop
|
||||
|
||||
.found:
|
||||
mov esi, ebp
|
||||
add esi, DEBUG_SYMBOL.string
|
||||
|
||||
.end:
|
||||
ret
|
||||
|
||||
1
programs/develop/oberon07
Submodule
1
programs/develop/oberon07
Submodule
Submodule programs/develop/oberon07 added at 07f0da001b
Binary file not shown.
@@ -1,25 +0,0 @@
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2023, Anton Krotov
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
@@ -1,61 +0,0 @@
|
||||
Условная компиляция
|
||||
|
||||
синтаксис:
|
||||
|
||||
$IF "(" ident {"|" ident} ")"
|
||||
<...>
|
||||
{$ELSIF "(" ident {"|" ident} ")"}
|
||||
<...>
|
||||
[$ELSE]
|
||||
<...>
|
||||
$END
|
||||
|
||||
где ident:
|
||||
- одно из возможных значений параметра <target> в командной строке
|
||||
- пользовательский идентификатор, переданный с ключом -def при компиляции
|
||||
- один из возможных предопределенных идентификаторов:
|
||||
|
||||
WINDOWS - приложение Windows
|
||||
LINUX - приложение Linux
|
||||
KOLIBRIOS - приложение KolibriOS
|
||||
CPU_X86 - приложение для процессора x86 (32-бит)
|
||||
CPU_X8664 - приложение для процессора x86_64
|
||||
|
||||
|
||||
примеры:
|
||||
|
||||
$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 (debug) (* -def debug *)
|
||||
print("debug");
|
||||
$END
|
||||
|
||||
|
||||
$IF (WINDOWS)
|
||||
$IF (CPU_X86)
|
||||
(*windows 32*)
|
||||
|
||||
$ELSIF (CPU_X8664)
|
||||
(*windows 64*)
|
||||
|
||||
$END
|
||||
$ELSIF (LINUX)
|
||||
$IF (CPU_X86)
|
||||
(*linux 32*)
|
||||
|
||||
$ELSIF (CPU_X8664)
|
||||
(*linux 64*)
|
||||
|
||||
$END
|
||||
$END
|
||||
@@ -1,566 +0,0 @@
|
||||
==============================================================================
|
||||
|
||||
Библиотека (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
|
||||
------------------------------------------------------------------------------
|
||||
Binary file not shown.
@@ -1,423 +0,0 @@
|
||||
Компилятор языка программирования 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 Мб)
|
||||
-tab <width> размер табуляции (используется для вычисления координат в
|
||||
исходном коде), по умолчанию - 4
|
||||
-nochk <"ptibcwra"> отключить проверки при выполнении (см. ниже)
|
||||
-lower разрешить ключевые слова и встроенные идентификаторы в
|
||||
нижнем регистре (по умолчанию)
|
||||
-upper только верхний регистр для ключевых слов и встроенных
|
||||
идентификаторов
|
||||
-def <имя> задать символ условной компиляции
|
||||
-ver <major.minor> версия программы (только для kosdll)
|
||||
-uses вывести список импортированных модулей
|
||||
|
||||
параметр -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. Добавлена операция конкатенации строковых и символьных констант
|
||||
13. Возможен импорт модулей с указанием пути и имени файла
|
||||
14. Добавлен специальный синтаксис для условной компиляции (см. CC.txt)
|
||||
15. Имя процедуры в конце объявления (после END) необязательно
|
||||
16. Разрешено использовать нижний регистр для ключевых слов
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Особенности реализации
|
||||
|
||||
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. Максимальная длина идентификаторов - 255 символов
|
||||
3. Максимальная длина строковых констант - 511 символов (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 VAL(v: любой тип; T): T
|
||||
v - переменная;
|
||||
интерпретирует v, как переменную типа T
|
||||
|
||||
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],
|
||||
[cdecl], [fastcall], [ccall], [windows], [linux], [oberon]. Например:
|
||||
|
||||
PROCEDURE [ccall] MyProc (x, y, z: INTEGER): INTEGER;
|
||||
|
||||
Если указан флаг [ccall], то принимается соглашение cdecl, но перед
|
||||
вызовом указатель стэка будет выравнен по границе 16 байт.
|
||||
Флаг [windows] - синоним для [stdcall], [linux] - синоним для [ccall].
|
||||
Знак "-" после имени флага ([stdcall-], [linux-], ...) означает, что
|
||||
результат процедуры можно игнорировать (не допускается для типа REAL).
|
||||
Если флаг не указан или указан флаг [oberon], то принимается внутреннее
|
||||
соглашение о вызове.
|
||||
|
||||
При объявлении типов-записей, после ключевого слова RECORD может быть
|
||||
указан флаг [noalign]. Флаг [noalign] означает отсутствие выравнивания полей
|
||||
записи. Записи с системным флагом не могут иметь базовый тип и не могут быть
|
||||
базовыми типами для других записей.
|
||||
Для использования системных флагов, требуется импортировать SYSTEM.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Оператор CASE
|
||||
|
||||
Синтаксис оператора CASE:
|
||||
|
||||
CaseStatement =
|
||||
CASE Expression OF Case {"|" Case}
|
||||
[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 с 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
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Импорт модулей с указанием пути и имени файла
|
||||
|
||||
Примеры:
|
||||
|
||||
IMPORT Math IN "./lib/math.ob07"; (* относительно текущего модуля *)
|
||||
|
||||
IMPORT M1 IN "C:\lib\math.ob07"; (* абсолютный путь *)
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Импортированные процедуры
|
||||
|
||||
Синтаксис импорта:
|
||||
|
||||
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 импортировать процедуры можно только из библиотек, размещенных
|
||||
в /sys/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.
|
||||
@@ -1,290 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018, 2020-2022, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE API;
|
||||
|
||||
IMPORT SYSTEM, K := KOSAPI;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
eol* = 0DX + 0AX;
|
||||
BIT_DEPTH* = 32;
|
||||
|
||||
MAX_SIZE = 16 * 400H;
|
||||
HEAP_SIZE = 1 * 100000H;
|
||||
|
||||
_new = 1;
|
||||
_dispose = 2;
|
||||
|
||||
SizeOfHeader = 36;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
CRITICAL_SECTION = ARRAY 2 OF INTEGER;
|
||||
|
||||
|
||||
VAR
|
||||
|
||||
heap, endheap: INTEGER;
|
||||
pockets: ARRAY MAX_SIZE DIV 32 + 1 OF INTEGER;
|
||||
|
||||
CriticalSection: CRITICAL_SECTION;
|
||||
|
||||
multi: BOOLEAN;
|
||||
|
||||
base*: INTEGER;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] zeromem* (dwords: INTEGER; adr: INTEGER);
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
0FCH, (* cld *)
|
||||
031H, 0C0H, (* xor eax, eax *)
|
||||
057H, (* push edi *)
|
||||
08BH, 07DH, 00CH, (* mov edi, dword [ebp + 12] *)
|
||||
08BH, 04DH, 008H, (* mov ecx, dword [ebp + 8] *)
|
||||
0F3H, 0ABH, (* rep stosd *)
|
||||
05FH (* pop edi *)
|
||||
)
|
||||
END zeromem;
|
||||
|
||||
|
||||
PROCEDURE mem_commit* (adr, size: INTEGER);
|
||||
VAR
|
||||
tmp: INTEGER;
|
||||
BEGIN
|
||||
FOR tmp := adr TO adr + size - 1 BY 4096 DO
|
||||
SYSTEM.PUT(tmp, 0)
|
||||
END
|
||||
END mem_commit;
|
||||
|
||||
|
||||
PROCEDURE switch_task;
|
||||
BEGIN
|
||||
K.sysfunc2(68, 1)
|
||||
END switch_task;
|
||||
|
||||
|
||||
PROCEDURE futex_create (ptr: INTEGER): INTEGER;
|
||||
RETURN K.sysfunc3(77, 0, ptr)
|
||||
END futex_create;
|
||||
|
||||
|
||||
PROCEDURE futex_wait (futex, value, timeout: INTEGER);
|
||||
BEGIN
|
||||
K.sysfunc5(77, 2, futex, value, timeout)
|
||||
END futex_wait;
|
||||
|
||||
|
||||
PROCEDURE futex_wake (futex, number: INTEGER);
|
||||
BEGIN
|
||||
K.sysfunc4(77, 3, futex, number)
|
||||
END futex_wake;
|
||||
|
||||
|
||||
PROCEDURE EnterCriticalSection* (VAR CriticalSection: CRITICAL_SECTION);
|
||||
BEGIN
|
||||
switch_task;
|
||||
futex_wait(CriticalSection[0], 1, 10000);
|
||||
CriticalSection[1] := 1
|
||||
END EnterCriticalSection;
|
||||
|
||||
|
||||
PROCEDURE LeaveCriticalSection* (VAR CriticalSection: CRITICAL_SECTION);
|
||||
BEGIN
|
||||
CriticalSection[1] := 0;
|
||||
futex_wake(CriticalSection[0], 1)
|
||||
END LeaveCriticalSection;
|
||||
|
||||
|
||||
PROCEDURE InitializeCriticalSection* (VAR CriticalSection: CRITICAL_SECTION);
|
||||
BEGIN
|
||||
CriticalSection[0] := futex_create(SYSTEM.ADR(CriticalSection[1]));
|
||||
CriticalSection[1] := 0
|
||||
END InitializeCriticalSection;
|
||||
|
||||
|
||||
PROCEDURE __NEW (size: INTEGER): INTEGER;
|
||||
VAR
|
||||
res, idx, temp: INTEGER;
|
||||
BEGIN
|
||||
IF size <= MAX_SIZE THEN
|
||||
idx := ASR(size, 5);
|
||||
res := pockets[idx];
|
||||
IF res # 0 THEN
|
||||
SYSTEM.GET(res, pockets[idx]);
|
||||
SYSTEM.PUT(res, size);
|
||||
INC(res, 4)
|
||||
ELSE
|
||||
temp := 0;
|
||||
IF heap + size >= endheap THEN
|
||||
IF K.sysfunc2(18, 16) > ASR(HEAP_SIZE, 10) THEN
|
||||
temp := K.sysfunc3(68, 12, HEAP_SIZE)
|
||||
ELSE
|
||||
temp := 0
|
||||
END;
|
||||
IF temp # 0 THEN
|
||||
mem_commit(temp, HEAP_SIZE);
|
||||
heap := temp;
|
||||
endheap := heap + HEAP_SIZE
|
||||
ELSE
|
||||
temp := -1
|
||||
END
|
||||
END;
|
||||
IF (heap # 0) & (temp # -1) THEN
|
||||
SYSTEM.PUT(heap, size);
|
||||
res := heap + 4;
|
||||
heap := heap + size
|
||||
ELSE
|
||||
res := 0
|
||||
END
|
||||
END
|
||||
ELSE
|
||||
IF K.sysfunc2(18, 16) > ASR(size, 10) THEN
|
||||
res := K.sysfunc3(68, 12, size);
|
||||
IF res # 0 THEN
|
||||
mem_commit(res, size);
|
||||
SYSTEM.PUT(res, size);
|
||||
INC(res, 4)
|
||||
END
|
||||
ELSE
|
||||
res := 0
|
||||
END
|
||||
END;
|
||||
IF (res # 0) & (size <= MAX_SIZE) THEN
|
||||
zeromem(ASR(size, 2) - 1, res)
|
||||
END
|
||||
RETURN res
|
||||
END __NEW;
|
||||
|
||||
|
||||
PROCEDURE __DISPOSE (ptr: INTEGER): INTEGER;
|
||||
VAR
|
||||
size, idx: INTEGER;
|
||||
BEGIN
|
||||
DEC(ptr, 4);
|
||||
SYSTEM.GET(ptr, size);
|
||||
IF size <= MAX_SIZE THEN
|
||||
idx := ASR(size, 5);
|
||||
SYSTEM.PUT(ptr, pockets[idx]);
|
||||
pockets[idx] := ptr
|
||||
ELSE
|
||||
size := K.sysfunc3(68, 13, ptr)
|
||||
END
|
||||
RETURN 0
|
||||
END __DISPOSE;
|
||||
|
||||
|
||||
PROCEDURE NEW_DISPOSE (func, arg: INTEGER): INTEGER;
|
||||
VAR
|
||||
res: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF multi THEN
|
||||
EnterCriticalSection(CriticalSection)
|
||||
END;
|
||||
|
||||
IF func = _new THEN
|
||||
res := __NEW(arg)
|
||||
ELSIF func = _dispose THEN
|
||||
res := __DISPOSE(arg)
|
||||
END;
|
||||
|
||||
IF multi THEN
|
||||
LeaveCriticalSection(CriticalSection)
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END NEW_DISPOSE;
|
||||
|
||||
|
||||
PROCEDURE _NEW* (size: INTEGER): INTEGER;
|
||||
RETURN NEW_DISPOSE(_new, size)
|
||||
END _NEW;
|
||||
|
||||
|
||||
PROCEDURE _DISPOSE* (ptr: INTEGER): INTEGER;
|
||||
RETURN NEW_DISPOSE(_dispose, ptr)
|
||||
END _DISPOSE;
|
||||
|
||||
|
||||
PROCEDURE exit* (p1: INTEGER);
|
||||
BEGIN
|
||||
K.sysfunc1(-1)
|
||||
END exit;
|
||||
|
||||
|
||||
PROCEDURE exit_thread* (p1: INTEGER);
|
||||
BEGIN
|
||||
K.sysfunc1(-1)
|
||||
END exit_thread;
|
||||
|
||||
|
||||
PROCEDURE OutStr (pchar: INTEGER);
|
||||
VAR
|
||||
c: CHAR;
|
||||
BEGIN
|
||||
IF pchar # 0 THEN
|
||||
REPEAT
|
||||
SYSTEM.GET(pchar, c);
|
||||
IF c # 0X THEN
|
||||
K.OutChar(c)
|
||||
END;
|
||||
INC(pchar)
|
||||
UNTIL c = 0X
|
||||
END
|
||||
END OutStr;
|
||||
|
||||
|
||||
PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER);
|
||||
BEGIN
|
||||
IF lpCaption # 0 THEN
|
||||
K.OutLn;
|
||||
OutStr(lpCaption);
|
||||
K.OutChar(":");
|
||||
K.OutLn
|
||||
END;
|
||||
OutStr(lpText);
|
||||
IF lpCaption # 0 THEN
|
||||
K.OutLn
|
||||
END
|
||||
END DebugMsg;
|
||||
|
||||
|
||||
PROCEDURE init* (import_, code: INTEGER);
|
||||
BEGIN
|
||||
multi := FALSE;
|
||||
base := code - SizeOfHeader;
|
||||
K.sysfunc2(68, 11);
|
||||
InitializeCriticalSection(CriticalSection);
|
||||
K._init(import_)
|
||||
END init;
|
||||
|
||||
|
||||
PROCEDURE SetMultiThr* (value: BOOLEAN);
|
||||
BEGIN
|
||||
multi := value
|
||||
END SetMultiThr;
|
||||
|
||||
|
||||
PROCEDURE GetTickCount* (): INTEGER;
|
||||
RETURN K.sysfunc2(26, 9) * 10
|
||||
END GetTickCount;
|
||||
|
||||
|
||||
PROCEDURE dllentry* (hinstDLL, fdwReason, lpvReserved: INTEGER): INTEGER;
|
||||
RETURN 0
|
||||
END dllentry;
|
||||
|
||||
|
||||
PROCEDURE sofinit*;
|
||||
END sofinit;
|
||||
|
||||
|
||||
END API.
|
||||
@@ -1,100 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE Args;
|
||||
|
||||
IMPORT sys := SYSTEM, KOSAPI;
|
||||
|
||||
CONST
|
||||
|
||||
MAX_PARAM = 1024;
|
||||
|
||||
VAR
|
||||
|
||||
Params: ARRAY MAX_PARAM, 2 OF INTEGER;
|
||||
argc*: INTEGER;
|
||||
|
||||
PROCEDURE GetChar(adr: INTEGER): CHAR;
|
||||
VAR res: CHAR;
|
||||
BEGIN
|
||||
sys.GET(adr, res)
|
||||
RETURN res
|
||||
END GetChar;
|
||||
|
||||
PROCEDURE ParamParse;
|
||||
VAR p, count, name: INTEGER; c: CHAR; cond: INTEGER;
|
||||
|
||||
PROCEDURE ChangeCond(A, B, C: INTEGER; c: CHAR; VAR cond: INTEGER);
|
||||
BEGIN
|
||||
IF (c <= 20X) & (c # 0X) THEN
|
||||
cond := A
|
||||
ELSIF c = 22X THEN
|
||||
cond := B
|
||||
ELSIF c = 0X THEN
|
||||
cond := 6
|
||||
ELSE
|
||||
cond := C
|
||||
END
|
||||
END ChangeCond;
|
||||
|
||||
BEGIN
|
||||
p := KOSAPI.GetCommandLine();
|
||||
name := KOSAPI.GetName();
|
||||
Params[0, 0] := name;
|
||||
WHILE GetChar(name) # 0X DO
|
||||
INC(name)
|
||||
END;
|
||||
Params[0, 1] := name - 1;
|
||||
cond := 0;
|
||||
count := 1;
|
||||
WHILE (argc < MAX_PARAM) & (cond # 6) DO
|
||||
c := GetChar(p);
|
||||
CASE cond OF
|
||||
|0: ChangeCond(0, 4, 1, c, cond); IF cond = 1 THEN Params[count, 0] := p END
|
||||
|1: ChangeCond(0, 3, 1, c, cond); IF cond IN {0, 6} THEN Params[count, 1] := p - 1; INC(count) END
|
||||
|3: ChangeCond(3, 1, 3, c, cond); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
|
||||
|4: ChangeCond(5, 0, 5, c, cond); IF cond = 5 THEN Params[count, 0] := p END
|
||||
|5: ChangeCond(5, 1, 5, c, cond); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
|
||||
ELSE
|
||||
END;
|
||||
INC(p)
|
||||
END;
|
||||
argc := count
|
||||
END ParamParse;
|
||||
|
||||
PROCEDURE GetArg*(n: INTEGER; VAR s: ARRAY OF CHAR);
|
||||
VAR i, j, len: INTEGER; c: CHAR;
|
||||
BEGIN
|
||||
j := 0;
|
||||
IF n < argc THEN
|
||||
len := LEN(s) - 1;
|
||||
i := Params[n, 0];
|
||||
WHILE (j < len) & (i <= Params[n, 1]) DO
|
||||
c := GetChar(i);
|
||||
IF c # 22X THEN
|
||||
s[j] := c;
|
||||
INC(j)
|
||||
END;
|
||||
INC(i);
|
||||
END;
|
||||
END;
|
||||
s[j] := 0X
|
||||
END GetArg;
|
||||
|
||||
BEGIN
|
||||
ParamParse
|
||||
END Args.
|
||||
@@ -1,105 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018, 2020, 2022 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE ColorDlg;
|
||||
|
||||
IMPORT sys := SYSTEM, KOSAPI;
|
||||
|
||||
TYPE
|
||||
|
||||
DRAW_WINDOW = PROCEDURE;
|
||||
|
||||
TDialog = RECORD
|
||||
_type,
|
||||
procinfo,
|
||||
com_area_name,
|
||||
com_area,
|
||||
start_path: INTEGER;
|
||||
draw_window: DRAW_WINDOW;
|
||||
status*,
|
||||
X, Y,
|
||||
color_type,
|
||||
color*: INTEGER;
|
||||
|
||||
procinf: ARRAY 1024 OF CHAR;
|
||||
s_com_area_name: ARRAY 32 OF CHAR
|
||||
END;
|
||||
|
||||
Dialog* = POINTER TO TDialog;
|
||||
|
||||
VAR
|
||||
|
||||
Dialog_start, Dialog_init: PROCEDURE [stdcall] (cd: Dialog);
|
||||
|
||||
PROCEDURE Show*(cd: Dialog);
|
||||
BEGIN
|
||||
IF cd # NIL THEN
|
||||
cd.X := 0;
|
||||
cd.Y := 0;
|
||||
Dialog_start(cd)
|
||||
END
|
||||
END Show;
|
||||
|
||||
PROCEDURE Create*(draw_window: DRAW_WINDOW): Dialog;
|
||||
VAR res: Dialog;
|
||||
BEGIN
|
||||
NEW(res);
|
||||
IF res # NIL THEN
|
||||
res.s_com_area_name := "FFFFFFFF_color_dlg";
|
||||
res.com_area := 0;
|
||||
res._type := 0;
|
||||
res.color_type := 0;
|
||||
res.procinfo := sys.ADR(res.procinf[0]);
|
||||
res.com_area_name := sys.ADR(res.s_com_area_name[0]);
|
||||
res.start_path := sys.SADR("/sys/colrdial");
|
||||
res.draw_window := draw_window;
|
||||
res.status := 0;
|
||||
res.X := 0;
|
||||
res.Y := 0;
|
||||
res.color := 0;
|
||||
Dialog_init(res)
|
||||
END
|
||||
RETURN res
|
||||
END Create;
|
||||
|
||||
PROCEDURE Destroy*(VAR cd: Dialog);
|
||||
BEGIN
|
||||
IF cd # NIL THEN
|
||||
DISPOSE(cd)
|
||||
END
|
||||
END Destroy;
|
||||
|
||||
PROCEDURE Load;
|
||||
VAR Lib: INTEGER;
|
||||
|
||||
PROCEDURE GetProc(Lib, v: INTEGER; name: ARRAY OF CHAR);
|
||||
VAR a: INTEGER;
|
||||
BEGIN
|
||||
a := KOSAPI.GetProcAdr(name, Lib);
|
||||
ASSERT(a # 0);
|
||||
sys.PUT(v, a)
|
||||
END GetProc;
|
||||
|
||||
BEGIN
|
||||
Lib := KOSAPI.LoadLib("/sys/Lib/Proc_lib.obj");
|
||||
GetProc(Lib, sys.ADR(Dialog_init), "ColorDialog_init");
|
||||
GetProc(Lib, sys.ADR(Dialog_start), "ColorDialog_start");
|
||||
END Load;
|
||||
|
||||
BEGIN
|
||||
Load
|
||||
END ColorDlg.
|
||||
@@ -1,94 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE Console;
|
||||
|
||||
IMPORT ConsoleLib, In, Out;
|
||||
|
||||
|
||||
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 SetCursor* (X, Y: INTEGER);
|
||||
BEGIN
|
||||
ConsoleLib.set_cursor_pos(X, Y)
|
||||
END SetCursor;
|
||||
|
||||
|
||||
PROCEDURE GetCursor* (VAR X, Y: INTEGER);
|
||||
BEGIN
|
||||
ConsoleLib.get_cursor_pos(X, Y)
|
||||
END GetCursor;
|
||||
|
||||
|
||||
PROCEDURE Cls*;
|
||||
BEGIN
|
||||
ConsoleLib.cls
|
||||
END Cls;
|
||||
|
||||
|
||||
PROCEDURE SetColor* (FColor, BColor: INTEGER);
|
||||
VAR
|
||||
res: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF (FColor IN {0..15}) & (BColor IN {0..15}) THEN
|
||||
res := ConsoleLib.set_flags(LSL(BColor, 4) + FColor)
|
||||
END
|
||||
END SetColor;
|
||||
|
||||
|
||||
PROCEDURE GetCursorX* (): INTEGER;
|
||||
VAR
|
||||
x, y: INTEGER;
|
||||
|
||||
BEGIN
|
||||
ConsoleLib.get_cursor_pos(x, y)
|
||||
RETURN x
|
||||
END GetCursorX;
|
||||
|
||||
|
||||
PROCEDURE GetCursorY* (): INTEGER;
|
||||
VAR
|
||||
x, y: INTEGER;
|
||||
|
||||
BEGIN
|
||||
ConsoleLib.get_cursor_pos(x, y)
|
||||
RETURN y
|
||||
END GetCursorY;
|
||||
|
||||
|
||||
PROCEDURE open*;
|
||||
BEGIN
|
||||
ConsoleLib.open(-1, -1, -1, -1, "");
|
||||
In.Open;
|
||||
Out.Open
|
||||
END open;
|
||||
|
||||
|
||||
PROCEDURE exit* (bCloseWindow: BOOLEAN);
|
||||
BEGIN
|
||||
ConsoleLib.exit(bCloseWindow)
|
||||
END exit;
|
||||
|
||||
|
||||
END Console.
|
||||
@@ -1,103 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018, 2022 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE ConsoleLib;
|
||||
|
||||
IMPORT sys := SYSTEM, KOSAPI;
|
||||
|
||||
CONST
|
||||
|
||||
COLOR_BLUE* = 001H;
|
||||
COLOR_GREEN* = 002H;
|
||||
COLOR_RED* = 004H;
|
||||
COLOR_BRIGHT* = 008H;
|
||||
BGR_BLUE* = 010H;
|
||||
BGR_GREEN* = 020H;
|
||||
BGR_RED* = 040H;
|
||||
BGR_BRIGHT* = 080H;
|
||||
IGNORE_SPECIALS* = 100H;
|
||||
WINDOW_CLOSED* = 200H;
|
||||
|
||||
TYPE
|
||||
|
||||
gets2_callback* = PROCEDURE [stdcall] (keycode: INTEGER; pstr: INTEGER; VAR n, pos: INTEGER);
|
||||
|
||||
VAR
|
||||
|
||||
version* : INTEGER;
|
||||
init* : PROCEDURE [stdcall] (wnd_width, wnd_height, scr_width, scr_height, title: INTEGER);
|
||||
exit* : PROCEDURE [stdcall] (bCloseWindow: BOOLEAN);
|
||||
write_asciiz* : PROCEDURE [stdcall] (string: INTEGER);
|
||||
write_string* : PROCEDURE [stdcall] (string, length: INTEGER);
|
||||
get_flags* : PROCEDURE [stdcall] (): INTEGER;
|
||||
set_flags* : PROCEDURE [stdcall] (new_flags: INTEGER): INTEGER;
|
||||
get_font_height* : PROCEDURE [stdcall] (): INTEGER;
|
||||
get_cursor_height* : PROCEDURE [stdcall] (): INTEGER;
|
||||
set_cursor_height* : PROCEDURE [stdcall] (new_height: INTEGER): INTEGER;
|
||||
getch* : PROCEDURE [stdcall] (): INTEGER;
|
||||
getch2* : PROCEDURE [stdcall] (): INTEGER;
|
||||
kbhit* : PROCEDURE [stdcall] (): INTEGER;
|
||||
gets* : PROCEDURE [stdcall] (str, n: INTEGER): INTEGER;
|
||||
gets2* : PROCEDURE [stdcall] (callback: gets2_callback; str, n: INTEGER): INTEGER;
|
||||
cls* : PROCEDURE [stdcall] ();
|
||||
get_cursor_pos* : PROCEDURE [stdcall] (VAR x, y: INTEGER);
|
||||
set_cursor_pos* : PROCEDURE [stdcall] (x, y: INTEGER);
|
||||
set_title* : PROCEDURE [stdcall] (title: INTEGER);
|
||||
|
||||
PROCEDURE open*(wnd_width, wnd_height, scr_width, scr_height: INTEGER; title: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
init(wnd_width, wnd_height, scr_width, scr_height, sys.ADR(title[0]))
|
||||
END open;
|
||||
|
||||
PROCEDURE main;
|
||||
VAR Lib: INTEGER;
|
||||
|
||||
PROCEDURE GetProc(Lib, v: INTEGER; name: ARRAY OF CHAR);
|
||||
VAR a: INTEGER;
|
||||
BEGIN
|
||||
a := KOSAPI.GetProcAdr(name, Lib);
|
||||
ASSERT(a # 0);
|
||||
sys.PUT(v, a)
|
||||
END GetProc;
|
||||
|
||||
BEGIN
|
||||
Lib := KOSAPI.LoadLib("/sys/lib/Console.obj");
|
||||
ASSERT(Lib # 0);
|
||||
GetProc(Lib, sys.ADR(version), "version");
|
||||
GetProc(Lib, sys.ADR(init), "con_init");
|
||||
GetProc(Lib, sys.ADR(exit), "con_exit");
|
||||
GetProc(Lib, sys.ADR(write_asciiz), "con_write_asciiz");
|
||||
GetProc(Lib, sys.ADR(write_string), "con_write_string");
|
||||
GetProc(Lib, sys.ADR(get_flags), "con_get_flags");
|
||||
GetProc(Lib, sys.ADR(set_flags), "con_set_flags");
|
||||
GetProc(Lib, sys.ADR(get_font_height), "con_get_font_height");
|
||||
GetProc(Lib, sys.ADR(get_cursor_height), "con_get_cursor_height");
|
||||
GetProc(Lib, sys.ADR(set_cursor_height), "con_set_cursor_height");
|
||||
GetProc(Lib, sys.ADR(getch), "con_getch");
|
||||
GetProc(Lib, sys.ADR(getch2), "con_getch2");
|
||||
GetProc(Lib, sys.ADR(kbhit), "con_kbhit");
|
||||
GetProc(Lib, sys.ADR(gets), "con_gets");
|
||||
GetProc(Lib, sys.ADR(gets2), "con_gets2");
|
||||
GetProc(Lib, sys.ADR(cls), "con_cls");
|
||||
GetProc(Lib, sys.ADR(get_cursor_pos), "con_get_cursor_pos");
|
||||
GetProc(Lib, sys.ADR(set_cursor_pos), "con_set_cursor_pos");
|
||||
GetProc(Lib, sys.ADR(set_title), "con_set_title");
|
||||
END main;
|
||||
|
||||
BEGIN
|
||||
main
|
||||
END ConsoleLib.
|
||||
@@ -1,141 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE DateTime;
|
||||
|
||||
IMPORT KOSAPI;
|
||||
|
||||
CONST ERR* = -7.0E5;
|
||||
|
||||
PROCEDURE Encode*(Year, Month, Day, Hour, Min, Sec: INTEGER): REAL;
|
||||
VAR d, i: INTEGER; M: ARRAY 14 OF CHAR; Res: REAL;
|
||||
BEGIN
|
||||
Res := ERR;
|
||||
IF (Year >= 1) & (Year <= 9999) & (Month >= 1) & (Month <= 12) &
|
||||
(Day >= 1) & (Day <= 31) & (Hour >= 0) & (Hour <= 23) &
|
||||
(Min >= 0) & (Min <= 59) & (Sec >= 0) & (Sec <= 59) THEN
|
||||
M := "_303232332323";
|
||||
IF (Year MOD 4 = 0) & (Year MOD 100 # 0) OR (Year MOD 400 = 0) THEN
|
||||
M[2] := "1"
|
||||
END;
|
||||
IF Day <= ORD(M[Month]) - ORD("0") + 28 THEN
|
||||
DEC(Year);
|
||||
d := Year * 365 + (Year DIV 4) - (Year DIV 100) + (Year DIV 400) + Day - 693594;
|
||||
FOR i := 1 TO Month - 1 DO
|
||||
d := d + ORD(M[i]) - ORD("0") + 28
|
||||
END;
|
||||
Res := FLT(d) + FLT(Hour * 3600000 + Min * 60000 + Sec * 1000) / 86400000.0
|
||||
END
|
||||
END
|
||||
RETURN Res
|
||||
END Encode;
|
||||
|
||||
PROCEDURE Decode*(Date: REAL; VAR Year, Month, Day, Hour, Min, Sec: INTEGER): BOOLEAN;
|
||||
VAR Res, flag: BOOLEAN; d, t, i: INTEGER; M: ARRAY 14 OF CHAR;
|
||||
|
||||
PROCEDURE MonthDay(n: INTEGER; VAR d, Month: INTEGER; M: ARRAY OF CHAR): BOOLEAN;
|
||||
VAR Res: BOOLEAN;
|
||||
BEGIN
|
||||
Res := FALSE;
|
||||
IF d > ORD(M[n]) - ORD("0") + 28 THEN
|
||||
d := d - ORD(M[n]) + ORD("0") - 28;
|
||||
INC(Month);
|
||||
Res := TRUE
|
||||
END
|
||||
RETURN Res
|
||||
END MonthDay;
|
||||
|
||||
BEGIN
|
||||
IF (Date >= -693593.0) & (Date < 2958466.0) THEN
|
||||
d := FLOOR(Date);
|
||||
t := FLOOR((Date - FLT(d)) * 86400000.0);
|
||||
d := d + 693593;
|
||||
Year := 1;
|
||||
Month := 1;
|
||||
WHILE d > 0 DO
|
||||
d := d - 365 - ORD((Year MOD 4 = 0) & (Year MOD 100 # 0) OR (Year MOD 400 = 0));
|
||||
INC(Year)
|
||||
END;
|
||||
IF d < 0 THEN
|
||||
DEC(Year);
|
||||
d := d + 365 + ORD((Year MOD 4 = 0) & (Year MOD 100 # 0) OR (Year MOD 400 = 0))
|
||||
END;
|
||||
INC(d);
|
||||
M := "_303232332323";
|
||||
IF (Year MOD 4 = 0) & (Year MOD 100 # 0) OR (Year MOD 400 = 0) THEN
|
||||
M[2] := "1"
|
||||
END;
|
||||
i := 1;
|
||||
flag := TRUE;
|
||||
WHILE flag & (i <= 12) DO
|
||||
flag := MonthDay(i, d, Month, M);
|
||||
INC(i)
|
||||
END;
|
||||
Day := d;
|
||||
Hour := t DIV 3600000;
|
||||
t := t MOD 3600000;
|
||||
Min := t DIV 60000;
|
||||
t := t MOD 60000;
|
||||
Sec := t DIV 1000;
|
||||
Res := TRUE
|
||||
ELSE
|
||||
Res := FALSE
|
||||
END
|
||||
RETURN Res
|
||||
END Decode;
|
||||
|
||||
PROCEDURE Now*(VAR Year, Month, Day, Hour, Min, Sec, Msec: INTEGER);
|
||||
VAR date, time: INTEGER;
|
||||
BEGIN
|
||||
date := KOSAPI.sysfunc1(29);
|
||||
time := KOSAPI.sysfunc1(3);
|
||||
|
||||
Year := date MOD 16;
|
||||
date := date DIV 16;
|
||||
Year := (date MOD 16) * 10 + Year;
|
||||
date := date DIV 16;
|
||||
|
||||
Month := date MOD 16;
|
||||
date := date DIV 16;
|
||||
Month := (date MOD 16) * 10 + Month;
|
||||
date := date DIV 16;
|
||||
|
||||
Day := date MOD 16;
|
||||
date := date DIV 16;
|
||||
Day := (date MOD 16) * 10 + Day;
|
||||
date := date DIV 16;
|
||||
|
||||
Hour := time MOD 16;
|
||||
time := time DIV 16;
|
||||
Hour := (time MOD 16) * 10 + Hour;
|
||||
time := time DIV 16;
|
||||
|
||||
Min := time MOD 16;
|
||||
time := time DIV 16;
|
||||
Min := (time MOD 16) * 10 + Min;
|
||||
time := time DIV 16;
|
||||
|
||||
Sec := time MOD 16;
|
||||
time := time DIV 16;
|
||||
Sec := (time MOD 16) * 10 + Sec;
|
||||
time := time DIV 16;
|
||||
|
||||
Year := Year + 2000;
|
||||
Msec := 0
|
||||
END Now;
|
||||
|
||||
END DateTime.
|
||||
@@ -1,292 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018, 2022 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE Debug;
|
||||
|
||||
IMPORT KOSAPI, sys := SYSTEM;
|
||||
|
||||
CONST
|
||||
|
||||
d = 1.0 - 5.0E-12;
|
||||
|
||||
VAR
|
||||
|
||||
Realp: PROCEDURE (x: REAL; width: INTEGER);
|
||||
|
||||
PROCEDURE Char*(c: CHAR);
|
||||
VAR res: INTEGER;
|
||||
BEGIN
|
||||
res := KOSAPI.sysfunc3(63, 1, ORD(c))
|
||||
END Char;
|
||||
|
||||
PROCEDURE String*(s: ARRAY OF CHAR);
|
||||
VAR n, i: INTEGER;
|
||||
BEGIN
|
||||
n := LENGTH(s);
|
||||
FOR i := 0 TO n - 1 DO
|
||||
Char(s[i])
|
||||
END
|
||||
END String;
|
||||
|
||||
PROCEDURE WriteInt(x, n: INTEGER);
|
||||
VAR i: INTEGER; a: ARRAY 16 OF CHAR; neg: BOOLEAN;
|
||||
BEGIN
|
||||
i := 0;
|
||||
IF n < 1 THEN
|
||||
n := 1
|
||||
END;
|
||||
IF x < 0 THEN
|
||||
x := -x;
|
||||
DEC(n);
|
||||
neg := TRUE
|
||||
END;
|
||||
REPEAT
|
||||
a[i] := CHR(x MOD 10 + ORD("0"));
|
||||
x := x DIV 10;
|
||||
INC(i)
|
||||
UNTIL x = 0;
|
||||
WHILE n > i DO
|
||||
Char(" ");
|
||||
DEC(n)
|
||||
END;
|
||||
IF neg THEN
|
||||
Char("-")
|
||||
END;
|
||||
REPEAT
|
||||
DEC(i);
|
||||
Char(a[i])
|
||||
UNTIL i = 0
|
||||
END WriteInt;
|
||||
|
||||
PROCEDURE IsNan(AValue: REAL): BOOLEAN;
|
||||
VAR h, l: SET;
|
||||
BEGIN
|
||||
sys.GET(sys.ADR(AValue), l);
|
||||
sys.GET(sys.ADR(AValue) + 4, h)
|
||||
RETURN (h * {20..30} = {20..30}) & ((h * {0..19} # {}) OR (l * {0..31} # {}))
|
||||
END IsNan;
|
||||
|
||||
PROCEDURE IsInf(x: REAL): BOOLEAN;
|
||||
RETURN ABS(x) = sys.INF()
|
||||
END IsInf;
|
||||
|
||||
PROCEDURE Int*(x, width: INTEGER);
|
||||
VAR i: INTEGER;
|
||||
BEGIN
|
||||
IF x # 80000000H THEN
|
||||
WriteInt(x, width)
|
||||
ELSE
|
||||
FOR i := 12 TO width DO
|
||||
Char(20X)
|
||||
END;
|
||||
String("-2147483648")
|
||||
END
|
||||
END Int;
|
||||
|
||||
PROCEDURE OutInf(x: REAL; width: INTEGER);
|
||||
VAR s: ARRAY 5 OF CHAR; i: INTEGER;
|
||||
BEGIN
|
||||
IF IsNan(x) THEN
|
||||
s := "Nan";
|
||||
INC(width)
|
||||
ELSIF IsInf(x) & (x > 0.0) THEN
|
||||
s := "+Inf"
|
||||
ELSIF IsInf(x) & (x < 0.0) THEN
|
||||
s := "-Inf"
|
||||
END;
|
||||
FOR i := 1 TO width - 4 DO
|
||||
Char(" ")
|
||||
END;
|
||||
String(s)
|
||||
END OutInf;
|
||||
|
||||
PROCEDURE Ln*;
|
||||
BEGIN
|
||||
Char(0DX);
|
||||
Char(0AX)
|
||||
END Ln;
|
||||
|
||||
PROCEDURE _FixReal(x: REAL; width, p: INTEGER);
|
||||
VAR e, len, i: INTEGER; y: REAL; minus: BOOLEAN;
|
||||
BEGIN
|
||||
IF IsNan(x) OR IsInf(x) THEN
|
||||
OutInf(x, width)
|
||||
ELSIF p < 0 THEN
|
||||
Realp(x, width)
|
||||
ELSE
|
||||
len := 0;
|
||||
minus := FALSE;
|
||||
IF x < 0.0 THEN
|
||||
minus := TRUE;
|
||||
INC(len);
|
||||
x := ABS(x)
|
||||
END;
|
||||
e := 0;
|
||||
WHILE x >= 10.0 DO
|
||||
x := x / 10.0;
|
||||
INC(e)
|
||||
END;
|
||||
IF e >= 0 THEN
|
||||
len := len + e + p + 1;
|
||||
IF x > 9.0 + d THEN
|
||||
INC(len)
|
||||
END;
|
||||
IF p > 0 THEN
|
||||
INC(len)
|
||||
END
|
||||
ELSE
|
||||
len := len + p + 2
|
||||
END;
|
||||
FOR i := 1 TO width - len DO
|
||||
Char(" ")
|
||||
END;
|
||||
IF minus THEN
|
||||
Char("-")
|
||||
END;
|
||||
y := x;
|
||||
WHILE (y < 1.0) & (y # 0.0) DO
|
||||
y := y * 10.0;
|
||||
DEC(e)
|
||||
END;
|
||||
IF e < 0 THEN
|
||||
IF x - FLT(FLOOR(x)) > d THEN
|
||||
Char("1");
|
||||
x := 0.0
|
||||
ELSE
|
||||
Char("0");
|
||||
x := x * 10.0
|
||||
END
|
||||
ELSE
|
||||
WHILE e >= 0 DO
|
||||
IF x - FLT(FLOOR(x)) > d THEN
|
||||
IF x > 9.0 THEN
|
||||
String("10")
|
||||
ELSE
|
||||
Char(CHR(FLOOR(x) + ORD("0") + 1))
|
||||
END;
|
||||
x := 0.0
|
||||
ELSE
|
||||
Char(CHR(FLOOR(x) + ORD("0")));
|
||||
x := (x - FLT(FLOOR(x))) * 10.0
|
||||
END;
|
||||
DEC(e)
|
||||
END
|
||||
END;
|
||||
IF p > 0 THEN
|
||||
Char(".")
|
||||
END;
|
||||
WHILE p > 0 DO
|
||||
IF x - FLT(FLOOR(x)) > d THEN
|
||||
Char(CHR(FLOOR(x) + ORD("0") + 1));
|
||||
x := 0.0
|
||||
ELSE
|
||||
Char(CHR(FLOOR(x) + ORD("0")));
|
||||
x := (x - FLT(FLOOR(x))) * 10.0
|
||||
END;
|
||||
DEC(p)
|
||||
END
|
||||
END
|
||||
END _FixReal;
|
||||
|
||||
PROCEDURE Real*(x: REAL; width: INTEGER);
|
||||
VAR e, n, i: INTEGER; minus: BOOLEAN;
|
||||
BEGIN
|
||||
IF IsNan(x) OR IsInf(x) THEN
|
||||
OutInf(x, width)
|
||||
ELSE
|
||||
e := 0;
|
||||
n := 0;
|
||||
IF width > 23 THEN
|
||||
n := width - 23;
|
||||
width := 23
|
||||
ELSIF width < 9 THEN
|
||||
width := 9
|
||||
END;
|
||||
width := width - 5;
|
||||
IF x < 0.0 THEN
|
||||
x := -x;
|
||||
minus := TRUE
|
||||
ELSE
|
||||
minus := FALSE
|
||||
END;
|
||||
WHILE x >= 10.0 DO
|
||||
x := x / 10.0;
|
||||
INC(e)
|
||||
END;
|
||||
WHILE (x < 1.0) & (x # 0.0) DO
|
||||
x := x * 10.0;
|
||||
DEC(e)
|
||||
END;
|
||||
IF x > 9.0 + d THEN
|
||||
x := 1.0;
|
||||
INC(e)
|
||||
END;
|
||||
FOR i := 1 TO n DO
|
||||
Char(" ")
|
||||
END;
|
||||
IF minus THEN
|
||||
x := -x
|
||||
END;
|
||||
Realp := Real;
|
||||
_FixReal(x, width, width - 3);
|
||||
Char("E");
|
||||
IF e >= 0 THEN
|
||||
Char("+")
|
||||
ELSE
|
||||
Char("-");
|
||||
e := ABS(e)
|
||||
END;
|
||||
IF e < 100 THEN
|
||||
Char("0")
|
||||
END;
|
||||
IF e < 10 THEN
|
||||
Char("0")
|
||||
END;
|
||||
Int(e, 0)
|
||||
END
|
||||
END Real;
|
||||
|
||||
PROCEDURE FixReal*(x: REAL; width, p: INTEGER);
|
||||
BEGIN
|
||||
Realp := Real;
|
||||
_FixReal(x, width, p)
|
||||
END FixReal;
|
||||
|
||||
PROCEDURE Open*;
|
||||
TYPE
|
||||
|
||||
info_struct = RECORD
|
||||
subfunc: INTEGER;
|
||||
flags: INTEGER;
|
||||
param: INTEGER;
|
||||
rsrvd1: INTEGER;
|
||||
rsrvd2: INTEGER;
|
||||
fname: ARRAY 1024 OF CHAR
|
||||
END;
|
||||
|
||||
VAR info: info_struct; res: INTEGER;
|
||||
BEGIN
|
||||
info.subfunc := 7;
|
||||
info.flags := 0;
|
||||
info.param := sys.SADR(" ");
|
||||
info.rsrvd1 := 0;
|
||||
info.rsrvd2 := 0;
|
||||
info.fname := "/sys/develop/board";
|
||||
res := KOSAPI.sysfunc2(70, sys.ADR(info))
|
||||
END Open;
|
||||
|
||||
END Debug.
|
||||
@@ -1,330 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018, 2021 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE File;
|
||||
|
||||
IMPORT sys := SYSTEM, KOSAPI;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
SEEK_BEG* = 0; SEEK_CUR* = 1; SEEK_END* = 2;
|
||||
|
||||
|
||||
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;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] f_68_27 (file_name: INTEGER; VAR size: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
sys.CODE(
|
||||
053H, (* push ebx *)
|
||||
06AH, 044H, (* push 68 *)
|
||||
058H, (* pop eax *)
|
||||
06AH, 01BH, (* push 27 *)
|
||||
05BH, (* pop ebx *)
|
||||
08BH, 04DH, 008H, (* mov ecx, dword [ebp + 8] *)
|
||||
0CDH, 040H, (* int 64 *)
|
||||
08BH, 04DH, 00CH, (* mov ecx, dword [ebp + 12] *)
|
||||
089H, 011H, (* mov dword [ecx], edx *)
|
||||
05BH, (* pop ebx *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 008H, 000H (* ret 8 *)
|
||||
)
|
||||
RETURN 0
|
||||
END f_68_27;
|
||||
|
||||
|
||||
PROCEDURE Load* (FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER;
|
||||
RETURN f_68_27(sys.ADR(FName[0]), size)
|
||||
END Load;
|
||||
|
||||
|
||||
PROCEDURE GetFileInfo* (FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN;
|
||||
VAR
|
||||
res2: INTEGER; fs: rFS;
|
||||
|
||||
BEGIN
|
||||
fs.subfunc := 5;
|
||||
fs.pos := 0;
|
||||
fs.hpos := 0;
|
||||
fs.bytes := 0;
|
||||
fs.buffer := sys.ADR(Info);
|
||||
COPY(FName, fs.name)
|
||||
|
||||
RETURN KOSAPI.sysfunc22(70, sys.ADR(fs), res2) = 0
|
||||
END GetFileInfo;
|
||||
|
||||
|
||||
PROCEDURE FileSize* (FName: ARRAY OF CHAR): INTEGER;
|
||||
VAR
|
||||
Info: rFD;
|
||||
res: INTEGER;
|
||||
BEGIN
|
||||
IF GetFileInfo(FName, Info) THEN
|
||||
res := Info.size
|
||||
ELSE
|
||||
res := -1
|
||||
END
|
||||
RETURN res
|
||||
END FileSize;
|
||||
|
||||
|
||||
PROCEDURE Exists* (FName: ARRAY OF CHAR): BOOLEAN;
|
||||
VAR
|
||||
fd: rFD;
|
||||
BEGIN
|
||||
RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr))
|
||||
END Exists;
|
||||
|
||||
|
||||
PROCEDURE Close* (VAR F: FS);
|
||||
BEGIN
|
||||
IF F # NIL THEN
|
||||
DISPOSE(F)
|
||||
END
|
||||
END Close;
|
||||
|
||||
|
||||
PROCEDURE Open* (FName: ARRAY OF CHAR): FS;
|
||||
VAR
|
||||
F: FS;
|
||||
|
||||
BEGIN
|
||||
|
||||
IF Exists(FName) THEN
|
||||
NEW(F);
|
||||
IF F # NIL THEN
|
||||
F.subfunc := 0;
|
||||
F.pos := 0;
|
||||
F.hpos := 0;
|
||||
F.bytes := 0;
|
||||
F.buffer := 0;
|
||||
COPY(FName, F.name)
|
||||
END
|
||||
ELSE
|
||||
F := NIL
|
||||
END
|
||||
|
||||
RETURN F
|
||||
END Open;
|
||||
|
||||
|
||||
PROCEDURE Delete* (FName: ARRAY OF CHAR): BOOLEAN;
|
||||
VAR
|
||||
F: FS;
|
||||
res, res2: INTEGER;
|
||||
|
||||
BEGIN
|
||||
|
||||
IF Exists(FName) THEN
|
||||
NEW(F);
|
||||
IF F # NIL THEN
|
||||
F.subfunc := 8;
|
||||
F.pos := 0;
|
||||
F.hpos := 0;
|
||||
F.bytes := 0;
|
||||
F.buffer := 0;
|
||||
COPY(FName, F.name);
|
||||
res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
|
||||
DISPOSE(F)
|
||||
ELSE
|
||||
res := -1
|
||||
END
|
||||
ELSE
|
||||
res := -1
|
||||
END
|
||||
|
||||
RETURN res = 0
|
||||
END Delete;
|
||||
|
||||
|
||||
PROCEDURE Seek* (F: FS; Offset, Origin: INTEGER): INTEGER;
|
||||
VAR
|
||||
res: INTEGER;
|
||||
fd: rFD;
|
||||
|
||||
BEGIN
|
||||
|
||||
IF (F # NIL) & GetFileInfo(F.name, fd) & (BITS(fd.attr) * {4} = {}) THEN
|
||||
CASE Origin OF
|
||||
|SEEK_BEG: F.pos := Offset
|
||||
|SEEK_CUR: F.pos := F.pos + Offset
|
||||
|SEEK_END: F.pos := fd.size + Offset
|
||||
ELSE
|
||||
END;
|
||||
res := F.pos
|
||||
ELSE
|
||||
res := -1
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END Seek;
|
||||
|
||||
|
||||
PROCEDURE Read* (F: FS; Buffer, Count: INTEGER): INTEGER;
|
||||
VAR
|
||||
res, res2: INTEGER;
|
||||
|
||||
BEGIN
|
||||
|
||||
IF F # NIL THEN
|
||||
F.subfunc := 0;
|
||||
F.bytes := Count;
|
||||
F.buffer := Buffer;
|
||||
res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
|
||||
IF res2 > 0 THEN
|
||||
F.pos := F.pos + res2
|
||||
END
|
||||
ELSE
|
||||
res2 := 0
|
||||
END
|
||||
|
||||
RETURN res2
|
||||
END Read;
|
||||
|
||||
|
||||
PROCEDURE Write* (F: FS; Buffer, Count: INTEGER): INTEGER;
|
||||
VAR
|
||||
res, res2: INTEGER;
|
||||
|
||||
BEGIN
|
||||
|
||||
IF F # NIL THEN
|
||||
F.subfunc := 3;
|
||||
F.bytes := Count;
|
||||
F.buffer := Buffer;
|
||||
res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
|
||||
IF res2 > 0 THEN
|
||||
F.pos := F.pos + res2
|
||||
END
|
||||
ELSE
|
||||
res2 := 0
|
||||
END
|
||||
|
||||
RETURN res2
|
||||
END Write;
|
||||
|
||||
|
||||
PROCEDURE Create* (FName: ARRAY OF CHAR): FS;
|
||||
VAR
|
||||
F: FS;
|
||||
res2: INTEGER;
|
||||
|
||||
BEGIN
|
||||
NEW(F);
|
||||
|
||||
IF F # NIL THEN
|
||||
F.subfunc := 2;
|
||||
F.pos := 0;
|
||||
F.hpos := 0;
|
||||
F.bytes := 0;
|
||||
F.buffer := 0;
|
||||
COPY(FName, F.name);
|
||||
IF KOSAPI.sysfunc22(70, sys.ADR(F^), res2) # 0 THEN
|
||||
DISPOSE(F)
|
||||
END
|
||||
END
|
||||
|
||||
RETURN F
|
||||
END Create;
|
||||
|
||||
|
||||
PROCEDURE DirExists* (FName: ARRAY OF CHAR): BOOLEAN;
|
||||
VAR
|
||||
fd: rFD;
|
||||
BEGIN
|
||||
RETURN GetFileInfo(FName, fd) & (4 IN BITS(fd.attr))
|
||||
END DirExists;
|
||||
|
||||
|
||||
PROCEDURE CreateDir* (DirName: ARRAY OF CHAR): BOOLEAN;
|
||||
VAR
|
||||
F: FS;
|
||||
res, res2: INTEGER;
|
||||
|
||||
BEGIN
|
||||
NEW(F);
|
||||
|
||||
IF F # NIL THEN
|
||||
F.subfunc := 9;
|
||||
F.pos := 0;
|
||||
F.hpos := 0;
|
||||
F.bytes := 0;
|
||||
F.buffer := 0;
|
||||
COPY(DirName, F.name);
|
||||
res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
|
||||
DISPOSE(F)
|
||||
ELSE
|
||||
res := -1
|
||||
END
|
||||
|
||||
RETURN res = 0
|
||||
END CreateDir;
|
||||
|
||||
|
||||
PROCEDURE DeleteDir* (DirName: ARRAY OF CHAR): BOOLEAN;
|
||||
VAR
|
||||
F: FS;
|
||||
res, res2: INTEGER;
|
||||
|
||||
BEGIN
|
||||
|
||||
IF DirExists(DirName) THEN
|
||||
NEW(F);
|
||||
IF F # NIL THEN
|
||||
F.subfunc := 8;
|
||||
F.pos := 0;
|
||||
F.hpos := 0;
|
||||
F.bytes := 0;
|
||||
F.buffer := 0;
|
||||
COPY(DirName, F.name);
|
||||
res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
|
||||
DISPOSE(F)
|
||||
ELSE
|
||||
res := -1
|
||||
END
|
||||
ELSE
|
||||
res := -1
|
||||
END
|
||||
|
||||
RETURN res = 0
|
||||
END DeleteDir;
|
||||
|
||||
|
||||
END File.
|
||||
@@ -1,553 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2022, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE HOST;
|
||||
|
||||
IMPORT SYSTEM, K := KOSAPI, API;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
slash* = "/";
|
||||
eol* = 0DX + 0AX;
|
||||
|
||||
bit_depth* = API.BIT_DEPTH;
|
||||
maxint* = ROR(-2, 1);
|
||||
minint* = ROR(1, 1);
|
||||
|
||||
MAX_PARAM = 1024;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
DAYS = ARRAY 12, 31, 2 OF INTEGER;
|
||||
|
||||
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;
|
||||
|
||||
|
||||
VAR
|
||||
|
||||
|
||||
Console: BOOLEAN;
|
||||
|
||||
days: DAYS;
|
||||
|
||||
Params: ARRAY MAX_PARAM, 2 OF INTEGER;
|
||||
argc*: INTEGER;
|
||||
|
||||
maxreal*, inf*: REAL;
|
||||
|
||||
|
||||
PROCEDURE [stdcall, "Console.obj", "con_init"] con_init (wnd_width, wnd_height, scr_width, scr_height, title: INTEGER);
|
||||
|
||||
PROCEDURE [stdcall, "Console.obj", "con_exit"] con_exit (bCloseWindow: BOOLEAN);
|
||||
|
||||
PROCEDURE [stdcall, "Console.obj", "con_write_string"] con_write_string (string, length: INTEGER);
|
||||
|
||||
|
||||
PROCEDURE ExitProcess* (p1: INTEGER);
|
||||
BEGIN
|
||||
IF Console THEN
|
||||
con_exit(FALSE)
|
||||
END;
|
||||
K.sysfunc1(-1)
|
||||
END ExitProcess;
|
||||
|
||||
|
||||
PROCEDURE OutChar* (c: CHAR);
|
||||
BEGIN
|
||||
IF Console THEN
|
||||
con_write_string(SYSTEM.ADR(c), 1)
|
||||
ELSE
|
||||
K.sysfunc3(63, 1, ORD(c))
|
||||
END
|
||||
END OutChar;
|
||||
|
||||
|
||||
PROCEDURE GetFileInfo (FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN;
|
||||
VAR
|
||||
res2: INTEGER;
|
||||
fs: rFS;
|
||||
|
||||
BEGIN
|
||||
fs.subfunc := 5;
|
||||
fs.pos := 0;
|
||||
fs.hpos := 0;
|
||||
fs.bytes := 0;
|
||||
fs.buffer := SYSTEM.ADR(Info);
|
||||
COPY(FName, fs.name)
|
||||
RETURN K.sysfunc22(70, SYSTEM.ADR(fs), res2) = 0
|
||||
END GetFileInfo;
|
||||
|
||||
|
||||
PROCEDURE Exists (FName: ARRAY OF CHAR): BOOLEAN;
|
||||
VAR
|
||||
fd: rFD;
|
||||
|
||||
BEGIN
|
||||
RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr))
|
||||
END Exists;
|
||||
|
||||
|
||||
PROCEDURE Close (VAR F: FS);
|
||||
BEGIN
|
||||
IF F # NIL THEN
|
||||
DISPOSE(F)
|
||||
END
|
||||
END Close;
|
||||
|
||||
|
||||
PROCEDURE Open (FName: ARRAY OF CHAR): FS;
|
||||
VAR
|
||||
F: FS;
|
||||
|
||||
BEGIN
|
||||
IF Exists(FName) THEN
|
||||
NEW(F);
|
||||
IF F # NIL THEN
|
||||
F.subfunc := 0;
|
||||
F.pos := 0;
|
||||
F.hpos := 0;
|
||||
F.bytes := 0;
|
||||
F.buffer := 0;
|
||||
COPY(FName, F.name)
|
||||
END
|
||||
ELSE
|
||||
F := NIL
|
||||
END
|
||||
|
||||
RETURN F
|
||||
END Open;
|
||||
|
||||
|
||||
PROCEDURE Read (F: FS; Buffer, Count: INTEGER): INTEGER;
|
||||
VAR
|
||||
res, res2: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF F # NIL THEN
|
||||
F.subfunc := 0;
|
||||
F.bytes := Count;
|
||||
F.buffer := Buffer;
|
||||
res := K.sysfunc22(70, SYSTEM.ADR(F^), res2);
|
||||
IF res2 > 0 THEN
|
||||
F.pos := F.pos + res2
|
||||
END
|
||||
ELSE
|
||||
res2 := 0
|
||||
END
|
||||
|
||||
RETURN res2
|
||||
END Read;
|
||||
|
||||
|
||||
PROCEDURE Write (F: FS; Buffer, Count: INTEGER): INTEGER;
|
||||
VAR
|
||||
res, res2: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF F # NIL THEN
|
||||
F.subfunc := 3;
|
||||
F.bytes := Count;
|
||||
F.buffer := Buffer;
|
||||
res := K.sysfunc22(70, SYSTEM.ADR(F^), res2);
|
||||
IF res2 > 0 THEN
|
||||
F.pos := F.pos + res2
|
||||
END
|
||||
ELSE
|
||||
res2 := 0
|
||||
END
|
||||
|
||||
RETURN res2
|
||||
END Write;
|
||||
|
||||
|
||||
PROCEDURE Create (FName: ARRAY OF CHAR): FS;
|
||||
VAR
|
||||
F: FS;
|
||||
res2: INTEGER;
|
||||
|
||||
BEGIN
|
||||
NEW(F);
|
||||
IF F # NIL THEN
|
||||
F.subfunc := 2;
|
||||
F.pos := 0;
|
||||
F.hpos := 0;
|
||||
F.bytes := 0;
|
||||
F.buffer := 0;
|
||||
COPY(FName, F.name);
|
||||
IF K.sysfunc22(70, SYSTEM.ADR(F^), res2) # 0 THEN
|
||||
DISPOSE(F)
|
||||
END
|
||||
END
|
||||
|
||||
RETURN F
|
||||
END Create;
|
||||
|
||||
|
||||
PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
|
||||
VAR
|
||||
n: INTEGER;
|
||||
fs: FS;
|
||||
|
||||
BEGIN
|
||||
SYSTEM.GET(SYSTEM.ADR(F), fs);
|
||||
n := Read(fs, SYSTEM.ADR(Buffer[0]), bytes);
|
||||
IF n = 0 THEN
|
||||
n := -1
|
||||
END
|
||||
|
||||
RETURN n
|
||||
END FileRead;
|
||||
|
||||
|
||||
PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
|
||||
VAR
|
||||
n: INTEGER;
|
||||
fs: FS;
|
||||
|
||||
BEGIN
|
||||
SYSTEM.GET(SYSTEM.ADR(F), fs);
|
||||
n := Write(fs, SYSTEM.ADR(Buffer[0]), bytes);
|
||||
IF n = 0 THEN
|
||||
n := -1
|
||||
END
|
||||
|
||||
RETURN n
|
||||
END FileWrite;
|
||||
|
||||
|
||||
PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
|
||||
VAR
|
||||
fs: FS;
|
||||
res: INTEGER;
|
||||
|
||||
BEGIN
|
||||
fs := Create(FName);
|
||||
SYSTEM.GET(SYSTEM.ADR(fs), res)
|
||||
RETURN res
|
||||
END FileCreate;
|
||||
|
||||
|
||||
PROCEDURE FileClose* (F: INTEGER);
|
||||
VAR
|
||||
fs: FS;
|
||||
|
||||
BEGIN
|
||||
SYSTEM.GET(SYSTEM.ADR(F), fs);
|
||||
Close(fs)
|
||||
END FileClose;
|
||||
|
||||
|
||||
PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
|
||||
VAR
|
||||
fs: FS;
|
||||
res: INTEGER;
|
||||
|
||||
BEGIN
|
||||
fs := Open(FName);
|
||||
SYSTEM.GET(SYSTEM.ADR(fs), res)
|
||||
RETURN res
|
||||
END FileOpen;
|
||||
|
||||
|
||||
PROCEDURE chmod* (FName: ARRAY OF CHAR);
|
||||
END chmod;
|
||||
|
||||
|
||||
PROCEDURE GetTickCount* (): INTEGER;
|
||||
RETURN K.sysfunc2(26, 9)
|
||||
END GetTickCount;
|
||||
|
||||
|
||||
PROCEDURE AppAdr (): INTEGER;
|
||||
VAR
|
||||
buf: ARRAY 1024 OF CHAR;
|
||||
a: INTEGER;
|
||||
|
||||
BEGIN
|
||||
a := K.sysfunc3(9, SYSTEM.ADR(buf), -1);
|
||||
SYSTEM.GET(SYSTEM.ADR(buf) + 22, a)
|
||||
RETURN a
|
||||
END AppAdr;
|
||||
|
||||
|
||||
PROCEDURE GetCommandLine (): INTEGER;
|
||||
VAR
|
||||
param: INTEGER;
|
||||
|
||||
BEGIN
|
||||
SYSTEM.GET(28 + AppAdr(), param)
|
||||
RETURN param
|
||||
END GetCommandLine;
|
||||
|
||||
|
||||
PROCEDURE GetName (): INTEGER;
|
||||
VAR
|
||||
name: INTEGER;
|
||||
|
||||
BEGIN
|
||||
SYSTEM.GET(32 + AppAdr(), name)
|
||||
RETURN name
|
||||
END GetName;
|
||||
|
||||
|
||||
PROCEDURE GetChar (adr: INTEGER): CHAR;
|
||||
VAR
|
||||
res: CHAR;
|
||||
|
||||
BEGIN
|
||||
SYSTEM.GET(adr, res)
|
||||
RETURN res
|
||||
END GetChar;
|
||||
|
||||
|
||||
PROCEDURE ParamParse;
|
||||
VAR
|
||||
p, count, name, cond: INTEGER;
|
||||
c: CHAR;
|
||||
|
||||
|
||||
PROCEDURE ChangeCond (A, B, C: INTEGER; c: CHAR; VAR cond: INTEGER);
|
||||
BEGIN
|
||||
IF (c <= 20X) & (c # 0X) THEN
|
||||
cond := A
|
||||
ELSIF c = 22X THEN
|
||||
cond := B
|
||||
ELSIF c = 0X THEN
|
||||
cond := 6
|
||||
ELSE
|
||||
cond := C
|
||||
END
|
||||
END ChangeCond;
|
||||
|
||||
|
||||
BEGIN
|
||||
p := GetCommandLine();
|
||||
name := GetName();
|
||||
Params[0, 0] := name;
|
||||
WHILE GetChar(name) # 0X DO
|
||||
INC(name)
|
||||
END;
|
||||
Params[0, 1] := name - 1;
|
||||
cond := 0;
|
||||
count := 1;
|
||||
WHILE (argc < MAX_PARAM) & (cond # 6) DO
|
||||
c := GetChar(p);
|
||||
CASE cond OF
|
||||
|0: ChangeCond(0, 4, 1, c, cond); IF cond = 1 THEN Params[count, 0] := p END
|
||||
|1: ChangeCond(0, 3, 1, c, cond); IF cond IN {0, 6} THEN Params[count, 1] := p - 1; INC(count) END
|
||||
|3: ChangeCond(3, 1, 3, c, cond); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
|
||||
|4: ChangeCond(5, 0, 5, c, cond); IF cond = 5 THEN Params[count, 0] := p END
|
||||
|5: ChangeCond(5, 1, 5, c, cond); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
|
||||
|6:
|
||||
END;
|
||||
INC(p)
|
||||
END;
|
||||
argc := count
|
||||
END ParamParse;
|
||||
|
||||
|
||||
PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
|
||||
VAR
|
||||
i, j, len: INTEGER;
|
||||
c: CHAR;
|
||||
|
||||
BEGIN
|
||||
j := 0;
|
||||
IF n < argc THEN
|
||||
len := LEN(s) - 1;
|
||||
i := Params[n, 0];
|
||||
WHILE (j < len) & (i <= Params[n, 1]) DO
|
||||
c := GetChar(i);
|
||||
IF c # 22X THEN
|
||||
s[j] := c;
|
||||
INC(j)
|
||||
END;
|
||||
INC(i)
|
||||
END
|
||||
END;
|
||||
s[j] := 0X
|
||||
END GetArg;
|
||||
|
||||
|
||||
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
|
||||
VAR
|
||||
n: INTEGER;
|
||||
|
||||
BEGIN
|
||||
n := K.sysfunc4(30, 2, SYSTEM.ADR(path[0]), LEN(path) - 2);
|
||||
path[n - 1] := slash;
|
||||
path[n] := 0X
|
||||
END GetCurrentDirectory;
|
||||
|
||||
|
||||
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
|
||||
RETURN path[0] # slash
|
||||
END isRelative;
|
||||
|
||||
|
||||
PROCEDURE UnixTime* (): INTEGER;
|
||||
VAR
|
||||
date, time, year, month, day, hour, min, sec: INTEGER;
|
||||
|
||||
BEGIN
|
||||
date := K.sysfunc1(29);
|
||||
time := K.sysfunc1(3);
|
||||
|
||||
year := date MOD 16;
|
||||
date := date DIV 16;
|
||||
year := (date MOD 16) * 10 + year;
|
||||
date := date DIV 16;
|
||||
|
||||
month := date MOD 16;
|
||||
date := date DIV 16;
|
||||
month := (date MOD 16) * 10 + month;
|
||||
date := date DIV 16;
|
||||
|
||||
day := date MOD 16;
|
||||
date := date DIV 16;
|
||||
day := (date MOD 16) * 10 + day;
|
||||
date := date DIV 16;
|
||||
|
||||
hour := time MOD 16;
|
||||
time := time DIV 16;
|
||||
hour := (time MOD 16) * 10 + hour;
|
||||
time := time DIV 16;
|
||||
|
||||
min := time MOD 16;
|
||||
time := time DIV 16;
|
||||
min := (time MOD 16) * 10 + min;
|
||||
time := time DIV 16;
|
||||
|
||||
sec := time MOD 16;
|
||||
time := time DIV 16;
|
||||
sec := (time MOD 16) * 10 + sec;
|
||||
time := time DIV 16;
|
||||
|
||||
INC(year, 2000)
|
||||
|
||||
RETURN ((year - 1970) * 365 + days[month - 1, day - 1, ORD(year DIV 4 = 0)] + (year - 1969) DIV 4) * 86400 + hour * 3600 + min * 60 + sec
|
||||
END UnixTime;
|
||||
|
||||
|
||||
PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.GET32(SYSTEM.ADR(x), a);
|
||||
SYSTEM.GET32(SYSTEM.ADR(x) + 4, b)
|
||||
RETURN a
|
||||
END splitf;
|
||||
|
||||
|
||||
PROCEDURE d2s* (x: REAL): INTEGER;
|
||||
VAR
|
||||
h, l, s, e: INTEGER;
|
||||
|
||||
BEGIN
|
||||
e := splitf(x, l, h);
|
||||
|
||||
s := ASR(h, 31) MOD 2;
|
||||
e := (h DIV 100000H) MOD 2048;
|
||||
IF e <= 896 THEN
|
||||
h := (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 + 800000H;
|
||||
REPEAT
|
||||
h := h DIV 2;
|
||||
INC(e)
|
||||
UNTIL e = 897;
|
||||
e := 896;
|
||||
l := (h MOD 8) * 20000000H;
|
||||
h := h DIV 8
|
||||
ELSIF (1151 <= e) & (e < 2047) THEN
|
||||
e := 1151;
|
||||
h := 0;
|
||||
l := 0
|
||||
ELSIF e = 2047 THEN
|
||||
e := 1151;
|
||||
IF (h MOD 100000H # 0) OR (BITS(l) * {0..31} # {}) THEN
|
||||
h := 80000H;
|
||||
l := 0
|
||||
END
|
||||
END;
|
||||
DEC(e, 896)
|
||||
|
||||
RETURN LSL(s, 31) + LSL(e, 23) + (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8
|
||||
END d2s;
|
||||
|
||||
|
||||
PROCEDURE init (VAR days: DAYS);
|
||||
VAR
|
||||
i, j, n0, n1: INTEGER;
|
||||
|
||||
BEGIN
|
||||
|
||||
FOR i := 0 TO 11 DO
|
||||
FOR j := 0 TO 30 DO
|
||||
days[i, j, 0] := 0;
|
||||
days[i, j, 1] := 0;
|
||||
END
|
||||
END;
|
||||
|
||||
days[ 1, 28, 0] := -1;
|
||||
|
||||
FOR i := 0 TO 1 DO
|
||||
days[ 1, 29, i] := -1;
|
||||
days[ 1, 30, i] := -1;
|
||||
days[ 3, 30, i] := -1;
|
||||
days[ 5, 30, i] := -1;
|
||||
days[ 8, 30, i] := -1;
|
||||
days[10, 30, i] := -1;
|
||||
END;
|
||||
|
||||
n0 := 0;
|
||||
n1 := 0;
|
||||
FOR i := 0 TO 11 DO
|
||||
FOR j := 0 TO 30 DO
|
||||
IF days[i, j, 0] = 0 THEN
|
||||
days[i, j, 0] := n0;
|
||||
INC(n0)
|
||||
END;
|
||||
IF days[i, j, 1] = 0 THEN
|
||||
days[i, j, 1] := n1;
|
||||
INC(n1)
|
||||
END
|
||||
END
|
||||
END;
|
||||
|
||||
inf := SYSTEM.INF();
|
||||
maxreal := 1.9;
|
||||
PACK(maxreal, 1023);
|
||||
Console := TRUE;
|
||||
IF Console THEN
|
||||
con_init(-1, -1, -1, -1, SYSTEM.SADR("Oberon-07 for KolibriOS"))
|
||||
END;
|
||||
ParamParse
|
||||
END init;
|
||||
|
||||
|
||||
BEGIN
|
||||
init(days)
|
||||
END HOST.
|
||||
@@ -1,282 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE In;
|
||||
|
||||
IMPORT sys := SYSTEM, ConsoleLib;
|
||||
|
||||
TYPE
|
||||
|
||||
STRING = ARRAY 260 OF CHAR;
|
||||
|
||||
VAR
|
||||
|
||||
Done* : BOOLEAN;
|
||||
|
||||
PROCEDURE digit(ch: CHAR): BOOLEAN;
|
||||
RETURN (ch >= "0") & (ch <= "9")
|
||||
END digit;
|
||||
|
||||
PROCEDURE CheckInt(s: STRING; VAR first, last: INTEGER; VAR neg: BOOLEAN; Point: BOOLEAN): BOOLEAN;
|
||||
VAR i: INTEGER;
|
||||
BEGIN
|
||||
i := 0;
|
||||
neg := FALSE;
|
||||
WHILE (s[i] <= 20X) & (s[i] # 0X) DO
|
||||
INC(i)
|
||||
END;
|
||||
IF s[i] = "-" THEN
|
||||
neg := TRUE;
|
||||
INC(i)
|
||||
ELSIF s[i] = "+" THEN
|
||||
INC(i)
|
||||
END;
|
||||
first := i;
|
||||
WHILE digit(s[i]) DO
|
||||
INC(i)
|
||||
END;
|
||||
last := i
|
||||
RETURN ((s[i] <= 20X) OR (Point & (s[i] = "."))) & digit(s[first])
|
||||
END CheckInt;
|
||||
|
||||
PROCEDURE IsMinInt(str: STRING; pos: INTEGER): BOOLEAN;
|
||||
VAR i: INTEGER; min: STRING;
|
||||
BEGIN
|
||||
i := 0;
|
||||
min := "2147483648";
|
||||
WHILE (min[i] # 0X) & (str[i] # 0X) & (min[i] = str[i + pos]) DO
|
||||
INC(i)
|
||||
END
|
||||
RETURN i = 10
|
||||
END IsMinInt;
|
||||
|
||||
PROCEDURE StrToInt(str: STRING; VAR err: BOOLEAN): INTEGER;
|
||||
CONST maxINT = 7FFFFFFFH;
|
||||
VAR i, n, res: INTEGER; flag, neg: BOOLEAN;
|
||||
BEGIN
|
||||
res := 0;
|
||||
flag := CheckInt(str, i, n, neg, FALSE);
|
||||
err := ~flag;
|
||||
IF flag & neg & IsMinInt(str, i) THEN
|
||||
flag := FALSE;
|
||||
neg := FALSE;
|
||||
res := 80000000H
|
||||
END;
|
||||
WHILE flag & digit(str[i]) DO
|
||||
IF res > maxINT DIV 10 THEN
|
||||
err := TRUE;
|
||||
flag := FALSE;
|
||||
res := 0
|
||||
ELSE
|
||||
res := res * 10;
|
||||
IF res > maxINT - (ORD(str[i]) - ORD("0")) THEN
|
||||
err := TRUE;
|
||||
flag := FALSE;
|
||||
res := 0
|
||||
ELSE
|
||||
res := res + (ORD(str[i]) - ORD("0"));
|
||||
INC(i)
|
||||
END
|
||||
END
|
||||
END;
|
||||
IF neg THEN
|
||||
res := -res
|
||||
END
|
||||
RETURN res
|
||||
END StrToInt;
|
||||
|
||||
PROCEDURE Space(s: STRING): BOOLEAN;
|
||||
VAR i: INTEGER;
|
||||
BEGIN
|
||||
i := 0;
|
||||
WHILE (s[i] # 0X) & (s[i] <= 20X) DO
|
||||
INC(i)
|
||||
END
|
||||
RETURN s[i] = 0X
|
||||
END Space;
|
||||
|
||||
PROCEDURE CheckReal(s: STRING; VAR n: INTEGER; VAR neg: BOOLEAN): BOOLEAN;
|
||||
VAR i: INTEGER; Res: BOOLEAN;
|
||||
BEGIN
|
||||
Res := CheckInt(s, n, i, neg, TRUE);
|
||||
IF Res THEN
|
||||
IF s[i] = "." THEN
|
||||
INC(i);
|
||||
WHILE digit(s[i]) DO
|
||||
INC(i)
|
||||
END;
|
||||
IF (s[i] = "D") OR (s[i] = "E") OR (s[i] = "d") OR (s[i] = "e") THEN
|
||||
INC(i);
|
||||
IF (s[i] = "+") OR (s[i] = "-") THEN
|
||||
INC(i)
|
||||
END;
|
||||
Res := digit(s[i]);
|
||||
WHILE digit(s[i]) DO
|
||||
INC(i)
|
||||
END
|
||||
END
|
||||
END
|
||||
END
|
||||
RETURN Res & (s[i] <= 20X)
|
||||
END CheckReal;
|
||||
|
||||
PROCEDURE StrToFloat(str: STRING; VAR err: BOOLEAN): REAL;
|
||||
CONST maxDBL = 1.69E308; maxINT = 7FFFFFFFH;
|
||||
VAR i, scale: INTEGER; res, m, d: REAL; minus, neg: BOOLEAN;
|
||||
|
||||
PROCEDURE part1 (str: STRING; VAR res, d: REAL; VAR i: INTEGER): BOOLEAN;
|
||||
BEGIN
|
||||
res := 0.0;
|
||||
d := 1.0;
|
||||
WHILE digit(str[i]) DO
|
||||
res := res * 10.0 + FLT(ORD(str[i]) - ORD("0"));
|
||||
INC(i)
|
||||
END;
|
||||
IF str[i] = "." THEN
|
||||
INC(i);
|
||||
WHILE digit(str[i]) DO
|
||||
d := d / 10.0;
|
||||
res := res + FLT(ORD(str[i]) - ORD("0")) * d;
|
||||
INC(i)
|
||||
END
|
||||
END
|
||||
RETURN str[i] # 0X
|
||||
END part1;
|
||||
|
||||
PROCEDURE part2 (str: STRING; VAR i, scale: INTEGER; VAR minus, err: BOOLEAN; VAR m, res: REAL): BOOLEAN;
|
||||
BEGIN
|
||||
INC(i);
|
||||
m := 10.0;
|
||||
minus := FALSE;
|
||||
IF str[i] = "+" THEN
|
||||
INC(i)
|
||||
ELSIF str[i] = "-" THEN
|
||||
minus := TRUE;
|
||||
INC(i);
|
||||
m := 0.1
|
||||
END;
|
||||
scale := 0;
|
||||
err := FALSE;
|
||||
WHILE ~err & digit(str[i]) DO
|
||||
IF scale > maxINT DIV 10 THEN
|
||||
err := TRUE;
|
||||
res := 0.0
|
||||
ELSE
|
||||
scale := scale * 10;
|
||||
IF scale > maxINT - (ORD(str[i]) - ORD("0")) THEN
|
||||
err := TRUE;
|
||||
res := 0.0
|
||||
ELSE
|
||||
scale := scale + (ORD(str[i]) - ORD("0"));
|
||||
INC(i)
|
||||
END
|
||||
END
|
||||
END
|
||||
RETURN ~err
|
||||
END part2;
|
||||
|
||||
PROCEDURE part3 (VAR err, minus: BOOLEAN; VAR res, m: REAL; VAR scale: INTEGER);
|
||||
VAR i: INTEGER;
|
||||
BEGIN
|
||||
err := FALSE;
|
||||
IF scale = maxINT THEN
|
||||
err := TRUE;
|
||||
res := 0.0
|
||||
END;
|
||||
i := 1;
|
||||
WHILE ~err & (i <= scale) DO
|
||||
IF ~minus & (res > maxDBL / m) THEN
|
||||
err := TRUE;
|
||||
res := 0.0
|
||||
ELSE
|
||||
res := res * m;
|
||||
INC(i)
|
||||
END
|
||||
END
|
||||
END part3;
|
||||
|
||||
BEGIN
|
||||
IF CheckReal(str, i, neg) THEN
|
||||
IF part1(str, res, d, i) & part2(str, i, scale, minus, err, m, res) THEN
|
||||
part3(err, minus, res, m, scale)
|
||||
END;
|
||||
IF neg THEN
|
||||
res := -res
|
||||
END
|
||||
ELSE
|
||||
res := 0.0;
|
||||
err := TRUE
|
||||
END
|
||||
RETURN res
|
||||
END StrToFloat;
|
||||
|
||||
PROCEDURE String*(VAR s: ARRAY OF CHAR);
|
||||
VAR res, length: INTEGER; str: STRING;
|
||||
BEGIN
|
||||
res := ConsoleLib.gets(sys.ADR(str[0]), LEN(str));
|
||||
length := LENGTH(str);
|
||||
IF length > 0 THEN
|
||||
str[length - 1] := 0X
|
||||
END;
|
||||
COPY(str, s);
|
||||
Done := TRUE
|
||||
END String;
|
||||
|
||||
PROCEDURE Char*(VAR x: CHAR);
|
||||
VAR str: STRING;
|
||||
BEGIN
|
||||
String(str);
|
||||
x := str[0];
|
||||
Done := TRUE
|
||||
END Char;
|
||||
|
||||
PROCEDURE Ln*;
|
||||
VAR str: STRING;
|
||||
BEGIN
|
||||
String(str);
|
||||
Done := TRUE
|
||||
END Ln;
|
||||
|
||||
PROCEDURE Real* (VAR x: REAL);
|
||||
VAR str: STRING; err: BOOLEAN;
|
||||
BEGIN
|
||||
err := FALSE;
|
||||
REPEAT
|
||||
String(str)
|
||||
UNTIL ~Space(str);
|
||||
x := StrToFloat(str, err);
|
||||
Done := ~err
|
||||
END Real;
|
||||
|
||||
|
||||
PROCEDURE Int*(VAR x: INTEGER);
|
||||
VAR str: STRING; err: BOOLEAN;
|
||||
BEGIN
|
||||
err := FALSE;
|
||||
REPEAT
|
||||
String(str)
|
||||
UNTIL ~Space(str);
|
||||
x := StrToInt(str, err);
|
||||
Done := ~err
|
||||
END Int;
|
||||
|
||||
PROCEDURE Open*;
|
||||
BEGIN
|
||||
Done := TRUE
|
||||
END Open;
|
||||
|
||||
END In.
|
||||
@@ -1,436 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2019, 2022 Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE KOSAPI;
|
||||
|
||||
IMPORT SYSTEM;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
STRING = ARRAY 1024 OF CHAR;
|
||||
|
||||
|
||||
VAR
|
||||
|
||||
DLL_INIT: PROCEDURE [stdcall] (entry: INTEGER);
|
||||
|
||||
|
||||
PROCEDURE [stdcall-] sysfunc1* (arg1: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *)
|
||||
0CDH, 040H, (* int 64 *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 004H, 000H (* ret 4 *)
|
||||
)
|
||||
RETURN 0
|
||||
END sysfunc1;
|
||||
|
||||
|
||||
PROCEDURE [stdcall-] sysfunc2* (arg1, arg2: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
053H, (* push ebx *)
|
||||
08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *)
|
||||
08BH, 05DH, 00CH, (* mov ebx, dword [ebp + 12] *)
|
||||
0CDH, 040H, (* int 64 *)
|
||||
05BH, (* pop ebx *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 008H, 000H (* ret 8 *)
|
||||
)
|
||||
RETURN 0
|
||||
END sysfunc2;
|
||||
|
||||
|
||||
PROCEDURE [stdcall-] sysfunc3* (arg1, arg2, arg3: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
053H, (* push ebx *)
|
||||
08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *)
|
||||
08BH, 05DH, 00CH, (* mov ebx, dword [ebp + 12] *)
|
||||
08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *)
|
||||
0CDH, 040H, (* int 64 *)
|
||||
05BH, (* pop ebx *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 00CH, 000H (* ret 12 *)
|
||||
)
|
||||
RETURN 0
|
||||
END sysfunc3;
|
||||
|
||||
|
||||
PROCEDURE [stdcall-] sysfunc4* (arg1, arg2, arg3, arg4: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
053H, (* push ebx *)
|
||||
08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *)
|
||||
08BH, 05DH, 00CH, (* mov ebx, dword [ebp + 12] *)
|
||||
08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *)
|
||||
08BH, 055H, 014H, (* mov edx, dword [ebp + 20] *)
|
||||
0CDH, 040H, (* int 64 *)
|
||||
05BH, (* pop ebx *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 010H, 000H (* ret 16 *)
|
||||
)
|
||||
RETURN 0
|
||||
END sysfunc4;
|
||||
|
||||
|
||||
PROCEDURE [stdcall-] sysfunc5* (arg1, arg2, arg3, arg4, arg5: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
053H, (* push ebx *)
|
||||
056H, (* push esi *)
|
||||
08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *)
|
||||
08BH, 05DH, 00CH, (* mov ebx, dword [ebp + 12] *)
|
||||
08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *)
|
||||
08BH, 055H, 014H, (* mov edx, dword [ebp + 20] *)
|
||||
08BH, 075H, 018H, (* mov esi, dword [ebp + 24] *)
|
||||
0CDH, 040H, (* int 64 *)
|
||||
05EH, (* pop esi *)
|
||||
05BH, (* pop ebx *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 014H, 000H (* ret 20 *)
|
||||
)
|
||||
RETURN 0
|
||||
END sysfunc5;
|
||||
|
||||
|
||||
PROCEDURE [stdcall-] sysfunc6* (arg1, arg2, arg3, arg4, arg5, arg6: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
053H, (* push ebx *)
|
||||
056H, (* push esi *)
|
||||
057H, (* push edi *)
|
||||
08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *)
|
||||
08BH, 05DH, 00CH, (* mov ebx, dword [ebp + 12] *)
|
||||
08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *)
|
||||
08BH, 055H, 014H, (* mov edx, dword [ebp + 20] *)
|
||||
08BH, 075H, 018H, (* mov esi, dword [ebp + 24] *)
|
||||
08BH, 07DH, 01CH, (* mov edi, dword [ebp + 28] *)
|
||||
0CDH, 040H, (* int 64 *)
|
||||
05FH, (* pop edi *)
|
||||
05EH, (* pop esi *)
|
||||
05BH, (* pop ebx *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 018H, 000H (* ret 24 *)
|
||||
)
|
||||
RETURN 0
|
||||
END sysfunc6;
|
||||
|
||||
|
||||
PROCEDURE [stdcall-] sysfunc7* (arg1, arg2, arg3, arg4, arg5, arg6, arg7: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
053H, (* push ebx *)
|
||||
056H, (* push esi *)
|
||||
057H, (* push edi *)
|
||||
055H, (* push ebp *)
|
||||
08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *)
|
||||
08BH, 05DH, 00CH, (* mov ebx, dword [ebp + 12] *)
|
||||
08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *)
|
||||
08BH, 055H, 014H, (* mov edx, dword [ebp + 20] *)
|
||||
08BH, 075H, 018H, (* mov esi, dword [ebp + 24] *)
|
||||
08BH, 07DH, 01CH, (* mov edi, dword [ebp + 28] *)
|
||||
08BH, 06DH, 020H, (* mov ebp, dword [ebp + 32] *)
|
||||
0CDH, 040H, (* int 64 *)
|
||||
05DH, (* pop ebp *)
|
||||
05FH, (* pop edi *)
|
||||
05EH, (* pop esi *)
|
||||
05BH, (* pop ebx *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 01CH, 000H (* ret 28 *)
|
||||
)
|
||||
RETURN 0
|
||||
END sysfunc7;
|
||||
|
||||
|
||||
PROCEDURE [stdcall-] sysfunc22* (arg1, arg2: INTEGER; VAR res2: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
053H, (* push ebx *)
|
||||
08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *)
|
||||
08BH, 05DH, 00CH, (* mov ebx, dword [ebp + 12] *)
|
||||
0CDH, 040H, (* int 64 *)
|
||||
08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *)
|
||||
089H, 019H, (* mov dword [ecx], ebx *)
|
||||
05BH, (* pop ebx *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 00CH, 000H (* ret 12 *)
|
||||
)
|
||||
RETURN 0
|
||||
END sysfunc22;
|
||||
|
||||
|
||||
PROCEDURE mem_commit (adr, size: INTEGER);
|
||||
VAR
|
||||
tmp: INTEGER;
|
||||
BEGIN
|
||||
FOR tmp := adr TO adr + size - 1 BY 4096 DO
|
||||
SYSTEM.PUT(tmp, 0)
|
||||
END
|
||||
END mem_commit;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] malloc* (size: INTEGER): INTEGER;
|
||||
VAR
|
||||
ptr: INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(060H); (* pusha *)
|
||||
IF sysfunc2(18, 16) > ASR(size, 10) THEN
|
||||
ptr := sysfunc3(68, 12, size);
|
||||
IF ptr # 0 THEN
|
||||
mem_commit(ptr, size)
|
||||
END
|
||||
ELSE
|
||||
ptr := 0
|
||||
END;
|
||||
SYSTEM.CODE(061H) (* popa *)
|
||||
RETURN ptr
|
||||
END malloc;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] free* (ptr: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(060H); (* pusha *)
|
||||
IF ptr # 0 THEN
|
||||
ptr := sysfunc3(68, 13, ptr)
|
||||
END;
|
||||
SYSTEM.CODE(061H) (* popa *)
|
||||
RETURN 0
|
||||
END free;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] realloc* (ptr, size: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(060H); (* pusha *)
|
||||
ptr := sysfunc4(68, 20, size, ptr);
|
||||
SYSTEM.CODE(061H) (* popa *)
|
||||
RETURN ptr
|
||||
END realloc;
|
||||
|
||||
|
||||
PROCEDURE AppAdr (): INTEGER;
|
||||
VAR
|
||||
buf: ARRAY 1024 OF CHAR;
|
||||
a: INTEGER;
|
||||
BEGIN
|
||||
a := sysfunc3(9, SYSTEM.ADR(buf), -1);
|
||||
SYSTEM.GET(SYSTEM.ADR(buf) + 22, a)
|
||||
RETURN a
|
||||
END AppAdr;
|
||||
|
||||
|
||||
PROCEDURE GetCommandLine* (): INTEGER;
|
||||
VAR
|
||||
param: INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.GET(28 + AppAdr(), param)
|
||||
RETURN param
|
||||
END GetCommandLine;
|
||||
|
||||
|
||||
PROCEDURE GetName* (): INTEGER;
|
||||
VAR
|
||||
name: INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.GET(32 + AppAdr(), name)
|
||||
RETURN name
|
||||
END GetName;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] dll_init2 (arg1, arg2, arg3, arg4, arg5: INTEGER);
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
060H, (* pusha *)
|
||||
08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *)
|
||||
08BH, 05DH, 00CH, (* mov ebx, dword [ebp + 12] *)
|
||||
08BH, 04DH, 010H, (* mov ecx, dword [ebp + 16] *)
|
||||
08BH, 055H, 014H, (* mov edx, dword [ebp + 20] *)
|
||||
08BH, 075H, 018H, (* mov esi, dword [ebp + 24] *)
|
||||
0FFH, 0D6H, (* call esi *)
|
||||
061H, (* popa *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 014H, 000H (* ret 20 *)
|
||||
)
|
||||
END dll_init2;
|
||||
|
||||
|
||||
PROCEDURE GetProcAdr* (name: ARRAY OF CHAR; lib: INTEGER): INTEGER;
|
||||
VAR
|
||||
cur, procname, adr: INTEGER;
|
||||
|
||||
PROCEDURE streq (str1, str2: INTEGER): BOOLEAN;
|
||||
VAR
|
||||
c1, c2: CHAR;
|
||||
BEGIN
|
||||
REPEAT
|
||||
SYSTEM.GET(str1, c1);
|
||||
SYSTEM.GET(str2, c2);
|
||||
INC(str1);
|
||||
INC(str2)
|
||||
UNTIL (c1 # c2) OR (c1 = 0X)
|
||||
|
||||
RETURN c1 = c2
|
||||
END streq;
|
||||
|
||||
BEGIN
|
||||
adr := 0;
|
||||
IF (lib # 0) & (name # "") THEN
|
||||
cur := lib;
|
||||
REPEAT
|
||||
SYSTEM.GET(cur, procname);
|
||||
INC(cur, 8)
|
||||
UNTIL (procname = 0) OR streq(procname, SYSTEM.ADR(name[0]));
|
||||
IF procname # 0 THEN
|
||||
SYSTEM.GET(cur - 4, adr)
|
||||
END
|
||||
END
|
||||
|
||||
RETURN adr
|
||||
END GetProcAdr;
|
||||
|
||||
|
||||
PROCEDURE init (dll: INTEGER);
|
||||
VAR
|
||||
lib_init: INTEGER;
|
||||
BEGIN
|
||||
lib_init := GetProcAdr("lib_init", dll);
|
||||
IF lib_init # 0 THEN
|
||||
DLL_INIT(lib_init)
|
||||
END;
|
||||
lib_init := GetProcAdr("START", dll);
|
||||
IF lib_init # 0 THEN
|
||||
DLL_INIT(lib_init)
|
||||
END
|
||||
END init;
|
||||
|
||||
|
||||
PROCEDURE OutChar* (c: CHAR);
|
||||
BEGIN
|
||||
sysfunc3(63, 1, ORD(c))
|
||||
END OutChar;
|
||||
|
||||
|
||||
PROCEDURE OutLn*;
|
||||
BEGIN
|
||||
OutChar(0DX);
|
||||
OutChar(0AX)
|
||||
END OutLn;
|
||||
|
||||
|
||||
PROCEDURE OutString (s: ARRAY OF CHAR);
|
||||
VAR
|
||||
i: INTEGER;
|
||||
BEGIN
|
||||
i := 0;
|
||||
WHILE (i < LEN(s)) & (s[i] # 0X) DO
|
||||
OutChar(s[i]);
|
||||
INC(i)
|
||||
END
|
||||
END OutString;
|
||||
|
||||
|
||||
PROCEDURE imp_error (lib, proc: STRING);
|
||||
BEGIN
|
||||
OutString("import error: ");
|
||||
IF proc = "" THEN
|
||||
OutString("can't load '")
|
||||
ELSE
|
||||
OutString("not found '"); OutString(proc); OutString("' in '")
|
||||
END;
|
||||
OutString(lib);
|
||||
OutString("'" + 0DX + 0AX)
|
||||
END imp_error;
|
||||
|
||||
|
||||
PROCEDURE GetStr (adr, i: INTEGER; VAR str: STRING);
|
||||
VAR
|
||||
c: CHAR;
|
||||
BEGIN
|
||||
REPEAT
|
||||
SYSTEM.GET(adr, c); INC(adr);
|
||||
str[i] := c; INC(i)
|
||||
UNTIL c = 0X
|
||||
END GetStr;
|
||||
|
||||
|
||||
PROCEDURE [stdcall-] dll_Load* (import_table: INTEGER): INTEGER;
|
||||
CONST
|
||||
path = "/sys/lib/";
|
||||
VAR
|
||||
imp, lib, exp, proc, pathLen: INTEGER;
|
||||
procname, libname: STRING;
|
||||
BEGIN
|
||||
SYSTEM.CODE(060H); (* pusha *)
|
||||
libname := path;
|
||||
pathLen := LENGTH(libname);
|
||||
|
||||
SYSTEM.GET(import_table, imp);
|
||||
WHILE imp # 0 DO
|
||||
SYSTEM.GET(import_table + 4, lib);
|
||||
GetStr(lib, pathLen, libname);
|
||||
exp := sysfunc3(68, 19, SYSTEM.ADR(libname[0]));
|
||||
IF exp = 0 THEN
|
||||
imp_error(libname, "")
|
||||
ELSE
|
||||
REPEAT
|
||||
SYSTEM.GET(imp, proc);
|
||||
IF proc # 0 THEN
|
||||
GetStr(proc, 0, procname);
|
||||
proc := GetProcAdr(procname, exp);
|
||||
IF proc # 0 THEN
|
||||
SYSTEM.PUT(imp, proc)
|
||||
ELSE
|
||||
proc := 1;
|
||||
imp_error(libname, procname)
|
||||
END;
|
||||
INC(imp, 4)
|
||||
END
|
||||
UNTIL proc = 0;
|
||||
init(exp)
|
||||
END;
|
||||
INC(import_table, 8);
|
||||
SYSTEM.GET(import_table, imp);
|
||||
END;
|
||||
|
||||
SYSTEM.CODE(061H) (* popa *)
|
||||
RETURN 0
|
||||
END dll_Load;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] dll_Init (entry: INTEGER);
|
||||
BEGIN
|
||||
SYSTEM.CODE(060H); (* pusha *)
|
||||
IF entry # 0 THEN
|
||||
dll_init2(SYSTEM.ADR(malloc), SYSTEM.ADR(free), SYSTEM.ADR(realloc), SYSTEM.ADR(dll_Load), entry)
|
||||
END;
|
||||
SYSTEM.CODE(061H); (* popa *)
|
||||
END dll_Init;
|
||||
|
||||
|
||||
PROCEDURE LoadLib* (name: ARRAY OF CHAR): INTEGER;
|
||||
VAR
|
||||
Lib: INTEGER;
|
||||
BEGIN
|
||||
DLL_INIT := dll_Init;
|
||||
Lib := sysfunc3(68, 19, SYSTEM.ADR(name[0]));
|
||||
IF Lib # 0 THEN
|
||||
init(Lib)
|
||||
END
|
||||
RETURN Lib
|
||||
END LoadLib;
|
||||
|
||||
|
||||
PROCEDURE _init* (import_table: INTEGER);
|
||||
BEGIN
|
||||
DLL_INIT := dll_Init;
|
||||
dll_Load(import_table)
|
||||
END _init;
|
||||
|
||||
|
||||
END KOSAPI.
|
||||
@@ -1,449 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2013-2014, 2018-2022 Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE Math;
|
||||
|
||||
IMPORT SYSTEM;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
pi* = 3.141592653589793;
|
||||
e* = 2.718281828459045;
|
||||
|
||||
|
||||
PROCEDURE IsNan* (x: REAL): BOOLEAN;
|
||||
VAR
|
||||
h, l: SET;
|
||||
|
||||
BEGIN
|
||||
SYSTEM.GET(SYSTEM.ADR(x), l);
|
||||
SYSTEM.GET(SYSTEM.ADR(x) + 4, h)
|
||||
RETURN (h * {20..30} = {20..30}) & ((h * {0..19} # {}) OR (l * {0..31} # {}))
|
||||
END IsNan;
|
||||
|
||||
|
||||
PROCEDURE IsInf* (x: REAL): BOOLEAN;
|
||||
RETURN ABS(x) = SYSTEM.INF()
|
||||
END IsInf;
|
||||
|
||||
|
||||
PROCEDURE Max (a, b: REAL): REAL;
|
||||
VAR
|
||||
res: REAL;
|
||||
|
||||
BEGIN
|
||||
IF a > b THEN
|
||||
res := a
|
||||
ELSE
|
||||
res := b
|
||||
END
|
||||
RETURN res
|
||||
END Max;
|
||||
|
||||
|
||||
PROCEDURE Min (a, b: REAL): REAL;
|
||||
VAR
|
||||
res: REAL;
|
||||
|
||||
BEGIN
|
||||
IF a < b THEN
|
||||
res := a
|
||||
ELSE
|
||||
res := b
|
||||
END
|
||||
RETURN res
|
||||
END Min;
|
||||
|
||||
|
||||
PROCEDURE SameValue (a, b: REAL): BOOLEAN;
|
||||
VAR
|
||||
eps: REAL;
|
||||
res: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
eps := Max(Min(ABS(a), ABS(b)) * 1.0E-12, 1.0E-12);
|
||||
IF a > b THEN
|
||||
res := (a - b) <= eps
|
||||
ELSE
|
||||
res := (b - a) <= eps
|
||||
END
|
||||
RETURN res
|
||||
END SameValue;
|
||||
|
||||
|
||||
PROCEDURE IsZero (x: REAL): BOOLEAN;
|
||||
RETURN ABS(x) <= 1.0E-12
|
||||
END IsZero;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] sqrt* (x: REAL): REAL;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
0DDH, 045H, 008H, (* fld qword [ebp + 08h] *)
|
||||
0D9H, 0FAH, (* fsqrt *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 008H, 000H (* ret 08h *)
|
||||
)
|
||||
RETURN 0.0
|
||||
END sqrt;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] sin* (x: REAL): REAL;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
0DDH, 045H, 008H, (* fld qword [ebp + 08h] *)
|
||||
0D9H, 0FEH, (* fsin *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 008H, 000H (* ret 08h *)
|
||||
)
|
||||
RETURN 0.0
|
||||
END sin;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] cos* (x: REAL): REAL;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
0DDH, 045H, 008H, (* fld qword [ebp + 08h] *)
|
||||
0D9H, 0FFH, (* fcos *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 008H, 000H (* ret 08h *)
|
||||
)
|
||||
RETURN 0.0
|
||||
END cos;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] tan* (x: REAL): REAL;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
0DDH, 045H, 008H, (* fld qword [ebp + 08h] *)
|
||||
0D9H, 0FBH, (* fsincos *)
|
||||
0DEH, 0F9H, (* fdivp st1, st *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 008H, 000H (* ret 08h *)
|
||||
)
|
||||
RETURN 0.0
|
||||
END tan;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] arctan2* (y, x: REAL): REAL;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
0DDH, 045H, 008H, (* fld qword [ebp + 08h] *)
|
||||
0DDH, 045H, 010H, (* fld qword [ebp + 10h] *)
|
||||
0D9H, 0F3H, (* fpatan *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 010H, 000H (* ret 10h *)
|
||||
)
|
||||
RETURN 0.0
|
||||
END arctan2;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] ln* (x: REAL): REAL;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
0D9H, 0EDH, (* fldln2 *)
|
||||
0DDH, 045H, 008H, (* fld qword [ebp + 08h] *)
|
||||
0D9H, 0F1H, (* fyl2x *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 008H, 000H (* ret 08h *)
|
||||
)
|
||||
RETURN 0.0
|
||||
END ln;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] log* (base, x: REAL): REAL;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
0D9H, 0E8H, (* fld1 *)
|
||||
0DDH, 045H, 010H, (* fld qword [ebp + 10h] *)
|
||||
0D9H, 0F1H, (* fyl2x *)
|
||||
0D9H, 0E8H, (* fld1 *)
|
||||
0DDH, 045H, 008H, (* fld qword [ebp + 08h] *)
|
||||
0D9H, 0F1H, (* fyl2x *)
|
||||
0DEH, 0F9H, (* fdivp st1, st *)
|
||||
0C9H, (* leave *)
|
||||
0C2H, 010H, 000H (* ret 10h *)
|
||||
)
|
||||
RETURN 0.0
|
||||
END log;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] exp* (x: REAL): REAL;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
0DDH, 045H, 008H, (* fld qword [ebp + 08h] *)
|
||||
0D9H, 0EAH, (* fldl2e *)
|
||||
0DEH, 0C9H, 0D9H, 0C0H,
|
||||
0D9H, 0FCH, 0DCH, 0E9H,
|
||||
0D9H, 0C9H, 0D9H, 0F0H,
|
||||
0D9H, 0E8H, 0DEH, 0C1H,
|
||||
0D9H, 0FDH, 0DDH, 0D9H,
|
||||
0C9H, (* leave *)
|
||||
0C2H, 008H, 000H (* ret 08h *)
|
||||
)
|
||||
RETURN 0.0
|
||||
END exp;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] round* (x: REAL): REAL;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
0DDH, 045H, 008H, (* fld qword [ebp + 08h] *)
|
||||
0D9H, 07DH, 0F4H, 0D9H,
|
||||
07DH, 0F6H, 066H, 081H,
|
||||
04DH, 0F6H, 000H, 003H,
|
||||
0D9H, 06DH, 0F6H, 0D9H,
|
||||
0FCH, 0D9H, 06DH, 0F4H,
|
||||
0C9H, (* leave *)
|
||||
0C2H, 008H, 000H (* ret 08h *)
|
||||
)
|
||||
RETURN 0.0
|
||||
END round;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] frac* (x: REAL): REAL;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
050H,
|
||||
0DDH, 045H, 008H, (* fld qword [ebp + 08h] *)
|
||||
0D9H, 0C0H, 0D9H, 03CH,
|
||||
024H, 0D9H, 07CH, 024H,
|
||||
002H, 066H, 081H, 04CH,
|
||||
024H, 002H, 000H, 00FH,
|
||||
0D9H, 06CH, 024H, 002H,
|
||||
0D9H, 0FCH, 0D9H, 02CH,
|
||||
024H, 0DEH, 0E9H,
|
||||
0C9H, (* leave *)
|
||||
0C2H, 008H, 000H (* ret 08h *)
|
||||
)
|
||||
RETURN 0.0
|
||||
END frac;
|
||||
|
||||
|
||||
PROCEDURE sqri* (x: INTEGER): INTEGER;
|
||||
RETURN x * x
|
||||
END sqri;
|
||||
|
||||
|
||||
PROCEDURE sqrr* (x: REAL): REAL;
|
||||
RETURN x * x
|
||||
END sqrr;
|
||||
|
||||
|
||||
PROCEDURE arcsin* (x: REAL): REAL;
|
||||
RETURN arctan2(x, sqrt(1.0 - x * x))
|
||||
END arcsin;
|
||||
|
||||
|
||||
PROCEDURE arccos* (x: REAL): REAL;
|
||||
RETURN arctan2(sqrt(1.0 - x * x), x)
|
||||
END arccos;
|
||||
|
||||
|
||||
PROCEDURE arctan* (x: REAL): REAL;
|
||||
RETURN arctan2(x, 1.0)
|
||||
END arctan;
|
||||
|
||||
|
||||
PROCEDURE sinh* (x: REAL): REAL;
|
||||
BEGIN
|
||||
x := exp(x)
|
||||
RETURN (x - 1.0 / x) * 0.5
|
||||
END sinh;
|
||||
|
||||
|
||||
PROCEDURE cosh* (x: REAL): REAL;
|
||||
BEGIN
|
||||
x := exp(x)
|
||||
RETURN (x + 1.0 / x) * 0.5
|
||||
END cosh;
|
||||
|
||||
|
||||
PROCEDURE tanh* (x: REAL): REAL;
|
||||
BEGIN
|
||||
IF x > 15.0 THEN
|
||||
x := 1.0
|
||||
ELSIF x < -15.0 THEN
|
||||
x := -1.0
|
||||
ELSE
|
||||
x := 1.0 - 2.0 / (exp(2.0 * x) + 1.0)
|
||||
END
|
||||
|
||||
RETURN x
|
||||
END tanh;
|
||||
|
||||
|
||||
PROCEDURE arsinh* (x: REAL): REAL;
|
||||
RETURN ln(x + sqrt(x * x + 1.0))
|
||||
END arsinh;
|
||||
|
||||
|
||||
PROCEDURE arcosh* (x: REAL): REAL;
|
||||
RETURN ln(x + sqrt(x * x - 1.0))
|
||||
END arcosh;
|
||||
|
||||
|
||||
PROCEDURE artanh* (x: REAL): REAL;
|
||||
VAR
|
||||
res: REAL;
|
||||
|
||||
BEGIN
|
||||
IF SameValue(x, 1.0) THEN
|
||||
res := SYSTEM.INF()
|
||||
ELSIF SameValue(x, -1.0) THEN
|
||||
res := -SYSTEM.INF()
|
||||
ELSE
|
||||
res := 0.5 * ln((1.0 + x) / (1.0 - x))
|
||||
END
|
||||
RETURN res
|
||||
END artanh;
|
||||
|
||||
|
||||
PROCEDURE floor* (x: REAL): REAL;
|
||||
VAR
|
||||
f: REAL;
|
||||
|
||||
BEGIN
|
||||
f := frac(x);
|
||||
x := x - f;
|
||||
IF f < 0.0 THEN
|
||||
x := x - 1.0
|
||||
END
|
||||
RETURN x
|
||||
END floor;
|
||||
|
||||
|
||||
PROCEDURE ceil* (x: REAL): REAL;
|
||||
VAR
|
||||
f: REAL;
|
||||
|
||||
BEGIN
|
||||
f := frac(x);
|
||||
x := x - f;
|
||||
IF f > 0.0 THEN
|
||||
x := x + 1.0
|
||||
END
|
||||
RETURN x
|
||||
END ceil;
|
||||
|
||||
|
||||
PROCEDURE power* (base, exponent: REAL): REAL;
|
||||
VAR
|
||||
res: REAL;
|
||||
|
||||
BEGIN
|
||||
IF exponent = 0.0 THEN
|
||||
res := 1.0
|
||||
ELSIF (base = 0.0) & (exponent > 0.0) THEN
|
||||
res := 0.0
|
||||
ELSE
|
||||
res := exp(exponent * ln(base))
|
||||
END
|
||||
RETURN res
|
||||
END power;
|
||||
|
||||
|
||||
PROCEDURE ipower* (base: REAL; exponent: INTEGER): REAL;
|
||||
VAR
|
||||
i: INTEGER;
|
||||
a: REAL;
|
||||
|
||||
BEGIN
|
||||
a := 1.0;
|
||||
|
||||
IF base # 0.0 THEN
|
||||
IF exponent # 0 THEN
|
||||
IF exponent < 0 THEN
|
||||
base := 1.0 / base
|
||||
END;
|
||||
i := ABS(exponent);
|
||||
WHILE i > 0 DO
|
||||
WHILE ~ODD(i) DO
|
||||
i := LSR(i, 1);
|
||||
base := sqrr(base)
|
||||
END;
|
||||
DEC(i);
|
||||
a := a * base
|
||||
END
|
||||
ELSE
|
||||
a := 1.0
|
||||
END
|
||||
ELSE
|
||||
ASSERT(exponent > 0);
|
||||
a := 0.0
|
||||
END
|
||||
|
||||
RETURN a
|
||||
END ipower;
|
||||
|
||||
|
||||
PROCEDURE sgn* (x: REAL): INTEGER;
|
||||
VAR
|
||||
res: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF x > 0.0 THEN
|
||||
res := 1
|
||||
ELSIF x < 0.0 THEN
|
||||
res := -1
|
||||
ELSE
|
||||
res := 0
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END sgn;
|
||||
|
||||
|
||||
PROCEDURE fact* (n: INTEGER): REAL;
|
||||
VAR
|
||||
res: REAL;
|
||||
|
||||
BEGIN
|
||||
res := 1.0;
|
||||
WHILE n > 1 DO
|
||||
res := res * FLT(n);
|
||||
DEC(n)
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END fact;
|
||||
|
||||
|
||||
PROCEDURE DegToRad* (x: REAL): REAL;
|
||||
RETURN x * (pi / 180.0)
|
||||
END DegToRad;
|
||||
|
||||
|
||||
PROCEDURE RadToDeg* (x: REAL): REAL;
|
||||
RETURN x * (180.0 / pi)
|
||||
END RadToDeg;
|
||||
|
||||
|
||||
(* Return hypotenuse of triangle *)
|
||||
PROCEDURE hypot* (x, y: REAL): REAL;
|
||||
VAR
|
||||
a: REAL;
|
||||
|
||||
BEGIN
|
||||
x := ABS(x);
|
||||
y := ABS(y);
|
||||
IF x > y THEN
|
||||
a := x * sqrt(1.0 + sqrr(y / x))
|
||||
ELSE
|
||||
IF x > 0.0 THEN
|
||||
a := y * sqrt(1.0 + sqrr(x / y))
|
||||
ELSE
|
||||
a := y
|
||||
END
|
||||
END
|
||||
|
||||
RETURN a
|
||||
END hypot;
|
||||
|
||||
|
||||
END Math.
|
||||
@@ -1,107 +0,0 @@
|
||||
(*
|
||||
Copyright 2017 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE NetDevices;
|
||||
|
||||
IMPORT sys := SYSTEM, K := KOSAPI;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
//net devices types
|
||||
|
||||
LOOPBACK* = 0;
|
||||
ETH* = 1;
|
||||
SLIP* = 2;
|
||||
|
||||
//Link status
|
||||
|
||||
LINK_DOWN* = 0;
|
||||
LINK_UNKNOWN* = 1;
|
||||
LINK_FD* = 2; //full duplex flag
|
||||
LINK_10M* = 4;
|
||||
LINK_100M* = 8;
|
||||
LINK_1G* = 12;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
DEVICENAME* = ARRAY 64 OF CHAR;
|
||||
|
||||
|
||||
PROCEDURE Number* (): INTEGER;
|
||||
RETURN K.sysfunc2(74, -1)
|
||||
END Number;
|
||||
|
||||
|
||||
PROCEDURE Type* (num: INTEGER): INTEGER;
|
||||
RETURN K.sysfunc2(74, num * 256)
|
||||
END Type;
|
||||
|
||||
|
||||
PROCEDURE Name* (num: INTEGER; VAR name: DEVICENAME): BOOLEAN;
|
||||
VAR err: BOOLEAN;
|
||||
BEGIN
|
||||
err := K.sysfunc3(74, num * 256 + 1, sys.ADR(name[0])) = -1;
|
||||
IF err THEN
|
||||
name := ""
|
||||
END
|
||||
RETURN ~err
|
||||
END Name;
|
||||
|
||||
|
||||
PROCEDURE Reset* (num: INTEGER): BOOLEAN;
|
||||
RETURN K.sysfunc2(74, num * 256 + 2) # -1
|
||||
END Reset;
|
||||
|
||||
|
||||
PROCEDURE Stop* (num: INTEGER): BOOLEAN;
|
||||
RETURN K.sysfunc2(74, num * 256 + 3) # -1
|
||||
END Stop;
|
||||
|
||||
|
||||
PROCEDURE Pointer* (num: INTEGER): INTEGER;
|
||||
RETURN K.sysfunc2(74, num * 256 + 4)
|
||||
END Pointer;
|
||||
|
||||
|
||||
PROCEDURE SentPackets* (num: INTEGER): INTEGER;
|
||||
RETURN K.sysfunc2(74, num * 256 + 6)
|
||||
END SentPackets;
|
||||
|
||||
|
||||
PROCEDURE ReceivedPackets* (num: INTEGER): INTEGER;
|
||||
RETURN K.sysfunc2(74, num * 256 + 7)
|
||||
END ReceivedPackets;
|
||||
|
||||
|
||||
PROCEDURE SentBytes* (num: INTEGER; VAR hValue: INTEGER): INTEGER;
|
||||
RETURN K.sysfunc22(74, num * 256 + 8, hValue)
|
||||
END SentBytes;
|
||||
|
||||
|
||||
PROCEDURE ReceivedBytes* (num: INTEGER; VAR hValue: INTEGER): INTEGER;
|
||||
RETURN K.sysfunc22(74, num * 256 + 9, hValue)
|
||||
END ReceivedBytes;
|
||||
|
||||
|
||||
PROCEDURE LinkStatus* (num: INTEGER): INTEGER;
|
||||
RETURN K.sysfunc2(74, num * 256 + 10)
|
||||
END LinkStatus;
|
||||
|
||||
|
||||
END NetDevices.
|
||||
@@ -1,158 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018, 2020-2022 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE OpenDlg;
|
||||
|
||||
IMPORT sys := SYSTEM, KOSAPI;
|
||||
|
||||
CONST
|
||||
topen* = 0;
|
||||
tsave* = 1;
|
||||
tdir* = 2;
|
||||
|
||||
TYPE
|
||||
|
||||
DRAW_WINDOW = PROCEDURE;
|
||||
|
||||
TDialog = RECORD
|
||||
_type*,
|
||||
procinfo,
|
||||
com_area_name,
|
||||
com_area,
|
||||
opendir_path,
|
||||
dir_default_path,
|
||||
start_path: INTEGER;
|
||||
draw_window: DRAW_WINDOW;
|
||||
status*,
|
||||
openfile_path,
|
||||
filename_area: INTEGER;
|
||||
filter_area:
|
||||
POINTER TO RECORD
|
||||
size: INTEGER;
|
||||
filter: ARRAY 4096 OF CHAR
|
||||
END;
|
||||
X, Y: INTEGER;
|
||||
|
||||
procinf: ARRAY 1024 OF CHAR;
|
||||
s_com_area_name: ARRAY 32 OF CHAR;
|
||||
s_opendir_path,
|
||||
s_dir_default_path,
|
||||
FilePath*,
|
||||
FileName*: ARRAY 4096 OF CHAR
|
||||
END;
|
||||
|
||||
Dialog* = POINTER TO TDialog;
|
||||
|
||||
VAR
|
||||
|
||||
Dialog_start, Dialog_init: PROCEDURE [stdcall] (od: Dialog);
|
||||
|
||||
|
||||
PROCEDURE Show*(od: Dialog; Width, Height: INTEGER);
|
||||
BEGIN
|
||||
IF od # NIL THEN
|
||||
od.X := Width;
|
||||
od.Y := Height;
|
||||
Dialog_start(od)
|
||||
END
|
||||
END Show;
|
||||
|
||||
PROCEDURE Create*(draw_window: DRAW_WINDOW; _type: INTEGER; def_path, filter: ARRAY OF CHAR): Dialog;
|
||||
VAR res: Dialog; n, i: INTEGER;
|
||||
|
||||
PROCEDURE replace(VAR str: ARRAY OF CHAR; c1, c2: CHAR);
|
||||
VAR i: INTEGER;
|
||||
BEGIN
|
||||
i := LENGTH(str) - 1;
|
||||
WHILE i >= 0 DO
|
||||
IF str[i] = c1 THEN
|
||||
str[i] := c2
|
||||
END;
|
||||
DEC(i)
|
||||
END
|
||||
END replace;
|
||||
|
||||
BEGIN
|
||||
NEW(res);
|
||||
IF res # NIL THEN
|
||||
NEW(res.filter_area);
|
||||
IF res.filter_area # NIL THEN
|
||||
res.s_com_area_name := "FFFFFFFF_open_dialog";
|
||||
res.com_area := 0;
|
||||
res._type := _type;
|
||||
res.draw_window := draw_window;
|
||||
COPY(def_path, res.s_dir_default_path);
|
||||
COPY(filter, res.filter_area.filter);
|
||||
|
||||
n := LENGTH(res.filter_area.filter);
|
||||
FOR i := 0 TO 3 DO
|
||||
res.filter_area.filter[n + i] := "|"
|
||||
END;
|
||||
res.filter_area.filter[n + 4] := 0X;
|
||||
|
||||
res.X := 0;
|
||||
res.Y := 0;
|
||||
res.s_opendir_path := res.s_dir_default_path;
|
||||
res.FilePath := "";
|
||||
res.FileName := "";
|
||||
res.status := 0;
|
||||
res.filter_area.size := LENGTH(res.filter_area.filter);
|
||||
res.procinfo := sys.ADR(res.procinf[0]);
|
||||
res.com_area_name := sys.ADR(res.s_com_area_name[0]);
|
||||
res.start_path := sys.SADR("/sys/File managers/opendial");
|
||||
res.opendir_path := sys.ADR(res.s_opendir_path[0]);
|
||||
res.dir_default_path := sys.ADR(res.s_dir_default_path[0]);
|
||||
res.openfile_path := sys.ADR(res.FilePath[0]);
|
||||
res.filename_area := sys.ADR(res.FileName[0]);
|
||||
|
||||
replace(res.filter_area.filter, "|", 0X);
|
||||
Dialog_init(res)
|
||||
ELSE
|
||||
DISPOSE(res)
|
||||
END
|
||||
END
|
||||
RETURN res
|
||||
END Create;
|
||||
|
||||
PROCEDURE Destroy*(VAR od: Dialog);
|
||||
BEGIN
|
||||
IF od # NIL THEN
|
||||
DISPOSE(od.filter_area);
|
||||
DISPOSE(od)
|
||||
END
|
||||
END Destroy;
|
||||
|
||||
PROCEDURE Load;
|
||||
VAR Lib: INTEGER;
|
||||
|
||||
PROCEDURE GetProc(Lib, v: INTEGER; name: ARRAY OF CHAR);
|
||||
VAR a: INTEGER;
|
||||
BEGIN
|
||||
a := KOSAPI.GetProcAdr(name, Lib);
|
||||
ASSERT(a # 0);
|
||||
sys.PUT(v, a)
|
||||
END GetProc;
|
||||
|
||||
BEGIN
|
||||
Lib := KOSAPI.LoadLib("/sys/Lib/Proc_lib.obj");
|
||||
GetProc(Lib, sys.ADR(Dialog_init), "OpenDialog_init");
|
||||
GetProc(Lib, sys.ADR(Dialog_start), "OpenDialog_start");
|
||||
END Load;
|
||||
|
||||
BEGIN
|
||||
Load
|
||||
END OpenDlg.
|
||||
@@ -1,267 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE Out;
|
||||
|
||||
IMPORT ConsoleLib, sys := SYSTEM;
|
||||
|
||||
CONST
|
||||
|
||||
d = 1.0 - 5.0E-12;
|
||||
|
||||
VAR
|
||||
|
||||
Realp: PROCEDURE (x: REAL; width: INTEGER);
|
||||
|
||||
PROCEDURE Char*(c: CHAR);
|
||||
BEGIN
|
||||
ConsoleLib.write_string(sys.ADR(c), 1)
|
||||
END Char;
|
||||
|
||||
PROCEDURE String*(s: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
ConsoleLib.write_string(sys.ADR(s[0]), LENGTH(s))
|
||||
END String;
|
||||
|
||||
PROCEDURE WriteInt(x, n: INTEGER);
|
||||
VAR i: INTEGER; a: ARRAY 16 OF CHAR; neg: BOOLEAN;
|
||||
BEGIN
|
||||
i := 0;
|
||||
IF n < 1 THEN
|
||||
n := 1
|
||||
END;
|
||||
IF x < 0 THEN
|
||||
x := -x;
|
||||
DEC(n);
|
||||
neg := TRUE
|
||||
END;
|
||||
REPEAT
|
||||
a[i] := CHR(x MOD 10 + ORD("0"));
|
||||
x := x DIV 10;
|
||||
INC(i)
|
||||
UNTIL x = 0;
|
||||
WHILE n > i DO
|
||||
Char(" ");
|
||||
DEC(n)
|
||||
END;
|
||||
IF neg THEN
|
||||
Char("-")
|
||||
END;
|
||||
REPEAT
|
||||
DEC(i);
|
||||
Char(a[i])
|
||||
UNTIL i = 0
|
||||
END WriteInt;
|
||||
|
||||
PROCEDURE IsNan(AValue: REAL): BOOLEAN;
|
||||
VAR h, l: SET;
|
||||
BEGIN
|
||||
sys.GET(sys.ADR(AValue), l);
|
||||
sys.GET(sys.ADR(AValue) + 4, h)
|
||||
RETURN (h * {20..30} = {20..30}) & ((h * {0..19} # {}) OR (l * {0..31} # {}))
|
||||
END IsNan;
|
||||
|
||||
PROCEDURE IsInf(x: REAL): BOOLEAN;
|
||||
RETURN ABS(x) = sys.INF()
|
||||
END IsInf;
|
||||
|
||||
PROCEDURE Int*(x, width: INTEGER);
|
||||
VAR i: INTEGER;
|
||||
BEGIN
|
||||
IF x # 80000000H THEN
|
||||
WriteInt(x, width)
|
||||
ELSE
|
||||
FOR i := 12 TO width DO
|
||||
Char(20X)
|
||||
END;
|
||||
String("-2147483648")
|
||||
END
|
||||
END Int;
|
||||
|
||||
PROCEDURE OutInf(x: REAL; width: INTEGER);
|
||||
VAR s: ARRAY 5 OF CHAR; i: INTEGER;
|
||||
BEGIN
|
||||
IF IsNan(x) THEN
|
||||
s := "Nan";
|
||||
INC(width)
|
||||
ELSIF IsInf(x) & (x > 0.0) THEN
|
||||
s := "+Inf"
|
||||
ELSIF IsInf(x) & (x < 0.0) THEN
|
||||
s := "-Inf"
|
||||
END;
|
||||
FOR i := 1 TO width - 4 DO
|
||||
Char(" ")
|
||||
END;
|
||||
String(s)
|
||||
END OutInf;
|
||||
|
||||
PROCEDURE Ln*;
|
||||
BEGIN
|
||||
Char(0DX);
|
||||
Char(0AX)
|
||||
END Ln;
|
||||
|
||||
PROCEDURE _FixReal(x: REAL; width, p: INTEGER);
|
||||
VAR e, len, i: INTEGER; y: REAL; minus: BOOLEAN;
|
||||
BEGIN
|
||||
IF IsNan(x) OR IsInf(x) THEN
|
||||
OutInf(x, width)
|
||||
ELSIF p < 0 THEN
|
||||
Realp(x, width)
|
||||
ELSE
|
||||
len := 0;
|
||||
minus := FALSE;
|
||||
IF x < 0.0 THEN
|
||||
minus := TRUE;
|
||||
INC(len);
|
||||
x := ABS(x)
|
||||
END;
|
||||
e := 0;
|
||||
WHILE x >= 10.0 DO
|
||||
x := x / 10.0;
|
||||
INC(e)
|
||||
END;
|
||||
IF e >= 0 THEN
|
||||
len := len + e + p + 1;
|
||||
IF x > 9.0 + d THEN
|
||||
INC(len)
|
||||
END;
|
||||
IF p > 0 THEN
|
||||
INC(len)
|
||||
END
|
||||
ELSE
|
||||
len := len + p + 2
|
||||
END;
|
||||
FOR i := 1 TO width - len DO
|
||||
Char(" ")
|
||||
END;
|
||||
IF minus THEN
|
||||
Char("-")
|
||||
END;
|
||||
y := x;
|
||||
WHILE (y < 1.0) & (y # 0.0) DO
|
||||
y := y * 10.0;
|
||||
DEC(e)
|
||||
END;
|
||||
IF e < 0 THEN
|
||||
IF x - FLT(FLOOR(x)) > d THEN
|
||||
Char("1");
|
||||
x := 0.0
|
||||
ELSE
|
||||
Char("0");
|
||||
x := x * 10.0
|
||||
END
|
||||
ELSE
|
||||
WHILE e >= 0 DO
|
||||
IF x - FLT(FLOOR(x)) > d THEN
|
||||
IF x > 9.0 THEN
|
||||
String("10")
|
||||
ELSE
|
||||
Char(CHR(FLOOR(x) + ORD("0") + 1))
|
||||
END;
|
||||
x := 0.0
|
||||
ELSE
|
||||
Char(CHR(FLOOR(x) + ORD("0")));
|
||||
x := (x - FLT(FLOOR(x))) * 10.0
|
||||
END;
|
||||
DEC(e)
|
||||
END
|
||||
END;
|
||||
IF p > 0 THEN
|
||||
Char(".")
|
||||
END;
|
||||
WHILE p > 0 DO
|
||||
IF x - FLT(FLOOR(x)) > d THEN
|
||||
Char(CHR(FLOOR(x) + ORD("0") + 1));
|
||||
x := 0.0
|
||||
ELSE
|
||||
Char(CHR(FLOOR(x) + ORD("0")));
|
||||
x := (x - FLT(FLOOR(x))) * 10.0
|
||||
END;
|
||||
DEC(p)
|
||||
END
|
||||
END
|
||||
END _FixReal;
|
||||
|
||||
PROCEDURE Real*(x: REAL; width: INTEGER);
|
||||
VAR e, n, i: INTEGER; minus: BOOLEAN;
|
||||
BEGIN
|
||||
IF IsNan(x) OR IsInf(x) THEN
|
||||
OutInf(x, width)
|
||||
ELSE
|
||||
e := 0;
|
||||
n := 0;
|
||||
IF width > 23 THEN
|
||||
n := width - 23;
|
||||
width := 23
|
||||
ELSIF width < 9 THEN
|
||||
width := 9
|
||||
END;
|
||||
width := width - 5;
|
||||
IF x < 0.0 THEN
|
||||
x := -x;
|
||||
minus := TRUE
|
||||
ELSE
|
||||
minus := FALSE
|
||||
END;
|
||||
WHILE x >= 10.0 DO
|
||||
x := x / 10.0;
|
||||
INC(e)
|
||||
END;
|
||||
WHILE (x < 1.0) & (x # 0.0) DO
|
||||
x := x * 10.0;
|
||||
DEC(e)
|
||||
END;
|
||||
IF x > 9.0 + d THEN
|
||||
x := 1.0;
|
||||
INC(e)
|
||||
END;
|
||||
FOR i := 1 TO n DO
|
||||
Char(" ")
|
||||
END;
|
||||
IF minus THEN
|
||||
x := -x
|
||||
END;
|
||||
Realp := Real;
|
||||
_FixReal(x, width, width - 3);
|
||||
Char("E");
|
||||
IF e >= 0 THEN
|
||||
Char("+")
|
||||
ELSE
|
||||
Char("-");
|
||||
e := ABS(e)
|
||||
END;
|
||||
IF e < 100 THEN
|
||||
Char("0")
|
||||
END;
|
||||
IF e < 10 THEN
|
||||
Char("0")
|
||||
END;
|
||||
Int(e, 0)
|
||||
END
|
||||
END Real;
|
||||
|
||||
PROCEDURE FixReal*(x: REAL; width, p: INTEGER);
|
||||
BEGIN
|
||||
Realp := Real;
|
||||
_FixReal(x, width, p)
|
||||
END FixReal;
|
||||
|
||||
PROCEDURE Open*;
|
||||
END Open;
|
||||
|
||||
END Out.
|
||||
@@ -1,543 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2021, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE RTL;
|
||||
|
||||
IMPORT SYSTEM, API;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
minint = ROR(1, 1);
|
||||
|
||||
WORD = API.BIT_DEPTH DIV 8;
|
||||
|
||||
|
||||
VAR
|
||||
|
||||
name: INTEGER;
|
||||
types: INTEGER;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _move* (bytes, dest, source: INTEGER);
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
08BH, 045H, 008H, (* mov eax, dword [ebp + 8] *)
|
||||
085H, 0C0H, (* test eax, eax *)
|
||||
07EH, 019H, (* jle L *)
|
||||
0FCH, (* cld *)
|
||||
057H, (* push edi *)
|
||||
056H, (* push esi *)
|
||||
08BH, 075H, 010H, (* mov esi, dword [ebp + 16] *)
|
||||
08BH, 07DH, 00CH, (* mov edi, dword [ebp + 12] *)
|
||||
089H, 0C1H, (* mov ecx, eax *)
|
||||
0C1H, 0E9H, 002H, (* shr ecx, 2 *)
|
||||
0F3H, 0A5H, (* rep movsd *)
|
||||
089H, 0C1H, (* mov ecx, eax *)
|
||||
083H, 0E1H, 003H, (* and ecx, 3 *)
|
||||
0F3H, 0A4H, (* rep movsb *)
|
||||
05EH, (* pop esi *)
|
||||
05FH (* pop edi *)
|
||||
(* L: *)
|
||||
)
|
||||
END _move;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _arrcpy* (base_size, len_dst, dst, len_src, src: INTEGER): BOOLEAN;
|
||||
VAR
|
||||
res: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
IF len_src > len_dst THEN
|
||||
res := FALSE
|
||||
ELSE
|
||||
_move(len_src * base_size, dst, src);
|
||||
res := TRUE
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END _arrcpy;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _strcpy* (chr_size, len_src, src, len_dst, dst: INTEGER);
|
||||
BEGIN
|
||||
_move(MIN(len_dst, len_src) * chr_size, dst, src)
|
||||
END _strcpy;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _rot* (Len, Ptr: INTEGER);
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
08BH, 04DH, 008H, (* mov ecx, dword [ebp + 8] *) (* ecx <- Len *)
|
||||
08BH, 045H, 00CH, (* mov eax, dword [ebp + 12] *) (* eax <- Ptr *)
|
||||
049H, (* dec ecx *)
|
||||
053H, (* push ebx *)
|
||||
08BH, 018H, (* mov ebx, dword [eax] *)
|
||||
(* L: *)
|
||||
08BH, 050H, 004H, (* mov edx, dword [eax + 4] *)
|
||||
089H, 010H, (* mov dword [eax], edx *)
|
||||
083H, 0C0H, 004H, (* add eax, 4 *)
|
||||
049H, (* dec ecx *)
|
||||
075H, 0F5H, (* jnz L *)
|
||||
089H, 018H, (* mov dword [eax], ebx *)
|
||||
05BH, (* pop ebx *)
|
||||
05DH, (* pop ebp *)
|
||||
0C2H, 008H, 000H (* ret 8 *)
|
||||
)
|
||||
END _rot;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _set* (b, a: INTEGER); (* {a..b} -> eax *)
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
08BH, 04DH, 008H, (* mov ecx, dword [ebp + 8] *) (* ecx <- b *)
|
||||
08BH, 045H, 00CH, (* mov eax, dword [ebp + 12] *) (* eax <- a *)
|
||||
039H, 0C8H, (* cmp eax, ecx *)
|
||||
07FH, 033H, (* jg L1 *)
|
||||
083H, 0F8H, 01FH, (* cmp eax, 31 *)
|
||||
07FH, 02EH, (* jg L1 *)
|
||||
085H, 0C9H, (* test ecx, ecx *)
|
||||
07CH, 02AH, (* jl L1 *)
|
||||
083H, 0F9H, 01FH, (* cmp ecx, 31 *)
|
||||
07EH, 005H, (* jle L3 *)
|
||||
0B9H, 01FH, 000H, 000H, 000H, (* mov ecx, 31 *)
|
||||
(* L3: *)
|
||||
085H, 0C0H, (* test eax, eax *)
|
||||
07DH, 002H, (* jge L2 *)
|
||||
031H, 0C0H, (* xor eax, eax *)
|
||||
(* L2: *)
|
||||
089H, 0CAH, (* mov edx, ecx *)
|
||||
029H, 0C2H, (* sub edx, eax *)
|
||||
0B8H, 000H, 000H, 000H, 080H, (* mov eax, 0x80000000 *)
|
||||
087H, 0CAH, (* xchg edx, ecx *)
|
||||
0D3H, 0F8H, (* sar eax, cl *)
|
||||
087H, 0CAH, (* xchg edx, ecx *)
|
||||
083H, 0E9H, 01FH, (* sub ecx, 31 *)
|
||||
0F7H, 0D9H, (* neg ecx *)
|
||||
0D3H, 0E8H, (* shr eax, cl *)
|
||||
05DH, (* pop ebp *)
|
||||
0C2H, 008H, 000H, (* ret 8 *)
|
||||
(* L1: *)
|
||||
031H, 0C0H, (* xor eax, eax *)
|
||||
05DH, (* pop ebp *)
|
||||
0C2H, 008H, 000H (* ret 8 *)
|
||||
)
|
||||
END _set;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _set1* (a: INTEGER); (* {a} -> eax *)
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
031H, 0C0H, (* xor eax, eax *)
|
||||
08BH, 04DH, 008H, (* mov ecx, dword [ebp + 8] *) (* ecx <- a *)
|
||||
083H, 0F9H, 01FH, (* cmp ecx, 31 *)
|
||||
077H, 003H, (* ja L *)
|
||||
00FH, 0ABH, 0C8H (* bts eax, ecx *)
|
||||
(* L: *)
|
||||
)
|
||||
END _set1;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _divmod* (y, x: INTEGER); (* (x div y) -> eax; (x mod y) -> edx *)
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
053H, (* push ebx *)
|
||||
08BH, 045H, 00CH, (* mov eax, dword [ebp + 12] *) (* eax <- x *)
|
||||
031H, 0D2H, (* xor edx, edx *)
|
||||
085H, 0C0H, (* test eax, eax *)
|
||||
074H, 018H, (* je L2 *)
|
||||
07FH, 002H, (* jg L1 *)
|
||||
0F7H, 0D2H, (* not edx *)
|
||||
(* L1: *)
|
||||
089H, 0C3H, (* mov ebx, eax *)
|
||||
08BH, 04DH, 008H, (* mov ecx, dword [ebp + 8] *) (* ecx <- y *)
|
||||
0F7H, 0F9H, (* idiv ecx *)
|
||||
085H, 0D2H, (* test edx, edx *)
|
||||
074H, 009H, (* je L2 *)
|
||||
031H, 0CBH, (* xor ebx, ecx *)
|
||||
085H, 0DBH, (* test ebx, ebx *)
|
||||
07DH, 003H, (* jge L2 *)
|
||||
048H, (* dec eax *)
|
||||
001H, 0CAH, (* add edx, ecx *)
|
||||
(* L2: *)
|
||||
05BH (* pop ebx *)
|
||||
)
|
||||
END _divmod;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _new* (t, size: INTEGER; VAR ptr: INTEGER);
|
||||
BEGIN
|
||||
ptr := API._NEW(size);
|
||||
IF ptr # 0 THEN
|
||||
SYSTEM.PUT(ptr, t);
|
||||
INC(ptr, WORD)
|
||||
END
|
||||
END _new;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _dispose* (VAR ptr: INTEGER);
|
||||
BEGIN
|
||||
IF ptr # 0 THEN
|
||||
ptr := API._DISPOSE(ptr - WORD)
|
||||
END
|
||||
END _dispose;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _length* (len, str: INTEGER);
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
08BH, 045H, 00CH, (* mov eax, dword [ebp + 0Ch] *)
|
||||
08BH, 04DH, 008H, (* mov ecx, dword [ebp + 08h] *)
|
||||
048H, (* dec eax *)
|
||||
(* L1: *)
|
||||
040H, (* inc eax *)
|
||||
080H, 038H, 000H, (* cmp byte [eax], 0 *)
|
||||
074H, 003H, (* jz L2 *)
|
||||
0E2H, 0F8H, (* loop L1 *)
|
||||
040H, (* inc eax *)
|
||||
(* L2: *)
|
||||
02BH, 045H, 00CH (* sub eax, dword [ebp + 0Ch] *)
|
||||
)
|
||||
END _length;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _lengthw* (len, str: INTEGER);
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
08BH, 045H, 00CH, (* mov eax, dword [ebp + 0Ch] *)
|
||||
08BH, 04DH, 008H, (* mov ecx, dword [ebp + 08h] *)
|
||||
048H, (* dec eax *)
|
||||
048H, (* dec eax *)
|
||||
(* L1: *)
|
||||
040H, (* inc eax *)
|
||||
040H, (* inc eax *)
|
||||
066H, 083H, 038H, 000H, (* cmp word [eax], 0 *)
|
||||
074H, 004H, (* jz L2 *)
|
||||
0E2H, 0F6H, (* loop L1 *)
|
||||
040H, (* inc eax *)
|
||||
040H, (* inc eax *)
|
||||
(* L2: *)
|
||||
02BH, 045H, 00CH, (* sub eax, dword [ebp + 0Ch] *)
|
||||
0D1H, 0E8H (* shr eax, 1 *)
|
||||
)
|
||||
END _lengthw;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] strncmp (a, b, n: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
056H, (* push esi *)
|
||||
057H, (* push edi *)
|
||||
053H, (* push ebx *)
|
||||
08BH, 075H, 008H, (* mov esi, dword[ebp + 8]; esi <- a *)
|
||||
08BH, 07DH, 00CH, (* mov edi, dword[ebp + 12]; edi <- b *)
|
||||
08BH, 05DH, 010H, (* mov ebx, dword[ebp + 16]; ebx <- n *)
|
||||
031H, 0C9H, (* xor ecx, ecx *)
|
||||
031H, 0D2H, (* xor edx, edx *)
|
||||
0B8H,
|
||||
000H, 000H, 000H, 080H, (* mov eax, minint *)
|
||||
(* L1: *)
|
||||
085H, 0DBH, (* test ebx, ebx *)
|
||||
07EH, 017H, (* jle L3 *)
|
||||
08AH, 00EH, (* mov cl, byte[esi] *)
|
||||
08AH, 017H, (* mov dl, byte[edi] *)
|
||||
046H, (* inc esi *)
|
||||
047H, (* inc edi *)
|
||||
04BH, (* dec ebx *)
|
||||
039H, 0D1H, (* cmp ecx, edx *)
|
||||
074H, 006H, (* je L2 *)
|
||||
089H, 0C8H, (* mov eax, ecx *)
|
||||
029H, 0D0H, (* sub eax, edx *)
|
||||
0EBH, 006H, (* jmp L3 *)
|
||||
(* L2: *)
|
||||
085H, 0C9H, (* test ecx, ecx *)
|
||||
075H, 0E7H, (* jne L1 *)
|
||||
031H, 0C0H, (* xor eax, eax *)
|
||||
(* L3: *)
|
||||
05BH, (* pop ebx *)
|
||||
05FH, (* pop edi *)
|
||||
05EH, (* pop esi *)
|
||||
05DH, (* pop ebp *)
|
||||
0C2H, 00CH, 000H (* ret 12 *)
|
||||
)
|
||||
RETURN 0
|
||||
END strncmp;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] strncmpw (a, b, n: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
056H, (* push esi *)
|
||||
057H, (* push edi *)
|
||||
053H, (* push ebx *)
|
||||
08BH, 075H, 008H, (* mov esi, dword[ebp + 8]; esi <- a *)
|
||||
08BH, 07DH, 00CH, (* mov edi, dword[ebp + 12]; edi <- b *)
|
||||
08BH, 05DH, 010H, (* mov ebx, dword[ebp + 16]; ebx <- n *)
|
||||
031H, 0C9H, (* xor ecx, ecx *)
|
||||
031H, 0D2H, (* xor edx, edx *)
|
||||
0B8H,
|
||||
000H, 000H, 000H, 080H, (* mov eax, minint *)
|
||||
(* L1: *)
|
||||
085H, 0DBH, (* test ebx, ebx *)
|
||||
07EH, 01BH, (* jle L3 *)
|
||||
066H, 08BH, 00EH, (* mov cx, word[esi] *)
|
||||
066H, 08BH, 017H, (* mov dx, word[edi] *)
|
||||
046H, (* inc esi *)
|
||||
046H, (* inc esi *)
|
||||
047H, (* inc edi *)
|
||||
047H, (* inc edi *)
|
||||
04BH, (* dec ebx *)
|
||||
039H, 0D1H, (* cmp ecx, edx *)
|
||||
074H, 006H, (* je L2 *)
|
||||
089H, 0C8H, (* mov eax, ecx *)
|
||||
029H, 0D0H, (* sub eax, edx *)
|
||||
0EBH, 006H, (* jmp L3 *)
|
||||
(* L2: *)
|
||||
085H, 0C9H, (* test ecx, ecx *)
|
||||
075H, 0E3H, (* jne L1 *)
|
||||
031H, 0C0H, (* xor eax, eax *)
|
||||
(* L3: *)
|
||||
05BH, (* pop ebx *)
|
||||
05FH, (* pop edi *)
|
||||
05EH, (* pop esi *)
|
||||
05DH, (* pop ebp *)
|
||||
0C2H, 00CH, 000H (* ret 12 *)
|
||||
)
|
||||
RETURN 0
|
||||
END strncmpw;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _strcmp* (op, len2, str2, len1, str1: INTEGER): BOOLEAN;
|
||||
VAR
|
||||
res: INTEGER;
|
||||
bRes: BOOLEAN;
|
||||
c: CHAR;
|
||||
|
||||
BEGIN
|
||||
res := strncmp(str1, str2, MIN(len1, len2));
|
||||
IF res = minint THEN
|
||||
IF len1 > len2 THEN
|
||||
SYSTEM.GET(str1 + len2, c);
|
||||
res := ORD(c)
|
||||
ELSIF len1 < len2 THEN
|
||||
SYSTEM.GET(str2 + len1, c);
|
||||
res := -ORD(c)
|
||||
ELSE
|
||||
res := 0
|
||||
END
|
||||
END;
|
||||
|
||||
CASE op OF
|
||||
|0: bRes := res = 0
|
||||
|1: bRes := res # 0
|
||||
|2: bRes := res < 0
|
||||
|3: bRes := res <= 0
|
||||
|4: bRes := res > 0
|
||||
|5: bRes := res >= 0
|
||||
END
|
||||
|
||||
RETURN bRes
|
||||
END _strcmp;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _strcmpw* (op, len2, str2, len1, str1: INTEGER): BOOLEAN;
|
||||
VAR
|
||||
res: INTEGER;
|
||||
bRes: BOOLEAN;
|
||||
c: WCHAR;
|
||||
|
||||
BEGIN
|
||||
res := strncmpw(str1, str2, MIN(len1, len2));
|
||||
IF res = minint THEN
|
||||
IF len1 > len2 THEN
|
||||
SYSTEM.GET(str1 + len2 * 2, c);
|
||||
res := ORD(c)
|
||||
ELSIF len1 < len2 THEN
|
||||
SYSTEM.GET(str2 + len1 * 2, c);
|
||||
res := -ORD(c)
|
||||
ELSE
|
||||
res := 0
|
||||
END
|
||||
END;
|
||||
|
||||
CASE op OF
|
||||
|0: bRes := res = 0
|
||||
|1: bRes := res # 0
|
||||
|2: bRes := res < 0
|
||||
|3: bRes := res <= 0
|
||||
|4: bRes := res > 0
|
||||
|5: bRes := res >= 0
|
||||
END
|
||||
|
||||
RETURN bRes
|
||||
END _strcmpw;
|
||||
|
||||
|
||||
PROCEDURE PCharToStr (pchar: INTEGER; VAR s: ARRAY OF CHAR);
|
||||
VAR
|
||||
c: CHAR;
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
i := 0;
|
||||
REPEAT
|
||||
SYSTEM.GET(pchar, c);
|
||||
s[i] := c;
|
||||
INC(pchar);
|
||||
INC(i)
|
||||
UNTIL c = 0X
|
||||
END PCharToStr;
|
||||
|
||||
|
||||
PROCEDURE IntToStr (x: INTEGER; VAR str: ARRAY OF CHAR);
|
||||
VAR
|
||||
i, a: INTEGER;
|
||||
|
||||
BEGIN
|
||||
i := 0;
|
||||
a := x;
|
||||
REPEAT
|
||||
INC(i);
|
||||
a := a DIV 10
|
||||
UNTIL a = 0;
|
||||
|
||||
str[i] := 0X;
|
||||
|
||||
REPEAT
|
||||
DEC(i);
|
||||
str[i] := CHR(x MOD 10 + ORD("0"));
|
||||
x := x DIV 10
|
||||
UNTIL x = 0
|
||||
END IntToStr;
|
||||
|
||||
|
||||
PROCEDURE append (VAR s1: ARRAY OF CHAR; s2: ARRAY OF CHAR);
|
||||
VAR
|
||||
n1, n2: INTEGER;
|
||||
|
||||
BEGIN
|
||||
n1 := LENGTH(s1);
|
||||
n2 := LENGTH(s2);
|
||||
|
||||
ASSERT(n1 + n2 < LEN(s1));
|
||||
|
||||
SYSTEM.MOVE(SYSTEM.ADR(s2[0]), SYSTEM.ADR(s1[n1]), n2);
|
||||
s1[n1 + n2] := 0X
|
||||
END append;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _error* (modnum, _module, err, line: INTEGER);
|
||||
VAR
|
||||
s, temp: ARRAY 1024 OF CHAR;
|
||||
|
||||
BEGIN
|
||||
CASE err OF
|
||||
| 1: s := "assertion failure"
|
||||
| 2: s := "NIL dereference"
|
||||
| 3: s := "bad divisor"
|
||||
| 4: s := "NIL procedure call"
|
||||
| 5: s := "type guard error"
|
||||
| 6: s := "index out of range"
|
||||
| 7: s := "invalid CASE"
|
||||
| 8: s := "array assignment error"
|
||||
| 9: s := "CHR out of range"
|
||||
|10: s := "WCHR out of range"
|
||||
|11: s := "BYTE out of range"
|
||||
END;
|
||||
|
||||
append(s, API.eol + "module: "); PCharToStr(_module, temp); append(s, temp);
|
||||
append(s, API.eol + "line: "); IntToStr(line, temp); append(s, temp);
|
||||
|
||||
API.DebugMsg(SYSTEM.ADR(s[0]), name);
|
||||
|
||||
API.exit_thread(0)
|
||||
END _error;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _isrec* (t0, t1, r: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.GET(t0 + t1 + types, t0)
|
||||
RETURN t0 MOD 2
|
||||
END _isrec;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _is* (t0, p: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
IF p # 0 THEN
|
||||
SYSTEM.GET(p - WORD, p);
|
||||
SYSTEM.GET(t0 + p + types, p)
|
||||
END
|
||||
|
||||
RETURN p MOD 2
|
||||
END _is;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _guardrec* (t0, t1: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.GET(t0 + t1 + types, t0)
|
||||
RETURN t0 MOD 2
|
||||
END _guardrec;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _guard* (t0, p: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.GET(p, p);
|
||||
IF p # 0 THEN
|
||||
SYSTEM.GET(p - WORD, p);
|
||||
SYSTEM.GET(t0 + p + types, p)
|
||||
ELSE
|
||||
p := 1
|
||||
END
|
||||
|
||||
RETURN p MOD 2
|
||||
END _guard;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _dllentry* (hinstDLL, fdwReason, lpvReserved: INTEGER): INTEGER;
|
||||
RETURN API.dllentry(hinstDLL, fdwReason, lpvReserved)
|
||||
END _dllentry;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _sofinit*;
|
||||
BEGIN
|
||||
API.sofinit
|
||||
END _sofinit;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _exit* (code: INTEGER);
|
||||
BEGIN
|
||||
API.exit(code)
|
||||
END _exit;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _init* (modname: INTEGER; tcount, _types: INTEGER; code, param: INTEGER);
|
||||
VAR
|
||||
t0, t1, i, j: INTEGER;
|
||||
|
||||
BEGIN
|
||||
SYSTEM.CODE(09BH, 0DBH, 0E3H); (* finit *)
|
||||
API.init(param, code);
|
||||
|
||||
types := API._NEW(tcount * tcount + SYSTEM.SIZE(INTEGER));
|
||||
ASSERT(types # 0);
|
||||
FOR i := 0 TO tcount - 1 DO
|
||||
FOR j := 0 TO tcount - 1 DO
|
||||
t0 := i; t1 := j;
|
||||
|
||||
WHILE (t1 # 0) & (t1 # t0) DO
|
||||
SYSTEM.GET(_types + t1 * WORD, t1)
|
||||
END;
|
||||
|
||||
SYSTEM.PUT8(i * tcount + j + types, ORD(t0 = t1))
|
||||
END
|
||||
END;
|
||||
|
||||
name := modname
|
||||
END _init;
|
||||
|
||||
|
||||
END RTL.
|
||||
@@ -1,124 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018, 2022 KolibriOS team
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE RasterWorks;
|
||||
|
||||
IMPORT sys := SYSTEM, KOSAPI;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
(* flags *)
|
||||
|
||||
bold *= 1;
|
||||
italic *= 2;
|
||||
underline *= 4;
|
||||
strike_through *= 8;
|
||||
align_right *= 16;
|
||||
align_center *= 32;
|
||||
|
||||
bpp32 *= 128;
|
||||
|
||||
|
||||
(* encoding *)
|
||||
|
||||
cp866 *= 1;
|
||||
utf16le *= 2;
|
||||
utf8 *= 3;
|
||||
|
||||
|
||||
VAR
|
||||
|
||||
// draw text on 24bpp or 32bpp image
|
||||
// autofits text between 'x' and 'xSize'
|
||||
drawText *: PROCEDURE (canvas, x, y, string, charQuantity, fontColor, params: INTEGER): INTEGER;
|
||||
(*
|
||||
[canvas]:
|
||||
xSize dd ?
|
||||
ySize dd ?
|
||||
picture rb xSize * ySize * bpp
|
||||
|
||||
fontColor dd AARRGGBB
|
||||
AA = alpha channel ; 0 = transparent, FF = non transparent
|
||||
|
||||
params dd ffeewwhh
|
||||
hh = char height
|
||||
ww = char width ; 0 = auto (proportional)
|
||||
ee = encoding ; 1 = cp866, 2 = UTF-16LE, 3 = UTF-8
|
||||
ff = flags ; 0001 = bold, 0010 = italic
|
||||
; 0100 = underline, 1000 = strike-through
|
||||
00010000 = align right, 00100000 = align center
|
||||
01000000 = set text area between higher and lower halfs of 'x'
|
||||
10000000 = 32bpp canvas insted of 24bpp
|
||||
all flags combinable, except align right + align center
|
||||
|
||||
returns: char width (0 = error)
|
||||
*)
|
||||
|
||||
// calculate amount of valid chars in UTF-8 string
|
||||
// supports zero terminated string (set byteQuantity = -1)
|
||||
countUTF8Z *: PROCEDURE (string, byteQuantity: INTEGER): INTEGER;
|
||||
|
||||
|
||||
// calculate amount of chars that fits given width
|
||||
charsFit *: PROCEDURE (areaWidth, charHeight: INTEGER): INTEGER;
|
||||
|
||||
|
||||
// calculate string width in pixels
|
||||
strWidth *: PROCEDURE (charQuantity, charHeight: INTEGER): INTEGER;
|
||||
|
||||
|
||||
PROCEDURE params* (charHeight, charWidth, encoding, flags: INTEGER): INTEGER;
|
||||
(*
|
||||
hh = char height
|
||||
ww = char width ; 0 = auto (proportional)
|
||||
ee = encoding ; 1 = cp866, 2 = UTF-16LE, 3 = UTF-8
|
||||
ff = flags ; 0001 = bold, 0010 = italic
|
||||
; 0100 = underline, 1000 = strike-through
|
||||
00010000 = align right, 00100000 = align center
|
||||
01000000 = set text area between higher and lower halfs of 'x'
|
||||
10000000 = 32bpp canvas insted of 24bpp
|
||||
all flags combinable, except align right + align center
|
||||
*)
|
||||
RETURN charHeight + LSL(charWidth, 8) + LSL(encoding, 16) + LSL(flags, 24)
|
||||
END params;
|
||||
|
||||
|
||||
PROCEDURE main;
|
||||
VAR Lib: INTEGER;
|
||||
|
||||
PROCEDURE GetProc(Lib, v: INTEGER; name: ARRAY OF CHAR);
|
||||
VAR a: INTEGER;
|
||||
BEGIN
|
||||
a := KOSAPI.GetProcAdr(name, Lib);
|
||||
ASSERT(a # 0);
|
||||
sys.PUT(v, a)
|
||||
END GetProc;
|
||||
|
||||
BEGIN
|
||||
Lib := KOSAPI.LoadLib("/sys/lib/RasterWorks.obj");
|
||||
ASSERT(Lib # 0);
|
||||
GetProc(Lib, sys.ADR(drawText), "drawText");
|
||||
GetProc(Lib, sys.ADR(countUTF8Z), "countUTF8Z");
|
||||
GetProc(Lib, sys.ADR(charsFit), "charsFit");
|
||||
GetProc(Lib, sys.ADR(strWidth), "strWidth");
|
||||
END main;
|
||||
|
||||
|
||||
BEGIN
|
||||
main
|
||||
END RasterWorks.
|
||||
@@ -1,46 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE Read;
|
||||
|
||||
IMPORT File, sys := SYSTEM;
|
||||
|
||||
PROCEDURE Char*(F: File.FS; VAR x: CHAR): BOOLEAN;
|
||||
RETURN File.Read(F, sys.ADR(x), sys.SIZE(CHAR)) = sys.SIZE(CHAR)
|
||||
END Char;
|
||||
|
||||
PROCEDURE Int*(F: File.FS; VAR x: INTEGER): BOOLEAN;
|
||||
RETURN File.Read(F, sys.ADR(x), sys.SIZE(INTEGER)) = sys.SIZE(INTEGER)
|
||||
END Int;
|
||||
|
||||
PROCEDURE Real*(F: File.FS; VAR x: REAL): BOOLEAN;
|
||||
RETURN File.Read(F, sys.ADR(x), sys.SIZE(REAL)) = sys.SIZE(REAL)
|
||||
END Real;
|
||||
|
||||
PROCEDURE Boolean*(F: File.FS; VAR x: BOOLEAN): BOOLEAN;
|
||||
RETURN File.Read(F, sys.ADR(x), sys.SIZE(BOOLEAN)) = sys.SIZE(BOOLEAN)
|
||||
END Boolean;
|
||||
|
||||
PROCEDURE Set*(F: File.FS; VAR x: SET): BOOLEAN;
|
||||
RETURN File.Read(F, sys.ADR(x), sys.SIZE(SET)) = sys.SIZE(SET)
|
||||
END Set;
|
||||
|
||||
PROCEDURE WChar*(F: File.FS; VAR x: WCHAR): BOOLEAN;
|
||||
RETURN File.Read(F, sys.ADR(x), sys.SIZE(WCHAR)) = sys.SIZE(WCHAR)
|
||||
END WChar;
|
||||
|
||||
END Read.
|
||||
@@ -1,64 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2019, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE UnixTime;
|
||||
|
||||
|
||||
VAR
|
||||
|
||||
days: ARRAY 12, 31, 2 OF INTEGER;
|
||||
|
||||
|
||||
PROCEDURE init;
|
||||
VAR
|
||||
i, j, k, n0, n1: INTEGER;
|
||||
BEGIN
|
||||
|
||||
FOR i := 0 TO 11 DO
|
||||
FOR j := 0 TO 30 DO
|
||||
days[i, j, 0] := 0;
|
||||
days[i, j, 1] := 0;
|
||||
END
|
||||
END;
|
||||
|
||||
days[ 1, 28, 0] := -1;
|
||||
|
||||
FOR k := 0 TO 1 DO
|
||||
days[ 1, 29, k] := -1;
|
||||
days[ 1, 30, k] := -1;
|
||||
days[ 3, 30, k] := -1;
|
||||
days[ 5, 30, k] := -1;
|
||||
days[ 8, 30, k] := -1;
|
||||
days[10, 30, k] := -1;
|
||||
END;
|
||||
|
||||
n0 := 0;
|
||||
n1 := 0;
|
||||
FOR i := 0 TO 11 DO
|
||||
FOR j := 0 TO 30 DO
|
||||
IF days[i, j, 0] = 0 THEN
|
||||
days[i, j, 0] := n0;
|
||||
INC(n0)
|
||||
END;
|
||||
IF days[i, j, 1] = 0 THEN
|
||||
days[i, j, 1] := n1;
|
||||
INC(n1)
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
END init;
|
||||
|
||||
|
||||
PROCEDURE time* (year, month, day, hour, min, sec: INTEGER): INTEGER;
|
||||
RETURN ((year - 1970) * 365 + days[month - 1, day - 1, ORD(year DIV 4 = 0)] + (year - 1969) DIV 4) * 86400 + hour * 3600 + min * 60 + sec
|
||||
END time;
|
||||
|
||||
|
||||
BEGIN
|
||||
init
|
||||
END UnixTime.
|
||||
@@ -1,121 +0,0 @@
|
||||
(*
|
||||
Copyright 2016 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE Vector;
|
||||
|
||||
|
||||
IMPORT sys := SYSTEM, K := KOSAPI;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
DESC_VECTOR = RECORD
|
||||
|
||||
data : INTEGER;
|
||||
count : INTEGER;
|
||||
size : INTEGER
|
||||
|
||||
END;
|
||||
|
||||
VECTOR* = POINTER TO DESC_VECTOR;
|
||||
|
||||
ANYREC* = RECORD END;
|
||||
|
||||
ANYPTR* = POINTER TO ANYREC;
|
||||
|
||||
DESTRUCTOR* = PROCEDURE (VAR ptr: ANYPTR);
|
||||
|
||||
|
||||
PROCEDURE count* (vector: VECTOR): INTEGER;
|
||||
BEGIN
|
||||
ASSERT(vector # NIL)
|
||||
RETURN vector.count
|
||||
END count;
|
||||
|
||||
|
||||
PROCEDURE push* (vector: VECTOR; value: ANYPTR);
|
||||
BEGIN
|
||||
ASSERT(vector # NIL);
|
||||
IF vector.count = vector.size THEN
|
||||
vector.data := K.realloc(vector.data, (vector.size + 1024) * 4);
|
||||
ASSERT(vector.data # 0);
|
||||
vector.size := vector.size + 1024
|
||||
END;
|
||||
sys.PUT(vector.data + vector.count * 4, value);
|
||||
INC(vector.count)
|
||||
END push;
|
||||
|
||||
|
||||
PROCEDURE get* (vector: VECTOR; idx: INTEGER): ANYPTR;
|
||||
VAR res: ANYPTR;
|
||||
BEGIN
|
||||
ASSERT(vector # NIL);
|
||||
ASSERT( (0 <= idx) & (idx < vector.count) );
|
||||
sys.GET(vector.data + idx * 4, res)
|
||||
RETURN res
|
||||
END get;
|
||||
|
||||
|
||||
PROCEDURE put* (vector: VECTOR; idx: INTEGER; value: ANYPTR);
|
||||
BEGIN
|
||||
ASSERT(vector # NIL);
|
||||
ASSERT( (0 <= idx) & (idx < vector.count) );
|
||||
sys.PUT(vector.data + idx * 4, value)
|
||||
END put;
|
||||
|
||||
|
||||
PROCEDURE create* (size: INTEGER): VECTOR;
|
||||
VAR vector: VECTOR;
|
||||
BEGIN
|
||||
NEW(vector);
|
||||
IF vector # NIL THEN
|
||||
vector.data := K.malloc(4 * size);
|
||||
IF vector.data # 0 THEN
|
||||
vector.size := size;
|
||||
vector.count := 0
|
||||
ELSE
|
||||
DISPOSE(vector)
|
||||
END
|
||||
END
|
||||
RETURN vector
|
||||
END create;
|
||||
|
||||
|
||||
PROCEDURE def_destructor (VAR any: ANYPTR);
|
||||
BEGIN
|
||||
DISPOSE(any)
|
||||
END def_destructor;
|
||||
|
||||
|
||||
PROCEDURE destroy* (VAR vector: VECTOR; destructor: DESTRUCTOR);
|
||||
VAR i: INTEGER;
|
||||
any: ANYPTR;
|
||||
BEGIN
|
||||
ASSERT(vector # NIL);
|
||||
IF destructor = NIL THEN
|
||||
destructor := def_destructor
|
||||
END;
|
||||
FOR i := 0 TO vector.count - 1 DO
|
||||
any := get(vector, i);
|
||||
destructor(any)
|
||||
END;
|
||||
vector.data := K.free(vector.data);
|
||||
DISPOSE(vector)
|
||||
END destroy;
|
||||
|
||||
|
||||
END Vector.
|
||||
@@ -1,46 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE Write;
|
||||
|
||||
IMPORT File, sys := SYSTEM;
|
||||
|
||||
PROCEDURE Char*(F: File.FS; x: CHAR): BOOLEAN;
|
||||
RETURN File.Write(F, sys.ADR(x), sys.SIZE(CHAR)) = sys.SIZE(CHAR)
|
||||
END Char;
|
||||
|
||||
PROCEDURE Int*(F: File.FS; x: INTEGER): BOOLEAN;
|
||||
RETURN File.Write(F, sys.ADR(x), sys.SIZE(INTEGER)) = sys.SIZE(INTEGER)
|
||||
END Int;
|
||||
|
||||
PROCEDURE Real*(F: File.FS; x: REAL): BOOLEAN;
|
||||
RETURN File.Write(F, sys.ADR(x), sys.SIZE(REAL)) = sys.SIZE(REAL)
|
||||
END Real;
|
||||
|
||||
PROCEDURE Boolean*(F: File.FS; x: BOOLEAN): BOOLEAN;
|
||||
RETURN File.Write(F, sys.ADR(x), sys.SIZE(BOOLEAN)) = sys.SIZE(BOOLEAN)
|
||||
END Boolean;
|
||||
|
||||
PROCEDURE Set*(F: File.FS; x: SET): BOOLEAN;
|
||||
RETURN File.Write(F, sys.ADR(x), sys.SIZE(SET)) = sys.SIZE(SET)
|
||||
END Set;
|
||||
|
||||
PROCEDURE WChar*(F: File.FS; x: WCHAR): BOOLEAN;
|
||||
RETURN File.Write(F, sys.ADR(x), sys.SIZE(WCHAR)) = sys.SIZE(WCHAR)
|
||||
END WChar;
|
||||
|
||||
END Write.
|
||||
@@ -1,492 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE kfonts;
|
||||
|
||||
IMPORT sys := SYSTEM, File, KOSAPI;
|
||||
|
||||
CONST
|
||||
|
||||
MIN_FONT_SIZE = 8;
|
||||
MAX_FONT_SIZE = 46;
|
||||
|
||||
bold *= 1;
|
||||
italic *= 2;
|
||||
underline *= 4;
|
||||
strike_through *= 8;
|
||||
smoothing *= 16;
|
||||
bpp32 *= 32;
|
||||
|
||||
TYPE
|
||||
|
||||
Glyph = RECORD
|
||||
base: INTEGER;
|
||||
xsize, ysize: INTEGER;
|
||||
width: INTEGER
|
||||
END;
|
||||
|
||||
TFont_desc = RECORD
|
||||
|
||||
data, size, font, char_size, width, height, font_size, mem, mempos: INTEGER;
|
||||
glyphs: ARRAY 4, 256 OF Glyph
|
||||
|
||||
END;
|
||||
|
||||
TFont* = POINTER TO TFont_desc;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] zeromem(size, adr: INTEGER);
|
||||
BEGIN
|
||||
sys.CODE(057H, 08BH, 07DH, 00CH, 08BH, 04DH, 008H, 033H, 0C0H, 09CH, 0FCH, 0F3H, 0ABH, 09DH, 05FH)
|
||||
END zeromem;
|
||||
|
||||
PROCEDURE pset(buf, x, y, color: INTEGER; bpp32: BOOLEAN);
|
||||
VAR xsize, ysize: INTEGER;
|
||||
BEGIN
|
||||
sys.GET(buf, xsize);
|
||||
sys.GET(buf + 4, ysize);
|
||||
INC(buf, 8);
|
||||
IF (0 <= x) & (x < xsize) & (0 <= y) & (y < ysize) THEN
|
||||
IF bpp32 THEN
|
||||
sys.PUT(buf + 4 * (xsize * y + x), color)
|
||||
ELSE
|
||||
sys.MOVE(sys.ADR(color), buf + 3 * (xsize * y + x), 3)
|
||||
END
|
||||
END
|
||||
END pset;
|
||||
|
||||
PROCEDURE pget(buf, x, y: INTEGER; bpp32: BOOLEAN): INTEGER;
|
||||
VAR xsize, ysize, color: INTEGER;
|
||||
BEGIN
|
||||
sys.GET(buf, xsize);
|
||||
sys.GET(buf + 4, ysize);
|
||||
INC(buf, 8);
|
||||
IF (0 <= x) & (x < xsize) & (0 <= y) & (y < ysize) THEN
|
||||
IF bpp32 THEN
|
||||
sys.GET(buf + 4 * (xsize * y + x), color)
|
||||
ELSE
|
||||
sys.MOVE(buf + 3 * (xsize * y + x), sys.ADR(color), 3)
|
||||
END
|
||||
END
|
||||
RETURN color
|
||||
END pget;
|
||||
|
||||
PROCEDURE getrgb(color: INTEGER; VAR r, g, b: INTEGER);
|
||||
BEGIN
|
||||
b := LSR(LSL(color, 24), 24);
|
||||
g := LSR(LSL(color, 16), 24);
|
||||
r := LSR(LSL(color, 8), 24);
|
||||
END getrgb;
|
||||
|
||||
PROCEDURE rgb(r, g, b: INTEGER): INTEGER;
|
||||
RETURN b + LSL(g, 8) + LSL(r, 16)
|
||||
END rgb;
|
||||
|
||||
PROCEDURE create_glyph(VAR Font: TFont_desc; VAR glyph: Glyph; xsize, ysize: INTEGER);
|
||||
BEGIN
|
||||
glyph.base := Font.mempos;
|
||||
glyph.xsize := xsize;
|
||||
glyph.ysize := ysize;
|
||||
Font.mempos := Font.mempos + xsize * ysize
|
||||
END create_glyph;
|
||||
|
||||
PROCEDURE getpix(Font: TFont_desc; n, x, y, xsize: INTEGER): CHAR;
|
||||
VAR res: CHAR;
|
||||
BEGIN
|
||||
sys.GET(Font.mem + n + x + y * xsize, res)
|
||||
RETURN res
|
||||
END getpix;
|
||||
|
||||
PROCEDURE setpix(VAR Font: TFont_desc; n, x, y, xsize: INTEGER; c: CHAR);
|
||||
BEGIN
|
||||
sys.PUT(Font.mem + n + x + y * xsize, c)
|
||||
END setpix;
|
||||
|
||||
PROCEDURE smooth(VAR Font: TFont_desc; n, xsize, ysize: INTEGER);
|
||||
VAR x, y: INTEGER;
|
||||
BEGIN
|
||||
FOR y := 1 TO ysize - 1 DO
|
||||
FOR x := 1 TO xsize - 1 DO
|
||||
IF (getpix(Font, n, x, y, xsize) = 1X) & (getpix(Font, n, x - 1, y - 1, xsize) = 1X) &
|
||||
(getpix(Font, n, x - 1, y, xsize) = 0X) & (getpix(Font, n, x, y - 1, xsize) = 0X) THEN
|
||||
setpix(Font, n, x - 1, y, xsize, 2X);
|
||||
setpix(Font, n, x, y - 1, xsize, 2X)
|
||||
END;
|
||||
IF (getpix(Font, n, x, y, xsize) = 0X) & (getpix(Font, n, x - 1, y - 1, xsize) = 0X) &
|
||||
(getpix(Font, n, x - 1, y, xsize) = 1X) & (getpix(Font, n, x, y - 1, xsize) = 1X) THEN
|
||||
setpix(Font, n, x, y, xsize, 2X);
|
||||
setpix(Font, n, x - 1, y - 1, xsize, 2X)
|
||||
END
|
||||
END
|
||||
END
|
||||
END smooth;
|
||||
|
||||
PROCEDURE _bold(VAR Font: TFont_desc; src, dst, src_xsize, dst_xsize, n: INTEGER);
|
||||
VAR i, j, k: INTEGER; pix: CHAR;
|
||||
BEGIN
|
||||
FOR i := 0 TO src_xsize - 1 DO
|
||||
FOR j := 0 TO Font.height - 1 DO
|
||||
pix := getpix(Font, src, i, j, src_xsize);
|
||||
IF pix = 1X THEN
|
||||
FOR k := 0 TO n DO
|
||||
setpix(Font, dst, i + k, j, dst_xsize, pix)
|
||||
END
|
||||
END
|
||||
END
|
||||
END
|
||||
END _bold;
|
||||
|
||||
PROCEDURE make_glyph(VAR Font: TFont_desc; c: INTEGER);
|
||||
VAR ptr, i, j, max, x, y: INTEGER; s: SET; eoc: BOOLEAN;
|
||||
glyph: Glyph; pix: CHAR; bold_width: INTEGER;
|
||||
BEGIN
|
||||
create_glyph(Font, glyph, Font.width, Font.height);
|
||||
x := 0;
|
||||
y := 0;
|
||||
max := 0;
|
||||
ptr := Font.font + Font.char_size * c;
|
||||
eoc := FALSE;
|
||||
REPEAT
|
||||
sys.GET(ptr, s);
|
||||
INC(ptr, 4);
|
||||
FOR i := 0 TO 31 DO
|
||||
IF ~eoc THEN
|
||||
IF i IN s THEN
|
||||
setpix(Font, glyph.base, x, y, Font.width, 1X);
|
||||
IF x > max THEN
|
||||
max := x
|
||||
END
|
||||
ELSE
|
||||
setpix(Font, glyph.base, x, y, Font.width, 0X)
|
||||
END
|
||||
END;
|
||||
INC(x);
|
||||
IF x = Font.width THEN
|
||||
x := 0;
|
||||
INC(y);
|
||||
eoc := eoc OR (y = Font.height)
|
||||
END
|
||||
END
|
||||
UNTIL eoc;
|
||||
IF max = 0 THEN
|
||||
max := Font.width DIV 3
|
||||
END;
|
||||
|
||||
glyph.width := max;
|
||||
smooth(Font, glyph.base, glyph.xsize, glyph.ysize);
|
||||
Font.glyphs[0, c] := glyph;
|
||||
|
||||
bold_width := 1;
|
||||
|
||||
create_glyph(Font, glyph, Font.width + bold_width, Font.height);
|
||||
_bold(Font, Font.glyphs[0, c].base, glyph.base, Font.glyphs[0, c].xsize, glyph.xsize, bold_width);
|
||||
smooth(Font, glyph.base, glyph.xsize, glyph.ysize);
|
||||
glyph.width := max + bold_width;
|
||||
Font.glyphs[1, c] := glyph;
|
||||
|
||||
create_glyph(Font, glyph, Font.width + (Font.height - 1) DIV 3, Font.height);
|
||||
FOR i := 0 TO Font.glyphs[0, c].xsize - 1 DO
|
||||
FOR j := 0 TO Font.height - 1 DO
|
||||
pix := getpix(Font, Font.glyphs[0, c].base, i, j, Font.glyphs[0, c].xsize);
|
||||
IF pix = 1X THEN
|
||||
setpix(Font, glyph.base, i + (Font.height - 1 - j) DIV 3, j, glyph.xsize, pix)
|
||||
END
|
||||
END
|
||||
END;
|
||||
smooth(Font, glyph.base, glyph.xsize, glyph.ysize);
|
||||
glyph.width := max;
|
||||
Font.glyphs[2, c] := glyph;
|
||||
|
||||
create_glyph(Font, glyph, Font.width + (Font.height - 1) DIV 3 + bold_width, Font.height);
|
||||
_bold(Font, Font.glyphs[2, c].base, glyph.base, Font.glyphs[2, c].xsize, glyph.xsize, bold_width);
|
||||
smooth(Font, glyph.base, glyph.xsize, glyph.ysize);
|
||||
glyph.width := max + bold_width;
|
||||
Font.glyphs[3, c] := glyph;
|
||||
|
||||
END make_glyph;
|
||||
|
||||
PROCEDURE OutChar(Font: TFont_desc; c: INTEGER; x, y: INTEGER; buf: INTEGER; bpp32, smoothing: BOOLEAN; color, style: INTEGER): INTEGER;
|
||||
VAR i, x0, y0, xsize, mem, xmax: INTEGER; r, g, b, r0, g0, b0: INTEGER; ch: CHAR; glyph: Glyph;
|
||||
BEGIN
|
||||
x0 := x;
|
||||
y0 := y;
|
||||
style := style MOD 4;
|
||||
glyph := Font.glyphs[style, c];
|
||||
xsize := glyph.xsize;
|
||||
xmax := x0 + xsize;
|
||||
mem := Font.mem + glyph.base;
|
||||
getrgb(color, r0, g0, b0);
|
||||
FOR i := mem TO mem + xsize * Font.height - 1 DO
|
||||
sys.GET(i, ch);
|
||||
IF ch = 1X THEN
|
||||
pset(buf, x, y, color, bpp32);
|
||||
ELSIF (ch = 2X) & smoothing THEN
|
||||
getrgb(pget(buf, x, y, bpp32), r, g, b);
|
||||
r := (r * 3 + r0) DIV 4;
|
||||
g := (g * 3 + g0) DIV 4;
|
||||
b := (b * 3 + b0) DIV 4;
|
||||
pset(buf, x, y, rgb(r, g, b), bpp32)
|
||||
END;
|
||||
INC(x);
|
||||
IF x = xmax THEN
|
||||
x := x0;
|
||||
INC(y)
|
||||
END
|
||||
END
|
||||
RETURN glyph.width
|
||||
END OutChar;
|
||||
|
||||
PROCEDURE hline(buf, x, y, width, color: INTEGER; bpp32: BOOLEAN);
|
||||
VAR i: INTEGER;
|
||||
BEGIN
|
||||
FOR i := x TO x + width - 1 DO
|
||||
pset(buf, i, y, color, bpp32)
|
||||
END
|
||||
END hline;
|
||||
|
||||
PROCEDURE TextWidth*(Font: TFont; str, length, params: INTEGER): INTEGER;
|
||||
VAR res: INTEGER; c: CHAR;
|
||||
BEGIN
|
||||
res := 0;
|
||||
params := params MOD 4;
|
||||
IF Font # NIL THEN
|
||||
sys.GET(str, c);
|
||||
WHILE (length > 0) OR (length = -1) & (c # 0X) DO
|
||||
INC(str);
|
||||
res := res + Font.glyphs[params, ORD(c)].width;
|
||||
IF length > 0 THEN
|
||||
DEC(length)
|
||||
END;
|
||||
IF length # 0 THEN
|
||||
sys.GET(str, c)
|
||||
END
|
||||
END
|
||||
END
|
||||
RETURN res
|
||||
END TextWidth;
|
||||
|
||||
PROCEDURE TextHeight*(Font: TFont): INTEGER;
|
||||
VAR res: INTEGER;
|
||||
BEGIN
|
||||
IF Font # NIL THEN
|
||||
res := Font.height
|
||||
ELSE
|
||||
res := 0
|
||||
END
|
||||
RETURN res
|
||||
END TextHeight;
|
||||
|
||||
PROCEDURE TextClipLeft(Font: TFont; str, length, params: INTEGER; VAR x: INTEGER): INTEGER;
|
||||
VAR x1: INTEGER; c: CHAR;
|
||||
BEGIN
|
||||
params := params MOD 4;
|
||||
sys.GET(str, c);
|
||||
WHILE (length > 0) OR (length = -1) & (c # 0X) DO
|
||||
INC(str);
|
||||
x1 := x;
|
||||
x := x + Font.glyphs[params, ORD(c)].width;
|
||||
IF x > 0 THEN
|
||||
length := 0;
|
||||
END;
|
||||
IF length > 0 THEN
|
||||
DEC(length)
|
||||
END;
|
||||
IF length # 0 THEN
|
||||
sys.GET(str, c)
|
||||
END
|
||||
END;
|
||||
x := x1
|
||||
RETURN str - 1
|
||||
END TextClipLeft;
|
||||
|
||||
PROCEDURE TextOut*(Font: TFont; canvas, x, y, str, length, color, params: INTEGER);
|
||||
VAR width, xsize, ysize, str1, n: INTEGER; c: CHAR; bpp32, smoothing, underline, strike: BOOLEAN;
|
||||
BEGIN
|
||||
IF Font # NIL THEN
|
||||
sys.GET(canvas, xsize);
|
||||
sys.GET(canvas + 4, ysize);
|
||||
IF (y <= -TextHeight(Font)) OR (y >= ysize) THEN
|
||||
length := 0
|
||||
END;
|
||||
IF length # 0 THEN
|
||||
smoothing := 4 IN BITS(params);
|
||||
bpp32 := 5 IN BITS(params);
|
||||
underline := 2 IN BITS(params);
|
||||
strike := 3 IN BITS(params);
|
||||
str1 := TextClipLeft(Font, str, length, params, x);
|
||||
n := str1 - str;
|
||||
str := str1;
|
||||
IF length >= n THEN
|
||||
length := length - n
|
||||
END;
|
||||
sys.GET(str, c)
|
||||
END;
|
||||
WHILE (length > 0) OR (length = -1) & (c # 0X) DO
|
||||
INC(str);
|
||||
width := OutChar(Font^, ORD(c), x, y, canvas, bpp32, smoothing, color, params);
|
||||
IF strike THEN
|
||||
hline(canvas, x + ORD(1 IN BITS(params)) * ((Font.height DIV 2) DIV 3), y + Font.height DIV 2, width + 2, color, bpp32)
|
||||
END;
|
||||
IF underline THEN
|
||||
hline(canvas, x, y + Font.height - 1, width + 2, color, bpp32)
|
||||
END;
|
||||
x := x + width;
|
||||
IF x > xsize THEN
|
||||
length := 0
|
||||
END;
|
||||
IF length > 0 THEN
|
||||
DEC(length)
|
||||
END;
|
||||
IF length # 0 THEN
|
||||
sys.GET(str, c)
|
||||
END
|
||||
END
|
||||
END
|
||||
END TextOut;
|
||||
|
||||
PROCEDURE SetSize*(_Font: TFont; font_size: INTEGER): BOOLEAN;
|
||||
VAR temp, offset, fsize, i, memsize, mem: INTEGER;
|
||||
c: CHAR; Font, Font2: TFont_desc;
|
||||
BEGIN
|
||||
offset := -1;
|
||||
IF (MIN_FONT_SIZE <= font_size) & (font_size <= MAX_FONT_SIZE) & (_Font # NIL) THEN
|
||||
Font := _Font^;
|
||||
Font2 := Font;
|
||||
temp := Font.data + (font_size - 8) * 4;
|
||||
IF (Font.data <= temp) & (temp <= Font.size + Font.data - 4) THEN
|
||||
sys.GET(temp, offset);
|
||||
IF offset # -1 THEN
|
||||
Font.font_size := font_size;
|
||||
INC(offset, 156);
|
||||
offset := offset + Font.data;
|
||||
IF (Font.data <= offset) & (offset <= Font.size + Font.data - 4) THEN
|
||||
sys.GET(offset, fsize);
|
||||
IF fsize > 256 + 6 THEN
|
||||
temp := offset + fsize - 1;
|
||||
IF (Font.data <= temp) & (temp <= Font.size + Font.data - 1) THEN
|
||||
sys.GET(temp, c);
|
||||
IF c # 0X THEN
|
||||
Font.height := ORD(c);
|
||||
DEC(temp);
|
||||
sys.GET(temp, c);
|
||||
IF c # 0X THEN
|
||||
Font.width := ORD(c);
|
||||
DEC(fsize, 6);
|
||||
Font.char_size := fsize DIV 256;
|
||||
IF fsize MOD 256 # 0 THEN
|
||||
INC(Font.char_size)
|
||||
END;
|
||||
IF Font.char_size > 0 THEN
|
||||
Font.font := offset + 4;
|
||||
Font.mempos := 0;
|
||||
memsize := (Font.width + 10) * Font.height * 1024;
|
||||
mem := Font.mem;
|
||||
Font.mem := KOSAPI.sysfunc3(68, 12, memsize);
|
||||
IF Font.mem # 0 THEN
|
||||
IF mem # 0 THEN
|
||||
mem := KOSAPI.sysfunc3(68, 13, mem)
|
||||
END;
|
||||
zeromem(memsize DIV 4, Font.mem);
|
||||
FOR i := 0 TO 255 DO
|
||||
make_glyph(Font, i)
|
||||
END
|
||||
ELSE
|
||||
offset := -1
|
||||
END
|
||||
ELSE
|
||||
offset := -1
|
||||
END
|
||||
ELSE
|
||||
offset := -1
|
||||
END
|
||||
ELSE
|
||||
offset := -1
|
||||
END
|
||||
ELSE
|
||||
offset := -1
|
||||
END
|
||||
ELSE
|
||||
offset := -1
|
||||
END
|
||||
ELSE
|
||||
offset := -1
|
||||
END
|
||||
END;
|
||||
ELSE
|
||||
offset := -1
|
||||
END;
|
||||
IF offset # -1 THEN
|
||||
_Font^ := Font
|
||||
ELSE
|
||||
_Font^ := Font2
|
||||
END
|
||||
END
|
||||
RETURN offset # -1
|
||||
END SetSize;
|
||||
|
||||
PROCEDURE Enabled*(Font: TFont; font_size: INTEGER): BOOLEAN;
|
||||
VAR offset, temp: INTEGER;
|
||||
BEGIN
|
||||
offset := -1;
|
||||
IF (MIN_FONT_SIZE <= font_size) & (font_size <= MAX_FONT_SIZE) & (Font # NIL) THEN
|
||||
temp := Font.data + (font_size - 8) * 4;
|
||||
IF (Font.data <= temp) & (temp <= Font.size + Font.data - 4) THEN
|
||||
sys.GET(temp, offset)
|
||||
END
|
||||
END
|
||||
RETURN offset # -1
|
||||
END Enabled;
|
||||
|
||||
PROCEDURE Destroy*(VAR Font: TFont);
|
||||
BEGIN
|
||||
IF Font # NIL THEN
|
||||
IF Font.mem # 0 THEN
|
||||
Font.mem := KOSAPI.sysfunc3(68, 13, Font.mem)
|
||||
END;
|
||||
IF Font.data # 0 THEN
|
||||
Font.data := KOSAPI.sysfunc3(68, 13, Font.data)
|
||||
END;
|
||||
DISPOSE(Font)
|
||||
END
|
||||
END Destroy;
|
||||
|
||||
PROCEDURE LoadFont*(file_name: ARRAY OF CHAR): TFont;
|
||||
VAR Font: TFont; data, size, n: INTEGER;
|
||||
BEGIN
|
||||
data := File.Load(file_name, size);
|
||||
IF (data # 0) & (size > 156) THEN
|
||||
NEW(Font);
|
||||
Font.data := data;
|
||||
Font.size := size;
|
||||
Font.font_size := 0;
|
||||
n := MIN_FONT_SIZE;
|
||||
WHILE ~SetSize(Font, n) & (n <= MAX_FONT_SIZE) DO
|
||||
INC(n)
|
||||
END;
|
||||
IF Font.font_size = 0 THEN
|
||||
Destroy(Font)
|
||||
END
|
||||
ELSE
|
||||
IF data # 0 THEN
|
||||
data := KOSAPI.sysfunc3(68, 13, data)
|
||||
END;
|
||||
Font := NIL
|
||||
END
|
||||
RETURN Font
|
||||
END LoadFont;
|
||||
|
||||
END kfonts.
|
||||
@@ -1,435 +0,0 @@
|
||||
(*
|
||||
Copyright 2016, 2018, 2020, 2022 KolibriOS team
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE libimg;
|
||||
|
||||
IMPORT sys := SYSTEM, KOSAPI;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
FLIP_VERTICAL *= 1;
|
||||
FLIP_HORIZONTAL *= 2;
|
||||
|
||||
|
||||
ROTATE_90_CW *= 1;
|
||||
ROTATE_180 *= 2;
|
||||
ROTATE_270_CW *= 3;
|
||||
ROTATE_90_CCW *= ROTATE_270_CW;
|
||||
ROTATE_270_CCW *= ROTATE_90_CW;
|
||||
|
||||
|
||||
// scale type corresponding img_scale params
|
||||
LIBIMG_SCALE_INTEGER *= 1; // scale factor ; reserved 0
|
||||
LIBIMG_SCALE_TILE *= 2; // new width ; new height
|
||||
LIBIMG_SCALE_STRETCH *= 3; // new width ; new height
|
||||
LIBIMG_SCALE_FIT_RECT *= 4; // new width ; new height
|
||||
LIBIMG_SCALE_FIT_WIDTH *= 5; // new width ; new height
|
||||
LIBIMG_SCALE_FIT_HEIGHT *= 6; // new width ; new height
|
||||
LIBIMG_SCALE_FIT_MAX *= 7; // new width ; new height
|
||||
|
||||
|
||||
// interpolation algorithm
|
||||
LIBIMG_INTER_NONE *= 0; // use it with LIBIMG_SCALE_INTEGER, LIBIMG_SCALE_TILE, etc
|
||||
LIBIMG_INTER_BILINEAR *= 1;
|
||||
LIBIMG_INTER_DEFAULT *= LIBIMG_INTER_BILINEAR;
|
||||
|
||||
|
||||
// list of format id's
|
||||
LIBIMG_FORMAT_BMP *= 1;
|
||||
LIBIMG_FORMAT_ICO *= 2;
|
||||
LIBIMG_FORMAT_CUR *= 3;
|
||||
LIBIMG_FORMAT_GIF *= 4;
|
||||
LIBIMG_FORMAT_PNG *= 5;
|
||||
LIBIMG_FORMAT_JPEG *= 6;
|
||||
LIBIMG_FORMAT_TGA *= 7;
|
||||
LIBIMG_FORMAT_PCX *= 8;
|
||||
LIBIMG_FORMAT_XCF *= 9;
|
||||
LIBIMG_FORMAT_TIFF *= 10;
|
||||
LIBIMG_FORMAT_PNM *= 11;
|
||||
LIBIMG_FORMAT_WBMP *= 12;
|
||||
LIBIMG_FORMAT_XBM *= 13;
|
||||
LIBIMG_FORMAT_Z80 *= 14;
|
||||
|
||||
|
||||
// encode flags (byte 0x02 of common option)
|
||||
LIBIMG_ENCODE_STRICT_SPECIFIC *= 01H;
|
||||
LIBIMG_ENCODE_STRICT_BIT_DEPTH *= 02H;
|
||||
LIBIMG_ENCODE_DELETE_ALPHA *= 08H;
|
||||
LIBIMG_ENCODE_FLUSH_ALPHA *= 10H;
|
||||
|
||||
|
||||
// values for Image.Type
|
||||
// must be consecutive to allow fast switch on Image.Type in support functions
|
||||
bpp8i *= 1; // indexed
|
||||
bpp24 *= 2;
|
||||
bpp32 *= 3;
|
||||
bpp15 *= 4;
|
||||
bpp16 *= 5;
|
||||
bpp1 *= 6;
|
||||
bpp8g *= 7; // grayscale
|
||||
bpp2i *= 8;
|
||||
bpp4i *= 9;
|
||||
bpp8a *= 10; // grayscale with alpha channel; application layer only!!! kernel doesn't handle this image type, libimg can only create and destroy such images
|
||||
|
||||
|
||||
// bits in Image.Flags
|
||||
IsAnimated *= 1;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
Image* = RECORD
|
||||
|
||||
Checksum *: INTEGER;
|
||||
Width *: INTEGER;
|
||||
Height *: INTEGER;
|
||||
Next *: INTEGER;
|
||||
Previous *: INTEGER;
|
||||
Type *: INTEGER; // one of bppN
|
||||
Data *: INTEGER;
|
||||
Palette *: INTEGER; // used iff Type eq bpp1, bpp2, bpp4 or bpp8i
|
||||
Extended *: INTEGER;
|
||||
Flags *: INTEGER; // bitfield
|
||||
Delay *: INTEGER // used iff IsAnimated is set in Flags
|
||||
|
||||
END;
|
||||
|
||||
|
||||
ImageDecodeOptions* = RECORD
|
||||
|
||||
UsedSize *: INTEGER; // if >=8, the field BackgroundColor is valid, and so on
|
||||
BackgroundColor *: INTEGER // used for transparent images as background
|
||||
|
||||
END;
|
||||
|
||||
|
||||
FormatsTableEntry* = RECORD
|
||||
|
||||
Format_id *: INTEGER;
|
||||
Is *: INTEGER;
|
||||
Decode *: INTEGER;
|
||||
Encode *: INTEGER;
|
||||
Capabilities *: INTEGER
|
||||
|
||||
END;
|
||||
|
||||
|
||||
VAR
|
||||
|
||||
img_is_img *: PROCEDURE (data, length: INTEGER): INTEGER;
|
||||
|
||||
|
||||
|
||||
img_to_rgb2 *: PROCEDURE (img: INTEGER; out: INTEGER);
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? decodes image data into RGB triplets and stores them where out points to ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> img = pointer to source image ;;
|
||||
;> out = where to store RGB triplets ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
|
||||
img_to_rgb *: PROCEDURE (img: INTEGER): INTEGER;
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? decodes image data into RGB triplets and returns pointer to memory area containing them ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> img = pointer to source image ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< 0 / pointer to rgb_data (array of [rgb] triplets) ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
|
||||
img_decode *: PROCEDURE (data, length, options: INTEGER): INTEGER;
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? decodes loaded into memory graphic file ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> data = pointer to file in memory ;;
|
||||
;> length = size in bytes of memory area pointed to by data ;;
|
||||
;> options = 0 / pointer to the structure of additional options ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< 0 / pointer to image ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
|
||||
img_encode *: PROCEDURE (img: INTEGER; common, specific: INTEGER): INTEGER;
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? encode image to some format ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> img = pointer to input image ;;
|
||||
;> common = some most important options ;;
|
||||
; 0x00 : byte : format id ;;
|
||||
; 0x01 : byte : fast encoding (0) / best compression ratio (255) ;;
|
||||
; 0 : store uncompressed data (if supported both by the format and libimg) ;;
|
||||
; 1 - 255 : use compression, if supported ;;
|
||||
; this option may be ignored if any format specific options are defined ;;
|
||||
; i.e. the 0 here will be ignored if some compression algorithm is specified ;;
|
||||
; 0x02 : byte : flags (bitfield) ;;
|
||||
; 0x01 : return an error if format specific conditions cannot be met ;;
|
||||
; 0x02 : preserve current bit depth. means 8bpp/16bpp/24bpp and so on ;;
|
||||
; 0x04 : delete alpha channel, if any ;;
|
||||
; 0x08 : flush alpha channel with 0xff, if any; add it if none ;;
|
||||
; 0x03 : byte : reserved, must be 0 ;;
|
||||
;> specific = 0 / pointer to the structure of format specific options ;;
|
||||
; see <format_name>.inc for description ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< 0 / pointer to encoded data ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
|
||||
img_create *: PROCEDURE (width, height, _type: INTEGER): INTEGER;
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? creates an Image structure and initializes some its fields ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> width = width of an image in pixels ;;
|
||||
;> height = height of an image in pixels ;;
|
||||
;> type = one of the bppN constants ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< 0 / pointer to image ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
|
||||
img_destroy *: PROCEDURE (img: INTEGER): BOOLEAN;
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? frees memory occupied by an image and all the memory regions its fields point to ;;
|
||||
;? follows Previous/Next pointers and deletes all the images in sequence ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> img = pointer to image ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< FALSE (fail) / TRUE (success) ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
|
||||
img_destroy_layer *: PROCEDURE (img: INTEGER): BOOLEAN;
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? frees memory occupied by an image and all the memory regions its fields point to ;;
|
||||
;? for image sequences deletes only one frame and fixes Previous/Next pointers ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> img = pointer to image ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< FALSE (fail) / TRUE (success) ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
|
||||
img_count *: PROCEDURE (img: INTEGER): INTEGER;
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? Get number of images in the list (e.g. in animated GIF file) ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> img = pointer to image ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< -1 (fail) / >0 (ok) ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
|
||||
img_flip *: PROCEDURE (img: INTEGER; flip_kind: INTEGER): BOOLEAN;
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? Flip all layers of image ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> img = pointer to image ;;
|
||||
;> flip_kind = one of FLIP_* constants ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< FALSE / TRUE ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
|
||||
img_flip_layer *: PROCEDURE (img: INTEGER; flip_kind: INTEGER): BOOLEAN;
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? Flip image layer ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> img = pointer to image ;;
|
||||
;> flip_kind = one of FLIP_* constants ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< FALSE / TRUE ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
|
||||
img_rotate *: PROCEDURE (img: INTEGER; rotate_kind: INTEGER): BOOLEAN;
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? Rotate all layers of image ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> img = pointer to image ;;
|
||||
;> rotate_kind = one of ROTATE_* constants ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< FALSE / TRUE ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
|
||||
img_rotate_layer *: PROCEDURE (img: INTEGER; rotate_kind: INTEGER): BOOLEAN;
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? Rotate image layer ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> img = pointer to image ;;
|
||||
;> rotate_kind = one of ROTATE_* constants ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< FALSE / TRUE ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
|
||||
img_draw *: PROCEDURE (img: INTEGER; x, y, width, height, xpos, ypos: INTEGER);
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? Draw image in the window ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> img = pointer to image ;;
|
||||
;> x = x-coordinate in the window ;;
|
||||
;> y = y-coordinate in the window ;;
|
||||
;> width = maximum width to draw ;;
|
||||
;> height = maximum height to draw ;;
|
||||
;> xpos = offset in image by x-axis ;;
|
||||
;> ypos = offset in image by y-axis ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
|
||||
img_scale *: PROCEDURE (src: INTEGER; crop_x, crop_y, crop_width, crop_height: INTEGER; dst: INTEGER; scale, inter, param1, param2: INTEGER ): INTEGER;
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? scale _image ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> src = pointer to source image ;;
|
||||
;> crop_x = left coord of cropping rect ;;
|
||||
;> crop_y = top coord of cropping rect ;;
|
||||
;> crop_width = width of cropping rect ;;
|
||||
;> crop_height = height of cropping rect ;;
|
||||
;> dst = pointer to resulting image / 0 ;;
|
||||
;> scale = how to change width and height. see libimg.inc ;;
|
||||
;> inter = interpolation algorithm ;;
|
||||
;> param1 = see libimg.inc ;;
|
||||
;> param2 = see libimg.inc ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< 0 / pointer to scaled image ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
|
||||
img_convert *: PROCEDURE (src, dst: INTEGER; dst_type, flags, param: INTEGER);
|
||||
(*
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;? scale _image ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;> src = pointer to source image ;;
|
||||
;> flags = see libimg.inc ;;
|
||||
;> dst_type = the Image.Type of converted image ;;
|
||||
;> dst = pointer to destination image, if any ;;
|
||||
;;------------------------------------------------------------------------------------------------;;
|
||||
;< 0 / pointer to converted image ;;
|
||||
;;================================================================================================;;
|
||||
*)
|
||||
|
||||
|
||||
img_formats_table *: ARRAY 20 OF FormatsTableEntry;
|
||||
|
||||
|
||||
|
||||
PROCEDURE GetImageStruct* (img: INTEGER; VAR ImageStruct: Image): BOOLEAN;
|
||||
BEGIN
|
||||
IF img # 0 THEN
|
||||
sys.MOVE(img, sys.ADR(ImageStruct), sys.SIZE(Image))
|
||||
END
|
||||
RETURN img # 0
|
||||
END GetImageStruct;
|
||||
|
||||
|
||||
PROCEDURE GetFormatsTable(ptr: INTEGER);
|
||||
VAR i: INTEGER; eot: BOOLEAN;
|
||||
BEGIN
|
||||
i := 0;
|
||||
REPEAT
|
||||
sys.MOVE(ptr, sys.ADR(img_formats_table[i]), sys.SIZE(FormatsTableEntry));
|
||||
ptr := ptr + sys.SIZE(FormatsTableEntry);
|
||||
eot := img_formats_table[i].Format_id = 0;
|
||||
INC(i)
|
||||
UNTIL eot OR (i = LEN(img_formats_table))
|
||||
END GetFormatsTable;
|
||||
|
||||
|
||||
PROCEDURE main;
|
||||
VAR Lib, formats_table_ptr: INTEGER;
|
||||
|
||||
PROCEDURE GetProc(Lib, v: INTEGER; name: ARRAY OF CHAR);
|
||||
VAR a: INTEGER;
|
||||
BEGIN
|
||||
a := KOSAPI.GetProcAdr(name, Lib);
|
||||
ASSERT(a # 0);
|
||||
sys.PUT(v, a)
|
||||
END GetProc;
|
||||
|
||||
BEGIN
|
||||
Lib := KOSAPI.LoadLib("/sys/lib/libimg.obj");
|
||||
ASSERT(Lib # 0);
|
||||
GetProc(Lib, sys.ADR(img_is_img) , "img_is_img");
|
||||
GetProc(Lib, sys.ADR(img_to_rgb) , "img_to_rgb");
|
||||
GetProc(Lib, sys.ADR(img_to_rgb2) , "img_to_rgb2");
|
||||
GetProc(Lib, sys.ADR(img_decode) , "img_decode");
|
||||
GetProc(Lib, sys.ADR(img_encode) , "img_encode");
|
||||
GetProc(Lib, sys.ADR(img_create) , "img_create");
|
||||
GetProc(Lib, sys.ADR(img_destroy) , "img_destroy");
|
||||
GetProc(Lib, sys.ADR(img_destroy_layer) , "img_destroy_layer");
|
||||
GetProc(Lib, sys.ADR(img_count) , "img_count");
|
||||
GetProc(Lib, sys.ADR(img_flip) , "img_flip");
|
||||
GetProc(Lib, sys.ADR(img_flip_layer) , "img_flip_layer");
|
||||
GetProc(Lib, sys.ADR(img_rotate) , "img_rotate");
|
||||
GetProc(Lib, sys.ADR(img_rotate_layer) , "img_rotate_layer");
|
||||
GetProc(Lib, sys.ADR(img_draw) , "img_draw");
|
||||
GetProc(Lib, sys.ADR(img_scale) , "img_scale");
|
||||
GetProc(Lib, sys.ADR(img_convert) , "img_convert");
|
||||
GetProc(Lib, sys.ADR(formats_table_ptr) , "img_formats_table");
|
||||
GetFormatsTable(formats_table_ptr)
|
||||
END main;
|
||||
|
||||
|
||||
BEGIN
|
||||
main
|
||||
END libimg.
|
||||
@@ -1,462 +0,0 @@
|
||||
(* ***********************************************
|
||||
Модуль работы с комплексными числами.
|
||||
Вадим Исаев, 2020
|
||||
Module for complex numbers.
|
||||
Vadim Isaev, 2020
|
||||
*************************************************** *)
|
||||
|
||||
MODULE CMath;
|
||||
|
||||
IMPORT Math, Out;
|
||||
|
||||
TYPE
|
||||
complex* = POINTER TO RECORD
|
||||
re*: REAL;
|
||||
im*: REAL
|
||||
END;
|
||||
|
||||
VAR
|
||||
result: complex;
|
||||
|
||||
i* : complex;
|
||||
_0*: complex;
|
||||
|
||||
(* Инициализация комплексного числа.
|
||||
Init complex number. *)
|
||||
PROCEDURE CInit* (re : REAL; im: REAL): complex;
|
||||
VAR
|
||||
temp: complex;
|
||||
BEGIN
|
||||
NEW(temp);
|
||||
temp.re:=re;
|
||||
temp.im:=im;
|
||||
|
||||
RETURN temp
|
||||
END CInit;
|
||||
|
||||
|
||||
(* Четыре основных арифметических операций.
|
||||
Four base operations +, -, * , / *)
|
||||
|
||||
(* Сложение
|
||||
addition : z := z1 + z2 *)
|
||||
PROCEDURE CAdd* (z1, z2: complex): complex;
|
||||
BEGIN
|
||||
result.re := z1.re + z2.re;
|
||||
result.im := z1.im + z2.im;
|
||||
|
||||
RETURN result
|
||||
END CAdd;
|
||||
|
||||
(* Сложение с REAL.
|
||||
addition : z := z1 + r1 *)
|
||||
PROCEDURE CAdd_r* (z1: complex; r1: REAL): complex;
|
||||
BEGIN
|
||||
result.re := z1.re + r1;
|
||||
result.im := z1.im;
|
||||
|
||||
RETURN result
|
||||
END CAdd_r;
|
||||
|
||||
(* Сложение с INTEGER.
|
||||
addition : z := z1 + i1 *)
|
||||
PROCEDURE CAdd_i* (z1: complex; i1: INTEGER): complex;
|
||||
BEGIN
|
||||
result.re := z1.re + FLT(i1);
|
||||
result.im := z1.im;
|
||||
|
||||
RETURN result
|
||||
END CAdd_i;
|
||||
|
||||
(* Смена знака.
|
||||
substraction : z := - z1 *)
|
||||
PROCEDURE CNeg (z1 : complex): complex;
|
||||
BEGIN
|
||||
result.re := -z1.re;
|
||||
result.im := -z1.im;
|
||||
|
||||
RETURN result
|
||||
END CNeg;
|
||||
|
||||
(* Вычитание.
|
||||
substraction : z := z1 - z2 *)
|
||||
PROCEDURE CSub* (z1, z2 : complex): complex;
|
||||
BEGIN
|
||||
result.re := z1.re - z2.re;
|
||||
result.im := z1.im - z2.im;
|
||||
|
||||
RETURN result
|
||||
END CSub;
|
||||
|
||||
(* Вычитание REAL.
|
||||
substraction : z := z1 - r1 *)
|
||||
PROCEDURE CSub_r1* (z1 : complex; r1 : REAL): complex;
|
||||
BEGIN
|
||||
result.re := z1.re - r1;
|
||||
result.im := z1.im;
|
||||
|
||||
RETURN result
|
||||
END CSub_r1;
|
||||
|
||||
(* Вычитание из REAL.
|
||||
substraction : z := r1 - z1 *)
|
||||
PROCEDURE CSub_r2* (r1 : REAL; z1 : complex): complex;
|
||||
BEGIN
|
||||
result.re := r1 - z1.re;
|
||||
result.im := - z1.im;
|
||||
|
||||
RETURN result
|
||||
END CSub_r2;
|
||||
|
||||
(* Вычитание INTEGER.
|
||||
substraction : z := z1 - i1 *)
|
||||
PROCEDURE CSub_i* (z1 : complex; i1 : INTEGER): complex;
|
||||
BEGIN
|
||||
result.re := z1.re - FLT(i1);
|
||||
result.im := z1.im;
|
||||
|
||||
RETURN result
|
||||
END CSub_i;
|
||||
|
||||
(* Умножение.
|
||||
multiplication : z := z1 * z2 *)
|
||||
PROCEDURE CMul (z1, z2 : complex): complex;
|
||||
BEGIN
|
||||
result.re := (z1.re * z2.re) - (z1.im * z2.im);
|
||||
result.im := (z1.re * z2.im) + (z1.im * z2.re);
|
||||
|
||||
RETURN result
|
||||
END CMul;
|
||||
|
||||
(* Умножение с REAL.
|
||||
multiplication : z := z1 * r1 *)
|
||||
PROCEDURE CMul_r (z1 : complex; r1 : REAL): complex;
|
||||
BEGIN
|
||||
result.re := z1.re * r1;
|
||||
result.im := z1.im * r1;
|
||||
|
||||
RETURN result
|
||||
END CMul_r;
|
||||
|
||||
(* Умножение с INTEGER.
|
||||
multiplication : z := z1 * i1 *)
|
||||
PROCEDURE CMul_i (z1 : complex; i1 : INTEGER): complex;
|
||||
BEGIN
|
||||
result.re := z1.re * FLT(i1);
|
||||
result.im := z1.im * FLT(i1);
|
||||
|
||||
RETURN result
|
||||
END CMul_i;
|
||||
|
||||
(* Деление.
|
||||
division : z := znum / zden *)
|
||||
PROCEDURE CDiv (z1, z2 : complex): complex;
|
||||
(* The following algorithm is used to properly handle
|
||||
denominator overflow:
|
||||
|
||||
| a + b(d/c) c - a(d/c)
|
||||
| ---------- + ---------- I if |d| < |c|
|
||||
a + b I | c + d(d/c) a + d(d/c)
|
||||
------- = |
|
||||
c + d I | b + a(c/d) -a+ b(c/d)
|
||||
| ---------- + ---------- I if |d| >= |c|
|
||||
| d + c(c/d) d + c(c/d)
|
||||
*)
|
||||
VAR
|
||||
tmp, denom : REAL;
|
||||
BEGIN
|
||||
IF ( ABS(z2.re) > ABS(z2.im) ) THEN
|
||||
tmp := z2.im / z2.re;
|
||||
denom := z2.re + z2.im * tmp;
|
||||
result.re := (z1.re + z1.im * tmp) / denom;
|
||||
result.im := (z1.im - z1.re * tmp) / denom;
|
||||
ELSE
|
||||
tmp := z2.re / z2.im;
|
||||
denom := z2.im + z2.re * tmp;
|
||||
result.re := (z1.im + z1.re * tmp) / denom;
|
||||
result.im := (-z1.re + z1.im * tmp) / denom;
|
||||
END;
|
||||
|
||||
RETURN result
|
||||
END CDiv;
|
||||
|
||||
(* Деление на REAL.
|
||||
division : z := znum / r1 *)
|
||||
PROCEDURE CDiv_r* (z1 : complex; r1 : REAL): complex;
|
||||
BEGIN
|
||||
result.re := z1.re / r1;
|
||||
result.im := z1.im / r1;
|
||||
|
||||
RETURN result
|
||||
END CDiv_r;
|
||||
|
||||
(* Деление на INTEGER.
|
||||
division : z := znum / i1 *)
|
||||
PROCEDURE CDiv_i* (z1 : complex; i1 : INTEGER): complex;
|
||||
BEGIN
|
||||
result.re := z1.re / FLT(i1);
|
||||
result.im := z1.im / FLT(i1);
|
||||
|
||||
RETURN result
|
||||
END CDiv_i;
|
||||
|
||||
(* fonctions elementaires *)
|
||||
|
||||
(* Вывод на экран.
|
||||
out complex number *)
|
||||
PROCEDURE CPrint* (z: complex; width: INTEGER);
|
||||
BEGIN
|
||||
Out.Real(z.re, width);
|
||||
IF z.im>=0.0 THEN
|
||||
Out.String("+");
|
||||
END;
|
||||
Out.Real(z.im, width);
|
||||
Out.String("i");
|
||||
END CPrint;
|
||||
|
||||
PROCEDURE CPrintLn* (z: complex; width: INTEGER);
|
||||
BEGIN
|
||||
CPrint(z, width);
|
||||
Out.Ln;
|
||||
END CPrintLn;
|
||||
|
||||
(* Вывод на экран с фиксированным кол-вом знаков
|
||||
после запятой (p) *)
|
||||
PROCEDURE CPrintFix* (z: complex; width, p: INTEGER);
|
||||
BEGIN
|
||||
Out.FixReal(z.re, width, p);
|
||||
IF z.im>=0.0 THEN
|
||||
Out.String("+");
|
||||
END;
|
||||
Out.FixReal(z.im, width, p);
|
||||
Out.String("i");
|
||||
END CPrintFix;
|
||||
|
||||
PROCEDURE CPrintFixLn* (z: complex; width, p: INTEGER);
|
||||
BEGIN
|
||||
CPrintFix(z, width, p);
|
||||
Out.Ln;
|
||||
END CPrintFixLn;
|
||||
|
||||
(* Модуль числа.
|
||||
module : r = |z| *)
|
||||
PROCEDURE CMod* (z1 : complex): REAL;
|
||||
BEGIN
|
||||
RETURN Math.sqrt((z1.re * z1.re) + (z1.im * z1.im))
|
||||
END CMod;
|
||||
|
||||
(* Квадрат числа.
|
||||
square : r := z*z *)
|
||||
PROCEDURE CSqr* (z1: complex): complex;
|
||||
BEGIN
|
||||
result.re := z1.re * z1.re - z1.im * z1.im;
|
||||
result.im := 2.0 * z1.re * z1.im;
|
||||
|
||||
RETURN result
|
||||
END CSqr;
|
||||
|
||||
(* Квадратный корень числа.
|
||||
square root : r := sqrt(z) *)
|
||||
PROCEDURE CSqrt* (z1: complex): complex;
|
||||
VAR
|
||||
root, q: REAL;
|
||||
BEGIN
|
||||
IF (z1.re#0.0) OR (z1.im#0.0) THEN
|
||||
root := Math.sqrt(0.5 * (ABS(z1.re) + CMod(z1)));
|
||||
q := z1.im / (2.0 * root);
|
||||
IF z1.re >= 0.0 THEN
|
||||
result.re := root;
|
||||
result.im := q;
|
||||
ELSE
|
||||
IF z1.im < 0.0 THEN
|
||||
result.re := - q;
|
||||
result.im := - root
|
||||
ELSE
|
||||
result.re := q;
|
||||
result.im := root
|
||||
END
|
||||
END
|
||||
ELSE
|
||||
result := z1;
|
||||
END;
|
||||
|
||||
RETURN result
|
||||
END CSqrt;
|
||||
|
||||
(* Экспонента.
|
||||
exponantial : r := exp(z) *)
|
||||
(* exp(x + iy) = exp(x).exp(iy) = exp(x).[cos(y) + i sin(y)] *)
|
||||
PROCEDURE CExp* (z: complex): complex;
|
||||
VAR
|
||||
expz : REAL;
|
||||
BEGIN
|
||||
expz := Math.exp(z.re);
|
||||
result.re := expz * Math.cos(z.im);
|
||||
result.im := expz * Math.sin(z.im);
|
||||
|
||||
RETURN result
|
||||
END CExp;
|
||||
|
||||
(* Натуральный логарифм.
|
||||
natural logarithm : r := ln(z) *)
|
||||
(* ln( p exp(i0)) = ln(p) + i0 + 2kpi *)
|
||||
PROCEDURE CLn* (z: complex): complex;
|
||||
BEGIN
|
||||
result.re := Math.ln(CMod(z));
|
||||
result.im := Math.arctan2(z.im, z.re);
|
||||
|
||||
RETURN result
|
||||
END CLn;
|
||||
|
||||
(* Число в степени.
|
||||
exp : z := z1^z2 *)
|
||||
PROCEDURE CPower* (z1, z2 : complex): complex;
|
||||
VAR
|
||||
a: complex;
|
||||
BEGIN
|
||||
a:=CLn(z1);
|
||||
a:=CMul(z2, a);
|
||||
result:=CExp(a);
|
||||
|
||||
RETURN result
|
||||
END CPower;
|
||||
|
||||
(* Число в степени REAL.
|
||||
multiplication : z := z1^r *)
|
||||
PROCEDURE CPower_r* (z1: complex; r: REAL): complex;
|
||||
VAR
|
||||
a: complex;
|
||||
BEGIN
|
||||
a:=CLn(z1);
|
||||
a:=CMul_r(a, r);
|
||||
result:=CExp(a);
|
||||
|
||||
RETURN result
|
||||
END CPower_r;
|
||||
|
||||
(* Обратное число.
|
||||
inverse : r := 1 / z *)
|
||||
PROCEDURE CInv* (z: complex): complex;
|
||||
VAR
|
||||
denom : REAL;
|
||||
BEGIN
|
||||
denom := (z.re * z.re) + (z.im * z.im);
|
||||
(* generates a fpu exception if denom=0 as for reals *)
|
||||
result.re:=z.re/denom;
|
||||
result.im:=-z.im/denom;
|
||||
|
||||
RETURN result
|
||||
END CInv;
|
||||
|
||||
(* direct trigonometric functions *)
|
||||
|
||||
(* Косинус.
|
||||
complex cosinus *)
|
||||
(* cos(x+iy) = cos(x).cos(iy) - sin(x).sin(iy) *)
|
||||
(* cos(ix) = cosh(x) et sin(ix) = i.sinh(x) *)
|
||||
PROCEDURE CCos* (z: complex): complex;
|
||||
BEGIN
|
||||
result.re := Math.cos(z.re) * Math.cosh(z.im);
|
||||
result.im := - Math.sin(z.re) * Math.sinh(z.im);
|
||||
|
||||
RETURN result
|
||||
END CCos;
|
||||
|
||||
(* Синус.
|
||||
sinus complex *)
|
||||
(* sin(x+iy) = sin(x).cos(iy) + cos(x).sin(iy) *)
|
||||
(* cos(ix) = cosh(x) et sin(ix) = i.sinh(x) *)
|
||||
PROCEDURE CSin (z: complex): complex;
|
||||
BEGIN
|
||||
result.re := Math.sin(z.re) * Math.cosh(z.im);
|
||||
result.im := Math.cos(z.re) * Math.sinh(z.im);
|
||||
|
||||
RETURN result
|
||||
END CSin;
|
||||
|
||||
(* Тангенс.
|
||||
tangente *)
|
||||
PROCEDURE CTg* (z: complex): complex;
|
||||
VAR
|
||||
temp1, temp2: complex;
|
||||
BEGIN
|
||||
temp1:=CSin(z);
|
||||
temp2:=CCos(z);
|
||||
result:=CDiv(temp1, temp2);
|
||||
|
||||
RETURN result
|
||||
END CTg;
|
||||
|
||||
(* inverse complex hyperbolic functions *)
|
||||
|
||||
(* Гиперболический арккосинус.
|
||||
hyberbolic arg cosinus *)
|
||||
(* _________ *)
|
||||
(* argch(z) = -/+ ln(z + i.V 1 - z.z) *)
|
||||
PROCEDURE CArcCosh* (z : complex): complex;
|
||||
BEGIN
|
||||
result:=CNeg(CLn(CAdd(z, CMul(i, CSqrt(CSub_r2(1.0, CMul(z, z)))))));
|
||||
|
||||
RETURN result
|
||||
END CArcCosh;
|
||||
|
||||
(* Гиперболический арксинус.
|
||||
hyperbolic arc sinus *)
|
||||
(* ________ *)
|
||||
(* argsh(z) = ln(z + V 1 + z.z) *)
|
||||
PROCEDURE CArcSinh* (z : complex): complex;
|
||||
BEGIN
|
||||
result:=CLn(CAdd(z, CSqrt(CAdd_r(CMul(z, z), 1.0))));
|
||||
|
||||
RETURN result
|
||||
END CArcSinh;
|
||||
|
||||
(* Гиперболический арктангенс.
|
||||
hyperbolic arc tangent *)
|
||||
(* argth(z) = 1/2 ln((z + 1) / (1 - z)) *)
|
||||
PROCEDURE CArcTgh (z : complex): complex;
|
||||
BEGIN
|
||||
result:=CDiv_r(CLn(CDiv(CAdd_r(z, 1.0), CSub_r2(1.0, z))), 2.0);
|
||||
|
||||
RETURN result
|
||||
END CArcTgh;
|
||||
|
||||
(* trigonometriques inverses *)
|
||||
|
||||
(* Арккосинус.
|
||||
arc cosinus complex *)
|
||||
(* arccos(z) = -i.argch(z) *)
|
||||
PROCEDURE CArcCos* (z: complex): complex;
|
||||
BEGIN
|
||||
result := CNeg(CMul(i, CArcCosh(z)));
|
||||
|
||||
RETURN result
|
||||
END CArcCos;
|
||||
|
||||
(* Арксинус.
|
||||
arc sinus complex *)
|
||||
(* arcsin(z) = -i.argsh(i.z) *)
|
||||
PROCEDURE CArcSin* (z : complex): complex;
|
||||
BEGIN
|
||||
result := CNeg(CMul(i, CArcSinh(z)));
|
||||
|
||||
RETURN result
|
||||
END CArcSin;
|
||||
|
||||
(* Арктангенс.
|
||||
arc tangente complex *)
|
||||
(* arctg(z) = -i.argth(i.z) *)
|
||||
PROCEDURE CArcTg* (z : complex): complex;
|
||||
BEGIN
|
||||
result := CNeg(CMul(i, CArcTgh(CMul(i, z))));
|
||||
|
||||
RETURN result
|
||||
END CArcTg;
|
||||
|
||||
BEGIN
|
||||
|
||||
result:=CInit(0.0, 0.0);
|
||||
i :=CInit(0.0, 1.0);
|
||||
_0:=CInit(0.0, 0.0);
|
||||
|
||||
END CMath.
|
||||
@@ -1,33 +0,0 @@
|
||||
(* ****************************************
|
||||
Дополнение к модулю Math.
|
||||
Побитовые операции над целыми числами.
|
||||
Вадим Исаев, 2020
|
||||
Additional functions to the module Math.
|
||||
Bitwise operations on integers.
|
||||
Vadim Isaev, 2020
|
||||
******************************************* *)
|
||||
|
||||
MODULE MathBits;
|
||||
|
||||
|
||||
PROCEDURE iand* (x, y: INTEGER): INTEGER;
|
||||
RETURN ORD(BITS(x) * BITS(y))
|
||||
END iand;
|
||||
|
||||
|
||||
PROCEDURE ior* (x, y: INTEGER): INTEGER;
|
||||
RETURN ORD(BITS(x) + BITS(y))
|
||||
END ior;
|
||||
|
||||
|
||||
PROCEDURE ixor* (x, y: INTEGER): INTEGER;
|
||||
RETURN ORD(BITS(x) / BITS(y))
|
||||
END ixor;
|
||||
|
||||
|
||||
PROCEDURE inot* (x: INTEGER): INTEGER;
|
||||
RETURN ORD(-BITS(x))
|
||||
END inot;
|
||||
|
||||
|
||||
END MathBits.
|
||||
@@ -1,99 +0,0 @@
|
||||
(* ******************************************
|
||||
Дополнительные функции к модулю Math.
|
||||
Функции округления.
|
||||
Вадим Исаев, 2020
|
||||
-------------------------------------
|
||||
Additional functions to the module Math.
|
||||
Rounding functions.
|
||||
Vadim Isaev, 2020
|
||||
********************************************* *)
|
||||
|
||||
MODULE MathRound;
|
||||
|
||||
IMPORT Math;
|
||||
|
||||
|
||||
(* Возвращается целая часть числа x.
|
||||
Returns the integer part of a argument x.*)
|
||||
PROCEDURE trunc* (x: REAL): REAL;
|
||||
VAR
|
||||
a: REAL;
|
||||
|
||||
BEGIN
|
||||
a := FLT(FLOOR(x));
|
||||
IF (x < 0.0) & (x # a) THEN
|
||||
a := a + 1.0
|
||||
END
|
||||
|
||||
RETURN a
|
||||
END trunc;
|
||||
|
||||
|
||||
(* Возвращается дробная часть числа x.
|
||||
Returns the fractional part of the argument x *)
|
||||
PROCEDURE frac* (x: REAL): REAL;
|
||||
RETURN x - trunc(x)
|
||||
END frac;
|
||||
|
||||
|
||||
(* Округление к ближайшему целому.
|
||||
Rounding to the nearest integer. *)
|
||||
PROCEDURE round* (x: REAL): REAL;
|
||||
VAR
|
||||
a: REAL;
|
||||
|
||||
BEGIN
|
||||
a := trunc(x);
|
||||
IF ABS(frac(x)) >= 0.5 THEN
|
||||
a := a + FLT(Math.sgn(x))
|
||||
END
|
||||
|
||||
RETURN a
|
||||
END round;
|
||||
|
||||
|
||||
(* Округление к бОльшему целому.
|
||||
Rounding to a largest integer *)
|
||||
PROCEDURE ceil* (x: REAL): REAL;
|
||||
VAR
|
||||
a: REAL;
|
||||
|
||||
BEGIN
|
||||
a := FLT(FLOOR(x));
|
||||
IF x # a THEN
|
||||
a := a + 1.0
|
||||
END
|
||||
|
||||
RETURN a
|
||||
END ceil;
|
||||
|
||||
|
||||
(* Округление к меньшему целому.
|
||||
Rounding to a smallest integer *)
|
||||
PROCEDURE floor* (x: REAL): REAL;
|
||||
RETURN FLT(FLOOR(x))
|
||||
END floor;
|
||||
|
||||
|
||||
(* Округление до определённого количества знаков:
|
||||
- если Digits отрицательное, то округление
|
||||
в знаках после десятичной запятой;
|
||||
- если Digits положительное, то округление
|
||||
в знаках до запятой *)
|
||||
PROCEDURE SimpleRoundTo* (AValue: REAL; Digits: INTEGER): REAL;
|
||||
VAR
|
||||
RV, a : REAL;
|
||||
|
||||
BEGIN
|
||||
RV := Math.ipower(10.0, -Digits);
|
||||
IF AValue < 0.0 THEN
|
||||
a := trunc((AValue * RV) - 0.5)
|
||||
ELSE
|
||||
a := trunc((AValue * RV) + 0.5)
|
||||
END
|
||||
|
||||
RETURN a / RV
|
||||
END SimpleRoundTo;
|
||||
|
||||
|
||||
END MathRound.
|
||||
@@ -1,238 +0,0 @@
|
||||
(* ********************************************
|
||||
Дополнение к модулю Math.
|
||||
Статистические процедуры.
|
||||
-------------------------------------
|
||||
Additional functions to the module Math.
|
||||
Statistical functions
|
||||
*********************************************** *)
|
||||
|
||||
MODULE MathStat;
|
||||
|
||||
IMPORT Math;
|
||||
|
||||
|
||||
(*Минимальное значение. Нецелое *)
|
||||
PROCEDURE MinValue* (data: ARRAY OF REAL; N: INTEGER): REAL;
|
||||
VAR
|
||||
i: INTEGER;
|
||||
a: REAL;
|
||||
|
||||
BEGIN
|
||||
a := data[0];
|
||||
FOR i := 1 TO N - 1 DO
|
||||
IF data[i] < a THEN
|
||||
a := data[i]
|
||||
END
|
||||
END
|
||||
|
||||
RETURN a
|
||||
END MinValue;
|
||||
|
||||
|
||||
(*Минимальное значение. Целое *)
|
||||
PROCEDURE MinIntValue* (data: ARRAY OF INTEGER; N: INTEGER): INTEGER;
|
||||
VAR
|
||||
i: INTEGER;
|
||||
a: INTEGER;
|
||||
|
||||
BEGIN
|
||||
a := data[0];
|
||||
FOR i := 1 TO N - 1 DO
|
||||
IF data[i] < a THEN
|
||||
a := data[i]
|
||||
END
|
||||
END
|
||||
|
||||
RETURN a
|
||||
END MinIntValue;
|
||||
|
||||
|
||||
(*Максимальное значение. Нецелое *)
|
||||
PROCEDURE MaxValue* (data: ARRAY OF REAL; N: INTEGER): REAL;
|
||||
VAR
|
||||
i: INTEGER;
|
||||
a: REAL;
|
||||
|
||||
BEGIN
|
||||
a := data[0];
|
||||
FOR i := 1 TO N - 1 DO
|
||||
IF data[i] > a THEN
|
||||
a := data[i]
|
||||
END
|
||||
END
|
||||
|
||||
RETURN a
|
||||
END MaxValue;
|
||||
|
||||
|
||||
(*Максимальное значение. Целое *)
|
||||
PROCEDURE MaxIntValue* (data: ARRAY OF INTEGER; N: INTEGER): INTEGER;
|
||||
VAR
|
||||
i: INTEGER;
|
||||
a: INTEGER;
|
||||
|
||||
BEGIN
|
||||
a := data[0];
|
||||
FOR i := 1 TO N - 1 DO
|
||||
IF data[i] > a THEN
|
||||
a := data[i]
|
||||
END
|
||||
END
|
||||
|
||||
RETURN a
|
||||
END MaxIntValue;
|
||||
|
||||
|
||||
(* Сумма значений массива *)
|
||||
PROCEDURE Sum* (data: ARRAY OF REAL; Count: INTEGER): REAL;
|
||||
VAR
|
||||
a: REAL;
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
a := 0.0;
|
||||
FOR i := 0 TO Count - 1 DO
|
||||
a := a + data[i]
|
||||
END
|
||||
|
||||
RETURN a
|
||||
END Sum;
|
||||
|
||||
|
||||
(* Сумма целых значений массива *)
|
||||
PROCEDURE SumInt* (data: ARRAY OF INTEGER; Count: INTEGER): INTEGER;
|
||||
VAR
|
||||
a: INTEGER;
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
a := 0;
|
||||
FOR i := 0 TO Count - 1 DO
|
||||
a := a + data[i]
|
||||
END
|
||||
|
||||
RETURN a
|
||||
END SumInt;
|
||||
|
||||
|
||||
(* Сумма квадратов значений массива *)
|
||||
PROCEDURE SumOfSquares* (data : ARRAY OF REAL; Count: INTEGER): REAL;
|
||||
VAR
|
||||
a: REAL;
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
a := 0.0;
|
||||
FOR i := 0 TO Count - 1 DO
|
||||
a := a + Math.sqrr(data[i])
|
||||
END
|
||||
|
||||
RETURN a
|
||||
END SumOfSquares;
|
||||
|
||||
|
||||
(* Сумма значений и сумма квадратов значений массмва *)
|
||||
PROCEDURE SumsAndSquares* (data: ARRAY OF REAL; Count : INTEGER;
|
||||
VAR sum, sumofsquares : REAL);
|
||||
VAR
|
||||
i: INTEGER;
|
||||
temp: REAL;
|
||||
|
||||
BEGIN
|
||||
sumofsquares := 0.0;
|
||||
sum := 0.0;
|
||||
FOR i := 0 TO Count - 1 DO
|
||||
temp := data[i];
|
||||
sumofsquares := sumofsquares + Math.sqrr(temp);
|
||||
sum := sum + temp
|
||||
END
|
||||
END SumsAndSquares;
|
||||
|
||||
|
||||
(* Средниее значений массива *)
|
||||
PROCEDURE Mean* (data: ARRAY OF REAL; Count: INTEGER): REAL;
|
||||
RETURN Sum(data, Count) / FLT(Count)
|
||||
END Mean;
|
||||
|
||||
|
||||
PROCEDURE MeanAndTotalVariance* (data: ARRAY OF REAL; Count: INTEGER;
|
||||
VAR mu: REAL; VAR variance: REAL);
|
||||
VAR
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
mu := Mean(data, Count);
|
||||
variance := 0.0;
|
||||
FOR i := 0 TO Count - 1 DO
|
||||
variance := variance + Math.sqrr(data[i] - mu)
|
||||
END
|
||||
END MeanAndTotalVariance;
|
||||
|
||||
|
||||
(* Вычисление статистической дисперсии равной сумме квадратов разницы
|
||||
между каждым конкретным значением массива Data и средним значением *)
|
||||
PROCEDURE TotalVariance* (data: ARRAY OF REAL; Count: INTEGER): REAL;
|
||||
VAR
|
||||
mu, tv: REAL;
|
||||
|
||||
BEGIN
|
||||
MeanAndTotalVariance(data, Count, mu, tv)
|
||||
RETURN tv
|
||||
END TotalVariance;
|
||||
|
||||
|
||||
(* Типовая дисперсия всех значений массива *)
|
||||
PROCEDURE Variance* (data: ARRAY OF REAL; Count: INTEGER): REAL;
|
||||
VAR
|
||||
a: REAL;
|
||||
|
||||
BEGIN
|
||||
IF Count = 1 THEN
|
||||
a := 0.0
|
||||
ELSE
|
||||
a := TotalVariance(data, Count) / FLT(Count - 1)
|
||||
END
|
||||
|
||||
RETURN a
|
||||
END Variance;
|
||||
|
||||
|
||||
(* Стандартное среднеквадратичное отклонение *)
|
||||
PROCEDURE StdDev* (data: ARRAY OF REAL; Count: INTEGER): REAL;
|
||||
RETURN Math.sqrt(Variance(data, Count))
|
||||
END StdDev;
|
||||
|
||||
|
||||
(* Среднее арифметическое всех значений массива, и среднее отклонение *)
|
||||
PROCEDURE MeanAndStdDev* (data: ARRAY OF REAL; Count: INTEGER;
|
||||
VAR mean: REAL; VAR stdDev: REAL);
|
||||
VAR
|
||||
totalVariance: REAL;
|
||||
|
||||
BEGIN
|
||||
MeanAndTotalVariance(data, Count, mean, totalVariance);
|
||||
IF Count < 2 THEN
|
||||
stdDev := 0.0
|
||||
ELSE
|
||||
stdDev := Math.sqrt(totalVariance / FLT(Count - 1))
|
||||
END
|
||||
END MeanAndStdDev;
|
||||
|
||||
|
||||
(* Евклидова норма для всех значений массива *)
|
||||
PROCEDURE Norm* (data: ARRAY OF REAL; Count: INTEGER): REAL;
|
||||
VAR
|
||||
a: REAL;
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
a := 0.0;
|
||||
FOR i := 0 TO Count - 1 DO
|
||||
a := a + Math.sqrr(data[i])
|
||||
END
|
||||
|
||||
RETURN Math.sqrt(a)
|
||||
END Norm;
|
||||
|
||||
|
||||
END MathStat.
|
||||
@@ -1,81 +0,0 @@
|
||||
(* ************************************
|
||||
Генератор какбыслучайных чисел,
|
||||
Линейный конгруэнтный метод,
|
||||
алгоритм Лемера.
|
||||
Вадим Исаев, 2020
|
||||
-------------------------------
|
||||
Generator pseudorandom numbers,
|
||||
Linear congruential generator,
|
||||
Algorithm by D. H. Lehmer.
|
||||
Vadim Isaev, 2020
|
||||
*************************************** *)
|
||||
|
||||
MODULE Rand;
|
||||
|
||||
IMPORT HOST, Math;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
RAND_MAX = 2147483647;
|
||||
|
||||
|
||||
VAR
|
||||
seed: INTEGER;
|
||||
|
||||
|
||||
PROCEDURE Randomize*;
|
||||
BEGIN
|
||||
seed := HOST.GetTickCount()
|
||||
END Randomize;
|
||||
|
||||
|
||||
(* Целые какбыслучайные числа до RAND_MAX *)
|
||||
PROCEDURE RandomI* (): INTEGER;
|
||||
CONST
|
||||
a = 630360016;
|
||||
|
||||
BEGIN
|
||||
seed := (a * seed) MOD RAND_MAX
|
||||
RETURN seed
|
||||
END RandomI;
|
||||
|
||||
|
||||
(* Какбыслучайные числа с плавающей запятой от 0 до 1 *)
|
||||
PROCEDURE RandomR* (): REAL;
|
||||
RETURN FLT(RandomI()) / FLT(RAND_MAX)
|
||||
END RandomR;
|
||||
|
||||
|
||||
(* Какбыслучайное число в диапазоне от 0 до l.
|
||||
Return a random number in a range 0 ... l *)
|
||||
PROCEDURE RandomITo* (aTo: INTEGER): INTEGER;
|
||||
RETURN FLOOR(RandomR() * FLT(aTo))
|
||||
END RandomITo;
|
||||
|
||||
|
||||
(* Какбыслучайное число в диапазоне.
|
||||
Return a random number in a range *)
|
||||
PROCEDURE RandomIRange* (aFrom, aTo: INTEGER): INTEGER;
|
||||
RETURN FLOOR(RandomR() * FLT(aTo - aFrom)) + aFrom
|
||||
END RandomIRange;
|
||||
|
||||
|
||||
(* Какбыслучайное число. Распределение Гаусса *)
|
||||
PROCEDURE RandG* (mean, stddev: REAL): REAL;
|
||||
VAR
|
||||
U, S: REAL;
|
||||
|
||||
BEGIN
|
||||
REPEAT
|
||||
U := 2.0 * RandomR() - 1.0;
|
||||
S := Math.sqrr(U) + Math.sqrr(2.0 * RandomR() - 1.0)
|
||||
UNTIL (1.0E-20 < S) & (S <= 1.0)
|
||||
|
||||
RETURN Math.sqrt(-2.0 * Math.ln(S) / S) * U * stddev + mean
|
||||
END RandG;
|
||||
|
||||
|
||||
BEGIN
|
||||
seed := 654321
|
||||
END Rand.
|
||||
@@ -1,298 +0,0 @@
|
||||
(* ************************************************************
|
||||
Дополнительные алгоритмы генераторов какбыслучайных чисел.
|
||||
Вадим Исаев, 2020
|
||||
|
||||
Additional generators of pseudorandom numbers.
|
||||
Vadim Isaev, 2020
|
||||
************************************************************ *)
|
||||
|
||||
MODULE RandExt;
|
||||
|
||||
IMPORT HOST, MathRound, MathBits;
|
||||
|
||||
CONST
|
||||
(* Для алгоритма Мерсена-Твистера *)
|
||||
N = 624;
|
||||
M = 397;
|
||||
MATRIX_A = 9908B0DFH; (* constant vector a *)
|
||||
UPPER_MASK = 80000000H; (* most significant w-r bits *)
|
||||
LOWER_MASK = 7FFFFFFFH; (* least significant r bits *)
|
||||
INT_MAX = 4294967295;
|
||||
|
||||
|
||||
TYPE
|
||||
(* структура служебных данных, для алгоритма mrg32k3a *)
|
||||
random_t = RECORD
|
||||
mrg32k3a_seed : REAL;
|
||||
mrg32k3a_x : ARRAY 3 OF REAL;
|
||||
mrg32k3a_y : ARRAY 3 OF REAL
|
||||
END;
|
||||
|
||||
(* Для алгоритма Мерсена-Твистера *)
|
||||
MTKeyArray = ARRAY N OF INTEGER;
|
||||
|
||||
VAR
|
||||
(* Для алгоритма mrg32k3a *)
|
||||
prndl: random_t;
|
||||
(* Для алгоритма Мерсена-Твистера *)
|
||||
mt : MTKeyArray; (* the array for the state vector *)
|
||||
mti : INTEGER; (* mti == N+1 means mt[N] is not initialized *)
|
||||
|
||||
(* ---------------------------------------------------------------------------
|
||||
Генератор какбыслучайных чисел в диапазоне [a,b].
|
||||
Алгоритм 133б из книги "Агеев и др. - Бибилотека алгоритмов 101б-150б",
|
||||
стр. 53.
|
||||
Переделка из Algol на Oberon и доработка, Вадим Исаев, 2020
|
||||
|
||||
Generator pseudorandom numbers, algorithm 133b from
|
||||
Comm ACM 5,10 (Oct 1962) 553.
|
||||
Convert from Algol to Oberon Vadim Isaev, 2020.
|
||||
|
||||
Входные параметры:
|
||||
a - начальное вычисляемое значение, тип REAL;
|
||||
b - конечное вычисляемое значение, тип REAL;
|
||||
seed - начальное значение для генерации случайного числа.
|
||||
Должно быть в диапазоне от 10 000 000 000 до 34 359 738 368 (2^35),
|
||||
нечётное.
|
||||
--------------------------------------------------------------------------- *)
|
||||
PROCEDURE alg133b* (a, b: REAL; VAR seed: INTEGER): REAL;
|
||||
CONST
|
||||
m35 = 34359738368;
|
||||
m36 = 68719476736;
|
||||
m37 = 137438953472;
|
||||
|
||||
VAR
|
||||
x: INTEGER;
|
||||
BEGIN
|
||||
IF seed # 0 THEN
|
||||
IF (seed MOD 2 = 0) THEN
|
||||
seed := seed + 1
|
||||
END;
|
||||
x:=seed;
|
||||
seed:=0;
|
||||
END;
|
||||
|
||||
x:=5*x;
|
||||
IF x>=m37 THEN
|
||||
x:=x-m37
|
||||
END;
|
||||
IF x>=m36 THEN
|
||||
x:=x-m36
|
||||
END;
|
||||
IF x>=m35 THEN
|
||||
x:=x-m35
|
||||
END;
|
||||
|
||||
RETURN FLT(x) / FLT(m35) * (b - a) + a
|
||||
END alg133b;
|
||||
|
||||
(* ----------------------------------------------------------
|
||||
Генератор почти равномерно распределённых
|
||||
какбыслучайных чисел mrg32k3a
|
||||
(Combined Multiple Recursive Generator) от 0 до 1.
|
||||
Период повторения последовательности = 2^127
|
||||
|
||||
Generator pseudorandom numbers,
|
||||
algorithm mrg32k3a.
|
||||
|
||||
Переделка из FreePascal на Oberon, Вадим Исаев, 2020
|
||||
Convert from FreePascal to Oberon, Vadim Isaev, 2020
|
||||
---------------------------------------------------------- *)
|
||||
(* Инициализация генератора.
|
||||
|
||||
Входные параметры:
|
||||
seed - значение для инициализации. Любое. Если передать
|
||||
ноль, то вместо ноля будет подставлено кол-во
|
||||
процессорных тиков. *)
|
||||
PROCEDURE mrg32k3a_init* (seed: REAL);
|
||||
BEGIN
|
||||
prndl.mrg32k3a_x[0] := 1.0;
|
||||
prndl.mrg32k3a_x[1] := 1.0;
|
||||
prndl.mrg32k3a_y[0] := 1.0;
|
||||
prndl.mrg32k3a_y[1] := 1.0;
|
||||
prndl.mrg32k3a_y[2] := 1.0;
|
||||
|
||||
IF seed # 0.0 THEN
|
||||
prndl.mrg32k3a_x[2] := seed;
|
||||
ELSE
|
||||
prndl.mrg32k3a_x[2] := FLT(HOST.GetTickCount());
|
||||
END;
|
||||
|
||||
END mrg32k3a_init;
|
||||
|
||||
(* Генератор какбыслучайных чисел от 0.0 до 1.0. *)
|
||||
PROCEDURE mrg32k3a* (): REAL;
|
||||
|
||||
CONST
|
||||
(* random MRG32K3A algorithm constants *)
|
||||
MRG32K3A_NORM = 2.328306549295728E-10;
|
||||
MRG32K3A_M1 = 4294967087.0;
|
||||
MRG32K3A_M2 = 4294944443.0;
|
||||
MRG32K3A_A12 = 1403580.0;
|
||||
MRG32K3A_A13 = 810728.0;
|
||||
MRG32K3A_A21 = 527612.0;
|
||||
MRG32K3A_A23 = 1370589.0;
|
||||
RAND_BUFSIZE = 512;
|
||||
|
||||
VAR
|
||||
|
||||
xn, yn, result: REAL;
|
||||
|
||||
BEGIN
|
||||
(* Часть 1 *)
|
||||
xn := MRG32K3A_A12 * prndl.mrg32k3a_x[1] - MRG32K3A_A13 * prndl.mrg32k3a_x[2];
|
||||
xn := xn - MathRound.trunc(xn / MRG32K3A_M1) * MRG32K3A_M1;
|
||||
IF xn < 0.0 THEN
|
||||
xn := xn + MRG32K3A_M1;
|
||||
END;
|
||||
|
||||
prndl.mrg32k3a_x[2] := prndl.mrg32k3a_x[1];
|
||||
prndl.mrg32k3a_x[1] := prndl.mrg32k3a_x[0];
|
||||
prndl.mrg32k3a_x[0] := xn;
|
||||
|
||||
(* Часть 2 *)
|
||||
yn := MRG32K3A_A21 * prndl.mrg32k3a_y[0] - MRG32K3A_A23 * prndl.mrg32k3a_y[2];
|
||||
yn := yn - MathRound.trunc(yn / MRG32K3A_M2) * MRG32K3A_M2;
|
||||
IF yn < 0.0 THEN
|
||||
yn := yn + MRG32K3A_M2;
|
||||
END;
|
||||
|
||||
prndl.mrg32k3a_y[2] := prndl.mrg32k3a_y[1];
|
||||
prndl.mrg32k3a_y[1] := prndl.mrg32k3a_y[0];
|
||||
prndl.mrg32k3a_y[0] := yn;
|
||||
|
||||
(* Смешение частей *)
|
||||
IF xn <= yn THEN
|
||||
result := ((xn - yn + MRG32K3A_M1) * MRG32K3A_NORM)
|
||||
ELSE
|
||||
result := (xn - yn) * MRG32K3A_NORM;
|
||||
END;
|
||||
|
||||
RETURN result
|
||||
END mrg32k3a;
|
||||
|
||||
|
||||
(* -------------------------------------------------------------------
|
||||
Генератор какбыслучайных чисел, алгоритм Мерсена-Твистера (MT19937).
|
||||
Переделка из Delphi в Oberon Вадим Исаев, 2020.
|
||||
|
||||
Mersenne Twister Random Number Generator.
|
||||
|
||||
A C-program for MT19937, with initialization improved 2002/1/26.
|
||||
Coded by Takuji Nishimura and Makoto Matsumoto.
|
||||
|
||||
Adapted for DMath by Jean Debord - Feb. 2007
|
||||
Adapted for Oberon-07 by Vadim Isaev - May 2020
|
||||
------------------------------------------------------------ *)
|
||||
(* Initializes MT generator with a seed *)
|
||||
PROCEDURE InitMT(Seed : INTEGER);
|
||||
VAR
|
||||
i : INTEGER;
|
||||
BEGIN
|
||||
mt[0] := MathBits.iand(Seed, INT_MAX);
|
||||
FOR i := 1 TO N-1 DO
|
||||
mt[i] := (1812433253 * MathBits.ixor(mt[i-1], LSR(mt[i-1], 30)) + i);
|
||||
(* See Knuth TAOCP Vol2. 3rd Ed. P.106 For multiplier.
|
||||
In the previous versions, MSBs of the seed affect
|
||||
only MSBs of the array mt[].
|
||||
2002/01/09 modified by Makoto Matsumoto *)
|
||||
mt[i] := MathBits.iand(mt[i], INT_MAX);
|
||||
(* For >32 Bit machines *)
|
||||
END;
|
||||
mti := N;
|
||||
END InitMT;
|
||||
|
||||
(* Initialize MT generator with an array InitKey[0..(KeyLength - 1)] *)
|
||||
PROCEDURE InitMTbyArray(InitKey : MTKeyArray; KeyLength : INTEGER);
|
||||
VAR
|
||||
i, j, k, k1 : INTEGER;
|
||||
BEGIN
|
||||
InitMT(19650218);
|
||||
|
||||
i := 1;
|
||||
j := 0;
|
||||
|
||||
IF N > KeyLength THEN
|
||||
k1 := N
|
||||
ELSE
|
||||
k1 := KeyLength;
|
||||
END;
|
||||
|
||||
FOR k := k1 TO 1 BY -1 DO
|
||||
(* non linear *)
|
||||
mt[i] := MathBits.ixor(mt[i], (MathBits.ixor(mt[i-1], LSR(mt[i-1], 30)) * 1664525)) + InitKey[j] + j;
|
||||
mt[i] := MathBits.iand(mt[i], INT_MAX); (* for WORDSIZE > 32 machines *)
|
||||
INC(i);
|
||||
INC(j);
|
||||
IF i >= N THEN
|
||||
mt[0] := mt[N-1];
|
||||
i := 1;
|
||||
END;
|
||||
IF j >= KeyLength THEN
|
||||
j := 0;
|
||||
END;
|
||||
END;
|
||||
|
||||
FOR k := N-1 TO 1 BY -1 DO
|
||||
(* non linear *)
|
||||
mt[i] := MathBits.ixor(mt[i], (MathBits.ixor(mt[i-1], LSR(mt[i-1], 30)) * 1566083941)) - i;
|
||||
mt[i] := MathBits.iand(mt[i], INT_MAX); (* for WORDSIZE > 32 machines *)
|
||||
INC(i);
|
||||
IF i >= N THEN
|
||||
mt[0] := mt[N-1];
|
||||
i := 1;
|
||||
END;
|
||||
END;
|
||||
|
||||
mt[0] := UPPER_MASK; (* MSB is 1; assuring non-zero initial array *)
|
||||
|
||||
END InitMTbyArray;
|
||||
|
||||
(* Generates a integer Random number on [-2^31 .. 2^31 - 1] interval *)
|
||||
PROCEDURE IRanMT(): INTEGER;
|
||||
VAR
|
||||
mag01 : ARRAY 2 OF INTEGER;
|
||||
y,k : INTEGER;
|
||||
BEGIN
|
||||
IF mti >= N THEN (* generate N words at one Time *)
|
||||
(* If IRanMT() has not been called, a default initial seed is used *)
|
||||
IF mti = N + 1 THEN
|
||||
InitMT(5489);
|
||||
END;
|
||||
|
||||
FOR k := 0 TO (N-M)-1 DO
|
||||
y := MathBits.ior(MathBits.iand(mt[k], UPPER_MASK), MathBits.iand(mt[k+1], LOWER_MASK));
|
||||
mt[k] := MathBits.ixor(MathBits.ixor(mt[k+M], LSR(y, 1)), mag01[MathBits.iand(y, 1H)]);
|
||||
END;
|
||||
|
||||
FOR k := (N-M) TO (N-2) DO
|
||||
y := MathBits.ior(MathBits.iand(mt[k], UPPER_MASK), MathBits.iand(mt[k+1], LOWER_MASK));
|
||||
mt[k] := MathBits.ixor(mt[k - (N - M)], MathBits.ixor(LSR(y, 1), mag01[MathBits.iand(y, 1H)]));
|
||||
END;
|
||||
|
||||
y := MathBits.ior(MathBits.iand(mt[N-1], UPPER_MASK), MathBits.iand(mt[0], LOWER_MASK));
|
||||
mt[N-1] := MathBits.ixor(mt[M-1], MathBits.ixor(LSR(y, 1), mag01[MathBits.iand(y, 1H)]));
|
||||
|
||||
mti := 0;
|
||||
END;
|
||||
|
||||
y := mt[mti];
|
||||
INC(mti);
|
||||
|
||||
(* Tempering *)
|
||||
y := MathBits.ixor(y, LSR(y, 11));
|
||||
y := MathBits.ixor(y, MathBits.iand(LSL(y, 7), 9D2C5680H));
|
||||
y := MathBits.ixor(y, MathBits.iand(LSL(y, 15), 4022730752));
|
||||
y := MathBits.ixor(y, LSR(y, 18));
|
||||
|
||||
RETURN y
|
||||
END IRanMT;
|
||||
|
||||
(* Generates a real Random number on [0..1] interval *)
|
||||
PROCEDURE RRanMT(): REAL;
|
||||
BEGIN
|
||||
RETURN FLT(IRanMT())/FLT(INT_MAX)
|
||||
END RRanMT;
|
||||
|
||||
|
||||
END RandExt.
|
||||
@@ -1,5 +0,0 @@
|
||||
#SHS
|
||||
/kolibrios/develop/oberon07/compiler.kex HW.ob07 kosexe -out /tmp0/1/HW.kex -stk 1
|
||||
/kolibrios/develop/oberon07/compiler.kex HW_con.ob07 kosexe -out /tmp0/1/HW_con.kex -stk 1
|
||||
/kolibrios/develop/oberon07/compiler.kex Dialogs.ob07 kosexe -out /tmp0/1/Dialogs.kex -stk 1
|
||||
exit
|
||||
@@ -1,159 +0,0 @@
|
||||
MODULE Dialogs;
|
||||
|
||||
IMPORT
|
||||
KOSAPI, SYSTEM, OpenDlg, ColorDlg;
|
||||
|
||||
|
||||
CONST
|
||||
btnNone = 0;
|
||||
btnClose = 1;
|
||||
btnOpen = 17;
|
||||
btnColor = 18;
|
||||
|
||||
|
||||
VAR
|
||||
header: ARRAY 1024 OF CHAR;
|
||||
back_color: INTEGER;
|
||||
|
||||
|
||||
PROCEDURE BeginDraw;
|
||||
BEGIN
|
||||
KOSAPI.sysfunc2(12, 1)
|
||||
END BeginDraw;
|
||||
|
||||
|
||||
PROCEDURE EndDraw;
|
||||
BEGIN
|
||||
KOSAPI.sysfunc2(12, 2)
|
||||
END EndDraw;
|
||||
|
||||
|
||||
PROCEDURE DefineAndDrawWindow (left, top, width, height, color, style, hcolor, hstyle: INTEGER; header: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
KOSAPI.sysfunc6(0, left*65536 + width, top*65536 + height, color + LSL(style, 24), hcolor + LSL(hstyle, 24), SYSTEM.ADR(header[0]))
|
||||
END DefineAndDrawWindow;
|
||||
|
||||
|
||||
PROCEDURE WaitForEvent (): INTEGER;
|
||||
RETURN KOSAPI.sysfunc1(10)
|
||||
END WaitForEvent;
|
||||
|
||||
|
||||
PROCEDURE ExitApp;
|
||||
BEGIN
|
||||
KOSAPI.sysfunc1(-1)
|
||||
END ExitApp;
|
||||
|
||||
|
||||
PROCEDURE pause (t: INTEGER);
|
||||
BEGIN
|
||||
KOSAPI.sysfunc2(5, t)
|
||||
END pause;
|
||||
|
||||
|
||||
PROCEDURE Buttons;
|
||||
|
||||
PROCEDURE Button (id, X, Y, W, H: INTEGER; Caption: ARRAY OF CHAR);
|
||||
VAR
|
||||
n: INTEGER;
|
||||
BEGIN
|
||||
n := LENGTH(Caption);
|
||||
KOSAPI.sysfunc5(8, X*65536 + W, Y*65536 + H, id, 00C0C0C0H);
|
||||
X := X + (W - 8*n) DIV 2;
|
||||
Y := Y + (H - 14) DIV 2;
|
||||
KOSAPI.sysfunc6(4, X*65536 + Y, LSL(48, 24), SYSTEM.ADR(Caption[0]), n, 0)
|
||||
END Button;
|
||||
|
||||
BEGIN
|
||||
Button(btnOpen, 5, 5, 70, 25, "open");
|
||||
Button(btnColor, 85, 5, 70, 25, "color");
|
||||
END Buttons;
|
||||
|
||||
|
||||
PROCEDURE draw_window;
|
||||
BEGIN
|
||||
BeginDraw;
|
||||
DefineAndDrawWindow(200, 200, 500, 100, back_color, 51, 0, 0, header);
|
||||
Buttons;
|
||||
EndDraw;
|
||||
END draw_window;
|
||||
|
||||
|
||||
PROCEDURE OpenFile (Open: OpenDlg.Dialog);
|
||||
BEGIN
|
||||
IF Open # NIL THEN
|
||||
OpenDlg.Show(Open, 500, 450);
|
||||
WHILE Open.status = 2 DO
|
||||
pause(30)
|
||||
END;
|
||||
IF Open.status = 1 THEN
|
||||
COPY(Open.FilePath, header)
|
||||
END
|
||||
END
|
||||
END OpenFile;
|
||||
|
||||
|
||||
PROCEDURE SelColor (Color: ColorDlg.Dialog);
|
||||
BEGIN
|
||||
IF Color # NIL THEN
|
||||
ColorDlg.Show(Color);
|
||||
WHILE Color.status = 2 DO
|
||||
pause(30)
|
||||
END;
|
||||
IF Color.status = 1 THEN
|
||||
back_color := Color.color
|
||||
END
|
||||
END
|
||||
END SelColor;
|
||||
|
||||
|
||||
PROCEDURE GetButton (): INTEGER;
|
||||
VAR
|
||||
btn: INTEGER;
|
||||
BEGIN
|
||||
btn := KOSAPI.sysfunc1(17);
|
||||
IF btn MOD 256 = 0 THEN
|
||||
btn := btn DIV 256
|
||||
ELSE
|
||||
btn := btnNone
|
||||
END
|
||||
RETURN btn
|
||||
END GetButton;
|
||||
|
||||
|
||||
PROCEDURE main;
|
||||
CONST
|
||||
EVENT_REDRAW = 1;
|
||||
EVENT_KEY = 2;
|
||||
EVENT_BUTTON = 3;
|
||||
VAR
|
||||
Open: OpenDlg.Dialog;
|
||||
Color: ColorDlg.Dialog;
|
||||
BEGIN
|
||||
back_color := 00FFFFFFH;
|
||||
header := "Dialogs";
|
||||
Open := OpenDlg.Create(draw_window, 0, "/sys", "ASM|TXT|INI");
|
||||
Color := ColorDlg.Create(draw_window);
|
||||
|
||||
WHILE TRUE DO
|
||||
CASE WaitForEvent() OF
|
||||
|EVENT_REDRAW:
|
||||
draw_window
|
||||
|
||||
|EVENT_KEY:
|
||||
|
||||
|EVENT_BUTTON:
|
||||
CASE GetButton() OF
|
||||
|btnNone:
|
||||
|btnClose: ExitApp
|
||||
|btnOpen: OpenFile(Open)
|
||||
|btnColor: SelColor(Color)
|
||||
END
|
||||
END
|
||||
END
|
||||
END main;
|
||||
|
||||
|
||||
BEGIN
|
||||
main
|
||||
END Dialogs.
|
||||
@@ -1,78 +0,0 @@
|
||||
MODULE HW;
|
||||
|
||||
IMPORT
|
||||
SYSTEM, KOSAPI;
|
||||
|
||||
|
||||
PROCEDURE BeginDraw;
|
||||
BEGIN
|
||||
KOSAPI.sysfunc2(12, 1)
|
||||
END BeginDraw;
|
||||
|
||||
|
||||
PROCEDURE EndDraw;
|
||||
BEGIN
|
||||
KOSAPI.sysfunc2(12, 2)
|
||||
END EndDraw;
|
||||
|
||||
|
||||
PROCEDURE DefineAndDrawWindow (left, top, width, height, color, style, hcolor, hstyle: INTEGER; header: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
KOSAPI.sysfunc6(0, left*65536 + width, top*65536 + height, color + LSL(style, 24), hcolor + LSL(hstyle, 24), SYSTEM.ADR(header[0]))
|
||||
END DefineAndDrawWindow;
|
||||
|
||||
|
||||
PROCEDURE WriteTextToWindow (x, y, color: INTEGER; text: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
KOSAPI.sysfunc6(4, x*65536 + y, color + LSL(48, 24), SYSTEM.ADR(text[0]), LENGTH(text), 0)
|
||||
END WriteTextToWindow;
|
||||
|
||||
|
||||
PROCEDURE WaitForEvent (): INTEGER;
|
||||
RETURN KOSAPI.sysfunc1(10)
|
||||
END WaitForEvent;
|
||||
|
||||
|
||||
PROCEDURE ExitApp;
|
||||
BEGIN
|
||||
KOSAPI.sysfunc1(-1)
|
||||
END ExitApp;
|
||||
|
||||
|
||||
PROCEDURE draw_window (header, text: ARRAY OF CHAR);
|
||||
CONST
|
||||
WHITE = 0FFFFFFH;
|
||||
RED = 0C00000H;
|
||||
GREEN = 0008000H;
|
||||
BLUE = 00000C0H;
|
||||
GRAY = 0808080H;
|
||||
BEGIN
|
||||
BeginDraw;
|
||||
DefineAndDrawWindow(200, 200, 300, 150, WHITE, 51, 0, 0, header);
|
||||
WriteTextToWindow( 5, 10, RED, text);
|
||||
WriteTextToWindow(35, 30, GREEN, text);
|
||||
WriteTextToWindow(65, 50, BLUE, text);
|
||||
WriteTextToWindow(95, 70, GRAY, text);
|
||||
EndDraw
|
||||
END draw_window;
|
||||
|
||||
|
||||
PROCEDURE main (header, text: ARRAY OF CHAR);
|
||||
CONST
|
||||
EVENT_REDRAW = 1;
|
||||
EVENT_KEY = 2;
|
||||
EVENT_BUTTON = 3;
|
||||
BEGIN
|
||||
WHILE TRUE DO
|
||||
CASE WaitForEvent() OF
|
||||
|EVENT_REDRAW: draw_window(header, text)
|
||||
|EVENT_KEY: ExitApp
|
||||
|EVENT_BUTTON: ExitApp
|
||||
END
|
||||
END
|
||||
END main;
|
||||
|
||||
|
||||
BEGIN
|
||||
main("Hello", "Hello, world!")
|
||||
END HW.
|
||||
@@ -1,59 +0,0 @@
|
||||
MODULE HW_con;
|
||||
|
||||
IMPORT
|
||||
Out, In, Console, DateTime;
|
||||
|
||||
|
||||
PROCEDURE OutInt2 (n: INTEGER);
|
||||
BEGIN
|
||||
ASSERT((0 <= n) & (n <= 99));
|
||||
IF n < 10 THEN
|
||||
Out.Char("0")
|
||||
END;
|
||||
Out.Int(n, 0)
|
||||
END OutInt2;
|
||||
|
||||
|
||||
PROCEDURE OutMonth (n: INTEGER);
|
||||
VAR
|
||||
str: ARRAY 4 OF CHAR;
|
||||
BEGIN
|
||||
CASE n OF
|
||||
| 1: str := "jan"
|
||||
| 2: str := "feb"
|
||||
| 3: str := "mar"
|
||||
| 4: str := "apr"
|
||||
| 5: str := "may"
|
||||
| 6: str := "jun"
|
||||
| 7: str := "jul"
|
||||
| 8: str := "aug"
|
||||
| 9: str := "sep"
|
||||
|10: str := "oct"
|
||||
|11: str := "nov"
|
||||
|12: str := "dec"
|
||||
END;
|
||||
Out.String(str)
|
||||
END OutMonth;
|
||||
|
||||
|
||||
PROCEDURE main;
|
||||
VAR
|
||||
Year, Month, Day,
|
||||
Hour, Min, Sec, Msec: INTEGER;
|
||||
BEGIN
|
||||
Out.String("Hello, world!"); Out.Ln;
|
||||
Console.SetColor(Console.White, Console.Red);
|
||||
DateTime.Now(Year, Month, Day, Hour, Min, Sec, Msec);
|
||||
OutInt2(Day); Out.Char("-"); OutMonth(Month); Out.Char("-"); Out.Int(Year, 0); Out.Char(" ");
|
||||
OutInt2(Hour); Out.Char(":"); OutInt2(Min); Out.Char(":"); OutInt2(Sec); Out.Ln;
|
||||
Console.SetColor(Console.Blue, Console.LightGray);
|
||||
Out.Ln; Out.String("press enter...");
|
||||
In.Ln
|
||||
END main;
|
||||
|
||||
|
||||
BEGIN
|
||||
Console.open;
|
||||
main;
|
||||
Console.exit(TRUE)
|
||||
END HW_con.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,797 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2022, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE ARITH;
|
||||
|
||||
IMPORT STRINGS, UTILS, LISTS;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
tINTEGER* = 1; tREAL* = 2; tSET* = 3;
|
||||
tBOOLEAN* = 4; tCHAR* = 5; tWCHAR* = 6;
|
||||
tSTRING* = 7;
|
||||
|
||||
opEQ* = 0; opNE* = 1; opLT* = 2; opLE* = 3; opGT* = 4; opGE* = 5;
|
||||
opIN* = 6; opIS* = 7;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
VALUE* = RECORD
|
||||
|
||||
typ*: INTEGER;
|
||||
|
||||
int: INTEGER;
|
||||
float: REAL;
|
||||
set: SET;
|
||||
bool: BOOLEAN;
|
||||
|
||||
string*: LISTS.ITEM
|
||||
|
||||
END;
|
||||
|
||||
|
||||
VAR
|
||||
|
||||
digit: ARRAY 256 OF INTEGER;
|
||||
|
||||
|
||||
PROCEDURE Int* (v: VALUE): INTEGER;
|
||||
VAR
|
||||
res: INTEGER;
|
||||
|
||||
BEGIN
|
||||
|
||||
CASE v.typ OF
|
||||
|tINTEGER, tCHAR, tWCHAR:
|
||||
res := v.int
|
||||
|tSET:
|
||||
res := UTILS.Long(ORD(v.set))
|
||||
|tBOOLEAN:
|
||||
res := ORD(v.bool)
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END Int;
|
||||
|
||||
|
||||
PROCEDURE getBool* (v: VALUE): BOOLEAN;
|
||||
BEGIN
|
||||
ASSERT(v.typ = tBOOLEAN);
|
||||
|
||||
RETURN v.bool
|
||||
END getBool;
|
||||
|
||||
|
||||
PROCEDURE Float* (v: VALUE): REAL;
|
||||
BEGIN
|
||||
ASSERT(v.typ = tREAL);
|
||||
|
||||
RETURN v.float
|
||||
END Float;
|
||||
|
||||
|
||||
PROCEDURE range* (i: VALUE; a, b: INTEGER): BOOLEAN;
|
||||
RETURN (a <= i.int) & (i.int <= b)
|
||||
END range;
|
||||
|
||||
|
||||
PROCEDURE check* (v: VALUE): BOOLEAN;
|
||||
VAR
|
||||
res: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
CASE v.typ OF
|
||||
|tINTEGER: res := range(v, UTILS.target.minInt, UTILS.target.maxInt)
|
||||
|tCHAR: res := range(v, 0, 255)
|
||||
|tWCHAR: res := range(v, 0, 65535)
|
||||
|tREAL: res := (-UTILS.target.maxReal <= v.float) & (v.float <= UTILS.target.maxReal)
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END check;
|
||||
|
||||
|
||||
PROCEDURE isZero* (v: VALUE): BOOLEAN;
|
||||
VAR
|
||||
res: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
CASE v.typ OF
|
||||
|tINTEGER: res := v.int = 0
|
||||
|tREAL: res := v.float = 0.0
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END isZero;
|
||||
|
||||
|
||||
PROCEDURE iconv* (s: ARRAY OF CHAR; VAR v: VALUE; VAR error: INTEGER);
|
||||
VAR
|
||||
value: INTEGER;
|
||||
i: INTEGER;
|
||||
d: INTEGER;
|
||||
|
||||
BEGIN
|
||||
error := 0;
|
||||
value := 0;
|
||||
|
||||
i := 0;
|
||||
WHILE STRINGS.digit(s[i]) & (error = 0) DO
|
||||
d := digit[ORD(s[i])];
|
||||
IF value <= (UTILS.maxint - d) DIV 10 THEN
|
||||
value := value * 10 + d;
|
||||
INC(i)
|
||||
ELSE
|
||||
error := 1
|
||||
END
|
||||
END;
|
||||
|
||||
IF error = 0 THEN
|
||||
v.int := value;
|
||||
v.typ := tINTEGER;
|
||||
IF ~check(v) THEN
|
||||
error := 1
|
||||
END
|
||||
END
|
||||
|
||||
END iconv;
|
||||
|
||||
|
||||
PROCEDURE hconv* (s: ARRAY OF CHAR; VAR v: VALUE; VAR error: INTEGER);
|
||||
VAR
|
||||
value: INTEGER;
|
||||
i: INTEGER;
|
||||
n: INTEGER;
|
||||
d: INTEGER;
|
||||
|
||||
BEGIN
|
||||
ASSERT(STRINGS.digit(s[0]));
|
||||
|
||||
error := 0;
|
||||
value := 0;
|
||||
|
||||
n := -1;
|
||||
i := 0;
|
||||
WHILE (s[i] # "H") & (s[i] # "X") & (s[i] # "h") & (s[i] # "x") & (error = 0) DO
|
||||
|
||||
d := digit[ORD(s[i])];
|
||||
IF (n = -1) & (d # 0) THEN
|
||||
n := i
|
||||
END;
|
||||
|
||||
IF (n # -1) & (i - n + 1 > UTILS.target.maxHex) THEN
|
||||
error := 2
|
||||
ELSE
|
||||
value := value * 16 + d;
|
||||
INC(i)
|
||||
END
|
||||
|
||||
END;
|
||||
|
||||
value := UTILS.Long(value);
|
||||
|
||||
IF ((s[i] = "X") OR (s[i] = "x")) & (n # -1) & (i - n > 4) THEN
|
||||
error := 3
|
||||
END;
|
||||
|
||||
IF error = 0 THEN
|
||||
v.int := value;
|
||||
IF (s[i] = "X") OR (s[i] = "x") THEN
|
||||
v.typ := tCHAR;
|
||||
IF ~check(v) THEN
|
||||
v.typ := tWCHAR;
|
||||
IF ~check(v) THEN
|
||||
error := 3
|
||||
END
|
||||
END
|
||||
ELSE
|
||||
v.typ := tINTEGER;
|
||||
IF ~check(v) THEN
|
||||
error := 2
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
END hconv;
|
||||
|
||||
|
||||
PROCEDURE opFloat2 (VAR a: REAL; b: REAL; op: CHAR): BOOLEAN;
|
||||
BEGIN
|
||||
CASE op OF
|
||||
|"+": a := a + b
|
||||
|"-": a := a - b
|
||||
|"*": a := a * b
|
||||
|"/": a := a / b
|
||||
END
|
||||
|
||||
RETURN (-UTILS.maxreal <= a) & (a <= UTILS.maxreal) (* +inf > UTILS.maxreal *)
|
||||
END opFloat2;
|
||||
|
||||
|
||||
PROCEDURE fconv* (s: ARRAY OF CHAR; VAR v: VALUE; VAR error: INTEGER);
|
||||
VAR
|
||||
value: REAL;
|
||||
exp10: REAL;
|
||||
i, n, d: INTEGER;
|
||||
minus: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
error := 0;
|
||||
value := 0.0;
|
||||
minus := FALSE;
|
||||
n := 0;
|
||||
|
||||
exp10 := 0.0;
|
||||
WHILE (error = 0) & (STRINGS.digit(s[i]) OR (s[i] = ".")) DO
|
||||
IF s[i] = "." THEN
|
||||
exp10 := 1.0;
|
||||
INC(i)
|
||||
ELSE
|
||||
IF opFloat2(value, 10.0, "*") & opFloat2(value, FLT(digit[ORD(s[i])]), "+") & opFloat2(exp10, 10.0, "*") THEN
|
||||
INC(i)
|
||||
ELSE
|
||||
error := 4
|
||||
END
|
||||
END
|
||||
END;
|
||||
|
||||
IF ~opFloat2(value, exp10, "/") THEN
|
||||
error := 4
|
||||
END;
|
||||
|
||||
IF (s[i] = "E") OR (s[i] = "e") THEN
|
||||
INC(i)
|
||||
END;
|
||||
|
||||
IF (s[i] = "-") OR (s[i] = "+") THEN
|
||||
minus := s[i] = "-";
|
||||
INC(i)
|
||||
END;
|
||||
|
||||
WHILE (error = 0) & STRINGS.digit(s[i]) DO
|
||||
d := digit[ORD(s[i])];
|
||||
IF n <= (UTILS.maxint - d) DIV 10 THEN
|
||||
n := n * 10 + d;
|
||||
INC(i)
|
||||
ELSE
|
||||
error := 5
|
||||
END
|
||||
END;
|
||||
|
||||
exp10 := 1.0;
|
||||
WHILE (error = 0) & (n > 0) DO
|
||||
IF opFloat2(exp10, 10.0, "*") THEN
|
||||
DEC(n)
|
||||
ELSE
|
||||
error := 4
|
||||
END
|
||||
END;
|
||||
|
||||
IF error = 0 THEN
|
||||
IF minus THEN
|
||||
IF ~opFloat2(value, exp10, "/") THEN
|
||||
error := 4
|
||||
END
|
||||
ELSE
|
||||
IF ~opFloat2(value, exp10, "*") THEN
|
||||
error := 4
|
||||
END
|
||||
END
|
||||
END;
|
||||
|
||||
IF error = 0 THEN
|
||||
v.float := value;
|
||||
v.typ := tREAL;
|
||||
IF ~check(v) THEN
|
||||
error := 4
|
||||
END
|
||||
END
|
||||
|
||||
END fconv;
|
||||
|
||||
|
||||
PROCEDURE setChar* (VAR v: VALUE; ord: INTEGER);
|
||||
BEGIN
|
||||
v.typ := tCHAR;
|
||||
v.int := ord
|
||||
END setChar;
|
||||
|
||||
|
||||
PROCEDURE setWChar* (VAR v: VALUE; ord: INTEGER);
|
||||
BEGIN
|
||||
v.typ := tWCHAR;
|
||||
v.int := ord
|
||||
END setWChar;
|
||||
|
||||
|
||||
PROCEDURE addInt (VAR a: INTEGER; b: INTEGER): BOOLEAN;
|
||||
VAR
|
||||
error: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
IF (a > 0) & (b > 0) THEN
|
||||
error := a > UTILS.maxint - b
|
||||
ELSIF (a < 0) & (b < 0) THEN
|
||||
error := a < UTILS.minint - b
|
||||
ELSE
|
||||
error := FALSE
|
||||
END;
|
||||
|
||||
IF ~error THEN
|
||||
a := a + b
|
||||
ELSE
|
||||
a := 0
|
||||
END
|
||||
|
||||
RETURN ~error
|
||||
END addInt;
|
||||
|
||||
|
||||
PROCEDURE subInt (VAR a: INTEGER; b: INTEGER): BOOLEAN;
|
||||
VAR
|
||||
error: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
IF (a > 0) & (b < 0) THEN
|
||||
error := a > UTILS.maxint + b
|
||||
ELSIF (a < 0) & (b > 0) THEN
|
||||
error := a < UTILS.minint + b
|
||||
ELSIF (a = 0) & (b < 0) THEN
|
||||
error := b = UTILS.minint
|
||||
ELSE
|
||||
error := FALSE
|
||||
END;
|
||||
|
||||
IF ~error THEN
|
||||
a := a - b
|
||||
ELSE
|
||||
a := 0
|
||||
END
|
||||
|
||||
RETURN ~error
|
||||
END subInt;
|
||||
|
||||
|
||||
PROCEDURE lg2 (x: INTEGER): INTEGER;
|
||||
VAR
|
||||
n: INTEGER;
|
||||
|
||||
BEGIN
|
||||
ASSERT(x > 0);
|
||||
|
||||
n := UTILS.Log2(x);
|
||||
IF n = -1 THEN
|
||||
n := 255
|
||||
END
|
||||
|
||||
RETURN n
|
||||
END lg2;
|
||||
|
||||
|
||||
PROCEDURE mulInt* (VAR a: INTEGER; b: INTEGER): BOOLEAN;
|
||||
VAR
|
||||
error: BOOLEAN;
|
||||
min, max: INTEGER;
|
||||
|
||||
BEGIN
|
||||
min := UTILS.minint;
|
||||
max := UTILS.maxint;
|
||||
|
||||
IF ((a > 1) & (b > 1)) OR ((a < 0) & (b < 0)) THEN
|
||||
error := (a = min) OR (b = min) OR (ABS(a) > max DIV ABS(b))
|
||||
|
||||
ELSIF ((a > 1) & (b < 0)) OR ((a < 0) & (b > 1)) THEN
|
||||
error := (a = min) OR (b = min);
|
||||
IF ~error THEN
|
||||
IF lg2(ABS(a)) + lg2(ABS(b)) >= UTILS.bit_depth THEN
|
||||
error := ABS(a) > max DIV ABS(b)
|
||||
END
|
||||
END
|
||||
|
||||
ELSE
|
||||
error := FALSE
|
||||
END;
|
||||
|
||||
IF ~error THEN
|
||||
a := a * b
|
||||
ELSE
|
||||
a := 0
|
||||
END
|
||||
|
||||
RETURN ~error
|
||||
END mulInt;
|
||||
|
||||
|
||||
PROCEDURE _ASR (x, n: INTEGER): INTEGER;
|
||||
RETURN ASR(UTILS.Long(x), n)
|
||||
END _ASR;
|
||||
|
||||
|
||||
PROCEDURE _LSR (x, n: INTEGER): INTEGER;
|
||||
RETURN UTILS.Long(LSR(UTILS.Short(x), n))
|
||||
END _LSR;
|
||||
|
||||
|
||||
PROCEDURE _LSL (x, n: INTEGER): INTEGER;
|
||||
RETURN UTILS.Long(LSL(x, n))
|
||||
END _LSL;
|
||||
|
||||
|
||||
PROCEDURE _ROR1_32 (x: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
x := UTILS.Short(x);
|
||||
x := ORD(BITS(LSR(x, 1)) + BITS(LSL(x, 31)))
|
||||
RETURN UTILS.Long(x)
|
||||
END _ROR1_32;
|
||||
|
||||
|
||||
PROCEDURE _ROR1_16 (x: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
x := x MOD 65536;
|
||||
x := ORD(BITS(LSR(x, 1)) + BITS(LSL(x, 15)))
|
||||
RETURN UTILS.Long(x)
|
||||
END _ROR1_16;
|
||||
|
||||
|
||||
PROCEDURE _ROR (x, n: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
|
||||
CASE UTILS.bit_diff OF
|
||||
|0: x := ROR(x, n)
|
||||
|16, 48:
|
||||
n := n MOD 16;
|
||||
WHILE n > 0 DO
|
||||
x := _ROR1_16(x);
|
||||
DEC(n)
|
||||
END
|
||||
|32:
|
||||
n := n MOD 32;
|
||||
WHILE n > 0 DO
|
||||
x := _ROR1_32(x);
|
||||
DEC(n)
|
||||
END
|
||||
END
|
||||
|
||||
RETURN x
|
||||
END _ROR;
|
||||
|
||||
|
||||
PROCEDURE opInt* (VAR a: VALUE; b: VALUE; op: CHAR): BOOLEAN;
|
||||
VAR
|
||||
success: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
success := TRUE;
|
||||
|
||||
CASE op OF
|
||||
|"+": success := addInt(a.int, b.int)
|
||||
|"-": success := subInt(a.int, b.int)
|
||||
|"*": success := mulInt(a.int, b.int)
|
||||
|"/": success := FALSE
|
||||
|"D": a.int := a.int DIV b.int
|
||||
|"M": a.int := a.int MOD b.int
|
||||
|"L": a.int := _LSL(a.int, b.int)
|
||||
|"A": a.int := _ASR(a.int, b.int)
|
||||
|"O": a.int := _ROR(a.int, b.int)
|
||||
|"R": a.int := _LSR(a.int, b.int)
|
||||
|"m": a.int := MIN(a.int, b.int)
|
||||
|"x": a.int := MAX(a.int, b.int)
|
||||
END;
|
||||
a.typ := tINTEGER
|
||||
|
||||
RETURN success & check(a)
|
||||
END opInt;
|
||||
|
||||
|
||||
PROCEDURE charToStr* (c: VALUE; VAR s: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
s[0] := CHR(c.int);
|
||||
s[1] := 0X
|
||||
END charToStr;
|
||||
|
||||
|
||||
PROCEDURE opSet* (VAR a: VALUE; b: VALUE; op: CHAR);
|
||||
BEGIN
|
||||
CASE op OF
|
||||
|"+": a.set := a.set + b.set
|
||||
|"-": a.set := a.set - b.set
|
||||
|"*": a.set := a.set * b.set
|
||||
|"/": a.set := a.set / b.set
|
||||
END;
|
||||
a.typ := tSET
|
||||
END opSet;
|
||||
|
||||
|
||||
PROCEDURE opFloat* (VAR a: VALUE; b: VALUE; op: CHAR): BOOLEAN;
|
||||
BEGIN
|
||||
a.typ := tREAL
|
||||
RETURN opFloat2(a.float, b.float, op) & check(a)
|
||||
END opFloat;
|
||||
|
||||
|
||||
PROCEDURE ord* (VAR v: VALUE);
|
||||
BEGIN
|
||||
CASE v.typ OF
|
||||
|tCHAR, tWCHAR:
|
||||
|tBOOLEAN: v.int := ORD(v.bool)
|
||||
|tSET: v.int := UTILS.Long(ORD(v.set))
|
||||
END;
|
||||
v.typ := tINTEGER
|
||||
END ord;
|
||||
|
||||
|
||||
PROCEDURE odd* (VAR v: VALUE);
|
||||
BEGIN
|
||||
v.typ := tBOOLEAN;
|
||||
v.bool := ODD(v.int)
|
||||
END odd;
|
||||
|
||||
|
||||
PROCEDURE bits* (VAR v: VALUE);
|
||||
BEGIN
|
||||
v.typ := tSET;
|
||||
v.set := BITS(v.int)
|
||||
END bits;
|
||||
|
||||
|
||||
PROCEDURE abs* (VAR v: VALUE): BOOLEAN;
|
||||
VAR
|
||||
res: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
res := FALSE;
|
||||
|
||||
CASE v.typ OF
|
||||
|tREAL:
|
||||
v.float := ABS(v.float);
|
||||
res := TRUE
|
||||
|tINTEGER:
|
||||
IF v.int # UTILS.minint THEN
|
||||
v.int := ABS(v.int);
|
||||
res := TRUE
|
||||
END
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END abs;
|
||||
|
||||
|
||||
PROCEDURE floor* (VAR v: VALUE): BOOLEAN;
|
||||
VAR
|
||||
res: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
v.typ := tINTEGER;
|
||||
res := (FLT(UTILS.minint) <= v.float) & (v.float <= FLT(UTILS.maxint));
|
||||
IF res THEN
|
||||
v.int := FLOOR(v.float)
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END floor;
|
||||
|
||||
|
||||
PROCEDURE flt* (VAR v: VALUE);
|
||||
BEGIN
|
||||
v.typ := tREAL;
|
||||
v.float := FLT(v.int)
|
||||
END flt;
|
||||
|
||||
|
||||
PROCEDURE neg* (VAR v: VALUE): BOOLEAN;
|
||||
VAR
|
||||
z: VALUE;
|
||||
res: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
res := TRUE;
|
||||
|
||||
z.typ := tINTEGER;
|
||||
z.int := 0;
|
||||
|
||||
CASE v.typ OF
|
||||
|tREAL: v.float := -v.float
|
||||
|tSET: v.set := -v.set
|
||||
|tINTEGER: res := opInt(z, v, "-"); v := z
|
||||
|tBOOLEAN: v.bool := ~v.bool
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END neg;
|
||||
|
||||
|
||||
PROCEDURE setbool* (VAR v: VALUE; b: BOOLEAN);
|
||||
BEGIN
|
||||
v.bool := b;
|
||||
v.typ := tBOOLEAN
|
||||
END setbool;
|
||||
|
||||
|
||||
PROCEDURE opBoolean* (VAR a: VALUE; b: VALUE; op: CHAR);
|
||||
BEGIN
|
||||
CASE op OF
|
||||
|"&": a.bool := a.bool & b.bool
|
||||
|"|": a.bool := a.bool OR b.bool
|
||||
END;
|
||||
a.typ := tBOOLEAN
|
||||
END opBoolean;
|
||||
|
||||
|
||||
PROCEDURE less (v, v2: VALUE; VAR error: INTEGER): BOOLEAN;
|
||||
VAR
|
||||
res: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
res := FALSE;
|
||||
|
||||
IF (v.typ = v2.typ) OR (v.typ IN {tCHAR, tWCHAR}) & (v2.typ IN {tCHAR, tWCHAR}) THEN
|
||||
CASE v.typ OF
|
||||
|tINTEGER,
|
||||
tWCHAR,
|
||||
tCHAR: res := v.int < v2.int
|
||||
|tREAL: res := v.float < v2.float
|
||||
|tBOOLEAN,
|
||||
tSET: error := 1
|
||||
END
|
||||
ELSE
|
||||
error := 1
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END less;
|
||||
|
||||
|
||||
PROCEDURE equal (v, v2: VALUE; VAR error: INTEGER): BOOLEAN;
|
||||
VAR
|
||||
res: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
res := FALSE;
|
||||
|
||||
IF (v.typ = v2.typ) OR (v.typ IN {tCHAR, tWCHAR}) & (v2.typ IN {tCHAR, tWCHAR}) THEN
|
||||
CASE v.typ OF
|
||||
|tINTEGER,
|
||||
tWCHAR,
|
||||
tCHAR: res := v.int = v2.int
|
||||
|tREAL: res := v.float = v2.float
|
||||
|tBOOLEAN: res := v.bool = v2.bool
|
||||
|tSET: res := v.set = v2.set
|
||||
END
|
||||
ELSE
|
||||
error := 1
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END equal;
|
||||
|
||||
|
||||
PROCEDURE relation* (VAR v: VALUE; v2: VALUE; op: INTEGER; VAR error: INTEGER);
|
||||
VAR
|
||||
res: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
error := 0;
|
||||
|
||||
res := FALSE;
|
||||
|
||||
CASE op OF
|
||||
|
||||
|opEQ:
|
||||
res := equal(v, v2, error)
|
||||
|
||||
|opNE:
|
||||
res := ~equal(v, v2, error)
|
||||
|
||||
|opLT:
|
||||
res := less(v, v2, error)
|
||||
|
||||
|opLE:
|
||||
res := less(v, v2, error);
|
||||
IF error = 0 THEN
|
||||
res := equal(v, v2, error) OR res
|
||||
END
|
||||
|
||||
|opGE:
|
||||
res := ~less(v, v2, error)
|
||||
|
||||
|opGT:
|
||||
res := less(v, v2, error);
|
||||
IF error = 0 THEN
|
||||
res := equal(v, v2, error) OR res
|
||||
END;
|
||||
res := ~res
|
||||
|
||||
|opIN:
|
||||
IF (v.typ = tINTEGER) & (v2.typ = tSET) THEN
|
||||
IF range(v, 0, UTILS.target.maxSet) THEN
|
||||
res := v.int IN v2.set
|
||||
ELSE
|
||||
error := 2
|
||||
END
|
||||
ELSE
|
||||
error := 1
|
||||
END
|
||||
|
||||
END;
|
||||
|
||||
IF error = 0 THEN
|
||||
v.bool := res;
|
||||
v.typ := tBOOLEAN
|
||||
END
|
||||
|
||||
END relation;
|
||||
|
||||
|
||||
PROCEDURE emptySet* (VAR v: VALUE);
|
||||
BEGIN
|
||||
v.typ := tSET;
|
||||
v.set := {}
|
||||
END emptySet;
|
||||
|
||||
|
||||
PROCEDURE constrSet* (VAR v: VALUE; a, b: VALUE);
|
||||
BEGIN
|
||||
v.typ := tSET;
|
||||
v.set := {a.int .. b.int}
|
||||
END constrSet;
|
||||
|
||||
|
||||
PROCEDURE getInt* (v: VALUE): INTEGER;
|
||||
BEGIN
|
||||
ASSERT(check(v))
|
||||
|
||||
RETURN v.int
|
||||
END getInt;
|
||||
|
||||
|
||||
PROCEDURE setInt* (VAR v: VALUE; i: INTEGER): BOOLEAN;
|
||||
BEGIN
|
||||
v.int := i;
|
||||
v.typ := tINTEGER
|
||||
|
||||
RETURN check(v)
|
||||
END setInt;
|
||||
|
||||
|
||||
PROCEDURE concat* (VAR s: ARRAY OF CHAR; s1: ARRAY OF CHAR): BOOLEAN;
|
||||
VAR
|
||||
res: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
res := LENGTH(s) + LENGTH(s1) < LEN(s);
|
||||
IF res THEN
|
||||
STRINGS.append(s, s1)
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END concat;
|
||||
|
||||
|
||||
PROCEDURE init;
|
||||
VAR
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
FOR i := 0 TO LEN(digit) - 1 DO
|
||||
digit[i] := -1
|
||||
END;
|
||||
|
||||
FOR i := ORD("0") TO ORD("9") DO
|
||||
digit[i] := i - ORD("0")
|
||||
END;
|
||||
|
||||
FOR i := ORD("A") TO ORD("F") DO
|
||||
digit[i] := i - ORD("A") + 10
|
||||
END
|
||||
END init;
|
||||
|
||||
|
||||
BEGIN
|
||||
init
|
||||
END ARITH.
|
||||
@@ -1,197 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2019, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE AVLTREES;
|
||||
|
||||
IMPORT C := COLLECTIONS;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
DATA* = POINTER TO RECORD (C.ITEM) END;
|
||||
|
||||
NODE* = POINTER TO RECORD (C.ITEM)
|
||||
|
||||
data*: DATA;
|
||||
|
||||
height: INTEGER;
|
||||
|
||||
left*, right*: NODE
|
||||
|
||||
END;
|
||||
|
||||
CMP* = PROCEDURE (a, b: DATA): INTEGER;
|
||||
|
||||
DESTRUCTOR* = PROCEDURE (VAR data: DATA);
|
||||
|
||||
|
||||
VAR
|
||||
|
||||
nodes: C.COLLECTION;
|
||||
|
||||
|
||||
PROCEDURE NewNode (data: DATA): NODE;
|
||||
VAR
|
||||
node: NODE;
|
||||
citem: C.ITEM;
|
||||
|
||||
BEGIN
|
||||
citem := C.pop(nodes);
|
||||
IF citem = NIL THEN
|
||||
NEW(node)
|
||||
ELSE
|
||||
node := citem(NODE)
|
||||
END;
|
||||
|
||||
node.data := data;
|
||||
node.left := NIL;
|
||||
node.right := NIL;
|
||||
node.height := 1
|
||||
|
||||
RETURN node
|
||||
END NewNode;
|
||||
|
||||
|
||||
PROCEDURE height (p: NODE): INTEGER;
|
||||
VAR
|
||||
res: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF p = NIL THEN
|
||||
res := 0
|
||||
ELSE
|
||||
res := p.height
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END height;
|
||||
|
||||
|
||||
PROCEDURE bfactor (p: NODE): INTEGER;
|
||||
RETURN height(p.right) - height(p.left)
|
||||
END bfactor;
|
||||
|
||||
|
||||
PROCEDURE fixheight (p: NODE);
|
||||
BEGIN
|
||||
p.height := MAX(height(p.left), height(p.right)) + 1
|
||||
END fixheight;
|
||||
|
||||
|
||||
PROCEDURE rotateright (p: NODE): NODE;
|
||||
VAR
|
||||
q: NODE;
|
||||
|
||||
BEGIN
|
||||
q := p.left;
|
||||
p.left := q.right;
|
||||
q.right := p;
|
||||
fixheight(p);
|
||||
fixheight(q)
|
||||
|
||||
RETURN q
|
||||
END rotateright;
|
||||
|
||||
|
||||
PROCEDURE rotateleft (q: NODE): NODE;
|
||||
VAR
|
||||
p: NODE;
|
||||
|
||||
BEGIN
|
||||
p := q.right;
|
||||
q.right := p.left;
|
||||
p.left := q;
|
||||
fixheight(q);
|
||||
fixheight(p)
|
||||
|
||||
RETURN p
|
||||
END rotateleft;
|
||||
|
||||
|
||||
PROCEDURE balance (p: NODE): NODE;
|
||||
VAR
|
||||
res: NODE;
|
||||
|
||||
BEGIN
|
||||
fixheight(p);
|
||||
|
||||
IF bfactor(p) = 2 THEN
|
||||
IF bfactor(p.right) < 0 THEN
|
||||
p.right := rotateright(p.right)
|
||||
END;
|
||||
res := rotateleft(p)
|
||||
|
||||
ELSIF bfactor(p) = -2 THEN
|
||||
IF bfactor(p.left) > 0 THEN
|
||||
p.left := rotateleft(p.left)
|
||||
END;
|
||||
res := rotateright(p)
|
||||
|
||||
ELSE
|
||||
res := p
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END balance;
|
||||
|
||||
|
||||
PROCEDURE insert* (p: NODE; data: DATA; cmp: CMP; VAR newnode: BOOLEAN; VAR node: NODE): NODE;
|
||||
VAR
|
||||
res: NODE;
|
||||
rescmp: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF p = NIL THEN
|
||||
res := NewNode(data);
|
||||
node := res;
|
||||
newnode := TRUE
|
||||
ELSE
|
||||
|
||||
rescmp := cmp(data, p.data);
|
||||
IF rescmp < 0 THEN
|
||||
p.left := insert(p.left, data, cmp, newnode, node);
|
||||
res := balance(p)
|
||||
ELSIF rescmp > 0 THEN
|
||||
p.right := insert(p.right, data, cmp, newnode, node);
|
||||
res := balance(p)
|
||||
ELSE
|
||||
res := p;
|
||||
node := res;
|
||||
newnode := FALSE
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END insert;
|
||||
|
||||
|
||||
PROCEDURE destroy* (VAR node: NODE; destructor: DESTRUCTOR);
|
||||
VAR
|
||||
left, right: NODE;
|
||||
|
||||
BEGIN
|
||||
IF node # NIL THEN
|
||||
left := node.left;
|
||||
right := node.right;
|
||||
|
||||
IF destructor # NIL THEN
|
||||
destructor(node.data)
|
||||
END;
|
||||
|
||||
C.push(nodes, node);
|
||||
node := NIL;
|
||||
|
||||
destroy(left, destructor);
|
||||
destroy(right, destructor)
|
||||
END
|
||||
END destroy;
|
||||
|
||||
|
||||
BEGIN
|
||||
nodes := C.create()
|
||||
END AVLTREES.
|
||||
@@ -1,384 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2020, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE BIN;
|
||||
|
||||
IMPORT LISTS, CHL := CHUNKLISTS, ARITH, UTILS;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
RCODE* = 0; PICCODE* = RCODE + 1;
|
||||
RDATA* = 2; PICDATA* = RDATA + 1;
|
||||
RBSS* = 4; PICBSS* = RBSS + 1;
|
||||
RIMP* = 6; PICIMP* = RIMP + 1;
|
||||
|
||||
IMPTAB* = 8;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
RELOC* = POINTER TO RECORD (LISTS.ITEM)
|
||||
|
||||
opcode*: INTEGER;
|
||||
offset*: INTEGER
|
||||
|
||||
END;
|
||||
|
||||
IMPRT* = POINTER TO RECORD (LISTS.ITEM)
|
||||
|
||||
nameoffs*: INTEGER;
|
||||
label*: INTEGER;
|
||||
|
||||
OriginalFirstThunk*,
|
||||
FirstThunk*: INTEGER
|
||||
|
||||
END;
|
||||
|
||||
EXPRT* = POINTER TO RECORD (LISTS.ITEM)
|
||||
|
||||
nameoffs*: INTEGER;
|
||||
label*: INTEGER
|
||||
|
||||
END;
|
||||
|
||||
PROGRAM* = POINTER TO RECORD
|
||||
|
||||
code*: CHL.BYTELIST;
|
||||
data*: CHL.BYTELIST;
|
||||
labels: CHL.INTLIST;
|
||||
bss*: INTEGER;
|
||||
stack*: INTEGER;
|
||||
vmajor*,
|
||||
vminor*: WCHAR;
|
||||
modname*: INTEGER;
|
||||
_import*: CHL.BYTELIST;
|
||||
export*: CHL.BYTELIST;
|
||||
rel_list*: LISTS.LIST;
|
||||
imp_list*: LISTS.LIST;
|
||||
exp_list*: LISTS.LIST
|
||||
|
||||
END;
|
||||
|
||||
|
||||
PROCEDURE create* (NumberOfLabels: INTEGER): PROGRAM;
|
||||
VAR
|
||||
program: PROGRAM;
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
NEW(program);
|
||||
|
||||
program.bss := 0;
|
||||
|
||||
program.labels := CHL.CreateIntList();
|
||||
FOR i := 0 TO NumberOfLabels - 1 DO
|
||||
CHL.PushInt(program.labels, 0)
|
||||
END;
|
||||
|
||||
program.rel_list := LISTS.create(NIL);
|
||||
program.imp_list := LISTS.create(NIL);
|
||||
program.exp_list := LISTS.create(NIL);
|
||||
|
||||
program.data := CHL.CreateByteList();
|
||||
program.code := CHL.CreateByteList();
|
||||
program._import := CHL.CreateByteList();
|
||||
program.export := CHL.CreateByteList()
|
||||
|
||||
RETURN program
|
||||
END create;
|
||||
|
||||
|
||||
PROCEDURE SetParams* (program: PROGRAM; bss, stack: INTEGER; vmajor, vminor: WCHAR);
|
||||
BEGIN
|
||||
program.bss := bss;
|
||||
program.stack := stack;
|
||||
program.vmajor := vmajor;
|
||||
program.vminor := vminor
|
||||
END SetParams;
|
||||
|
||||
|
||||
PROCEDURE PutReloc* (program: PROGRAM; opcode: INTEGER);
|
||||
VAR
|
||||
cmd: RELOC;
|
||||
|
||||
BEGIN
|
||||
NEW(cmd);
|
||||
cmd.opcode := opcode;
|
||||
cmd.offset := CHL.Length(program.code);
|
||||
LISTS.push(program.rel_list, cmd)
|
||||
END PutReloc;
|
||||
|
||||
|
||||
PROCEDURE PutData* (program: PROGRAM; b: BYTE);
|
||||
BEGIN
|
||||
CHL.PushByte(program.data, b)
|
||||
END PutData;
|
||||
|
||||
|
||||
PROCEDURE get32le* (_array: CHL.BYTELIST; idx: INTEGER): INTEGER;
|
||||
VAR
|
||||
i: INTEGER;
|
||||
x: INTEGER;
|
||||
|
||||
BEGIN
|
||||
x := 0;
|
||||
|
||||
FOR i := 3 TO 0 BY -1 DO
|
||||
x := LSL(x, 8) + CHL.GetByte(_array, idx + i)
|
||||
END;
|
||||
|
||||
IF UTILS.bit_depth = 64 THEN
|
||||
x := LSL(x, 16);
|
||||
x := LSL(x, 16);
|
||||
x := ASR(x, 16);
|
||||
x := ASR(x, 16)
|
||||
END
|
||||
|
||||
RETURN x
|
||||
END get32le;
|
||||
|
||||
|
||||
PROCEDURE put32le* (_array: CHL.BYTELIST; idx: INTEGER; x: INTEGER);
|
||||
VAR
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
FOR i := 0 TO 3 DO
|
||||
CHL.SetByte(_array, idx + i, UTILS.Byte(x, i))
|
||||
END
|
||||
END put32le;
|
||||
|
||||
|
||||
PROCEDURE PutData32LE* (program: PROGRAM; x: INTEGER);
|
||||
VAR
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
FOR i := 0 TO 3 DO
|
||||
CHL.PushByte(program.data, UTILS.Byte(x, i))
|
||||
END
|
||||
END PutData32LE;
|
||||
|
||||
|
||||
PROCEDURE PutData64LE* (program: PROGRAM; x: INTEGER);
|
||||
VAR
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
FOR i := 0 TO 7 DO
|
||||
CHL.PushByte(program.data, UTILS.Byte(x, i))
|
||||
END
|
||||
END PutData64LE;
|
||||
|
||||
|
||||
PROCEDURE PutDataStr* (program: PROGRAM; s: ARRAY OF CHAR);
|
||||
VAR
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
i := 0;
|
||||
WHILE s[i] # 0X DO
|
||||
PutData(program, ORD(s[i]));
|
||||
INC(i)
|
||||
END
|
||||
END PutDataStr;
|
||||
|
||||
|
||||
PROCEDURE PutCode* (program: PROGRAM; b: BYTE);
|
||||
BEGIN
|
||||
CHL.PushByte(program.code, b)
|
||||
END PutCode;
|
||||
|
||||
|
||||
PROCEDURE PutCode32LE* (program: PROGRAM; x: INTEGER);
|
||||
VAR
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
FOR i := 0 TO 3 DO
|
||||
CHL.PushByte(program.code, UTILS.Byte(x, i))
|
||||
END
|
||||
END PutCode32LE;
|
||||
|
||||
|
||||
PROCEDURE PutCode16LE* (program: PROGRAM; x: INTEGER);
|
||||
BEGIN
|
||||
CHL.PushByte(program.code, UTILS.Byte(x, 0));
|
||||
CHL.PushByte(program.code, UTILS.Byte(x, 1))
|
||||
END PutCode16LE;
|
||||
|
||||
|
||||
PROCEDURE SetLabel* (program: PROGRAM; label, offset: INTEGER);
|
||||
BEGIN
|
||||
CHL.SetInt(program.labels, label, offset)
|
||||
END SetLabel;
|
||||
|
||||
|
||||
PROCEDURE Import* (program: PROGRAM; name: ARRAY OF CHAR; label: INTEGER);
|
||||
VAR
|
||||
imp: IMPRT;
|
||||
|
||||
BEGIN
|
||||
CHL.PushByte(program._import, 0);
|
||||
CHL.PushByte(program._import, 0);
|
||||
|
||||
IF ODD(CHL.Length(program._import)) THEN
|
||||
CHL.PushByte(program._import, 0)
|
||||
END;
|
||||
|
||||
NEW(imp);
|
||||
imp.nameoffs := CHL.PushStr(program._import, name);
|
||||
imp.label := label;
|
||||
LISTS.push(program.imp_list, imp)
|
||||
END Import;
|
||||
|
||||
|
||||
PROCEDURE less (bytes: CHL.BYTELIST; a, b: EXPRT): BOOLEAN;
|
||||
VAR
|
||||
i, j: INTEGER;
|
||||
|
||||
BEGIN
|
||||
i := a.nameoffs;
|
||||
j := b.nameoffs;
|
||||
|
||||
WHILE (CHL.GetByte(bytes, i) # 0) & (CHL.GetByte(bytes, j) # 0) &
|
||||
(CHL.GetByte(bytes, i) = CHL.GetByte(bytes, j)) DO
|
||||
INC(i);
|
||||
INC(j)
|
||||
END
|
||||
|
||||
RETURN CHL.GetByte(bytes, i) < CHL.GetByte(bytes, j)
|
||||
END less;
|
||||
|
||||
|
||||
PROCEDURE Export* (program: PROGRAM; name: ARRAY OF CHAR; label: INTEGER);
|
||||
VAR
|
||||
exp, cur: EXPRT;
|
||||
|
||||
BEGIN
|
||||
NEW(exp);
|
||||
exp.label := CHL.GetInt(program.labels, label);
|
||||
exp.nameoffs := CHL.PushStr(program.export, name);
|
||||
|
||||
cur := program.exp_list.first(EXPRT);
|
||||
WHILE (cur # NIL) & less(program.export, cur, exp) DO
|
||||
cur := cur.next(EXPRT)
|
||||
END;
|
||||
|
||||
IF cur # NIL THEN
|
||||
IF cur.prev # NIL THEN
|
||||
LISTS.insert(program.exp_list, cur.prev, exp)
|
||||
ELSE
|
||||
LISTS.insertL(program.exp_list, cur, exp)
|
||||
END
|
||||
ELSE
|
||||
LISTS.push(program.exp_list, exp)
|
||||
END
|
||||
|
||||
END Export;
|
||||
|
||||
|
||||
PROCEDURE GetIProc* (program: PROGRAM; n: INTEGER): IMPRT;
|
||||
VAR
|
||||
_import, res: IMPRT;
|
||||
|
||||
BEGIN
|
||||
_import := program.imp_list.first(IMPRT);
|
||||
|
||||
res := NIL;
|
||||
WHILE (_import # NIL) & (n >= 0) DO
|
||||
IF _import.label # 0 THEN
|
||||
res := _import;
|
||||
DEC(n)
|
||||
END;
|
||||
_import := _import.next(IMPRT)
|
||||
END;
|
||||
|
||||
ASSERT(n = -1)
|
||||
RETURN res
|
||||
END GetIProc;
|
||||
|
||||
|
||||
PROCEDURE GetLabel* (program: PROGRAM; label: INTEGER): INTEGER;
|
||||
RETURN CHL.GetInt(program.labels, label)
|
||||
END GetLabel;
|
||||
|
||||
|
||||
PROCEDURE NewLabel* (program: PROGRAM);
|
||||
BEGIN
|
||||
CHL.PushInt(program.labels, 0)
|
||||
END NewLabel;
|
||||
|
||||
|
||||
PROCEDURE fixup* (program: PROGRAM);
|
||||
VAR
|
||||
rel: RELOC;
|
||||
imp: IMPRT;
|
||||
nproc: INTEGER;
|
||||
L: INTEGER;
|
||||
|
||||
BEGIN
|
||||
|
||||
nproc := 0;
|
||||
imp := program.imp_list.first(IMPRT);
|
||||
WHILE imp # NIL DO
|
||||
IF imp.label # 0 THEN
|
||||
CHL.SetInt(program.labels, imp.label, nproc);
|
||||
INC(nproc)
|
||||
END;
|
||||
imp := imp.next(IMPRT)
|
||||
END;
|
||||
|
||||
rel := program.rel_list.first(RELOC);
|
||||
WHILE rel # NIL DO
|
||||
|
||||
IF rel.opcode IN {RIMP, PICIMP} THEN
|
||||
L := get32le(program.code, rel.offset);
|
||||
put32le(program.code, rel.offset, GetLabel(program, L))
|
||||
END;
|
||||
|
||||
rel := rel.next(RELOC)
|
||||
END
|
||||
|
||||
END fixup;
|
||||
|
||||
|
||||
PROCEDURE InitArray* (VAR _array: ARRAY OF BYTE; VAR idx: INTEGER; hex: ARRAY OF CHAR);
|
||||
VAR
|
||||
i, k: INTEGER;
|
||||
|
||||
|
||||
PROCEDURE hexdgt (dgt: CHAR): INTEGER;
|
||||
VAR
|
||||
res: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF dgt < "A" THEN
|
||||
res := ORD(dgt) - ORD("0")
|
||||
ELSE
|
||||
res := ORD(dgt) - ORD("A") + 10
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END hexdgt;
|
||||
|
||||
|
||||
BEGIN
|
||||
k := LENGTH(hex);
|
||||
ASSERT(~ODD(k));
|
||||
k := k DIV 2;
|
||||
|
||||
FOR i := 0 TO k - 1 DO
|
||||
_array[i + idx] := hexdgt(hex[2 * i]) * 16 + hexdgt(hex[2 * i + 1])
|
||||
END;
|
||||
|
||||
INC(idx, k)
|
||||
END InitArray;
|
||||
|
||||
|
||||
END BIN.
|
||||
@@ -1,255 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2021, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE CHUNKLISTS;
|
||||
|
||||
IMPORT LISTS, WR := WRITER;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
LENOFBYTECHUNK = 65536;
|
||||
LENOFINTCHUNK = 16384;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
ANYLIST = POINTER TO RECORD (LISTS.LIST)
|
||||
|
||||
length: INTEGER
|
||||
|
||||
END;
|
||||
|
||||
BYTELIST* = POINTER TO RECORD (ANYLIST) END;
|
||||
|
||||
BYTECHUNK = POINTER TO RECORD (LISTS.ITEM)
|
||||
|
||||
data: ARRAY LENOFBYTECHUNK OF BYTE;
|
||||
count: INTEGER
|
||||
|
||||
END;
|
||||
|
||||
|
||||
INTLIST* = POINTER TO RECORD (ANYLIST) END;
|
||||
|
||||
INTCHUNK = POINTER TO RECORD (LISTS.ITEM)
|
||||
|
||||
data: ARRAY LENOFINTCHUNK OF INTEGER;
|
||||
count: INTEGER
|
||||
|
||||
END;
|
||||
|
||||
|
||||
PROCEDURE SetByte* (list: BYTELIST; idx: INTEGER; byte: BYTE);
|
||||
VAR
|
||||
chunk: BYTECHUNK;
|
||||
item: LISTS.ITEM;
|
||||
|
||||
BEGIN
|
||||
ASSERT(idx >= 0);
|
||||
ASSERT(list # NIL);
|
||||
|
||||
item := LISTS.getidx(list, idx DIV LENOFBYTECHUNK);
|
||||
ASSERT(item # NIL);
|
||||
chunk := item(BYTECHUNK);
|
||||
idx := idx MOD LENOFBYTECHUNK;
|
||||
ASSERT(idx < chunk.count);
|
||||
chunk.data[idx] := byte
|
||||
END SetByte;
|
||||
|
||||
|
||||
PROCEDURE GetByte* (list: BYTELIST; idx: INTEGER): BYTE;
|
||||
VAR
|
||||
chunk: BYTECHUNK;
|
||||
item: LISTS.ITEM;
|
||||
|
||||
BEGIN
|
||||
ASSERT(idx >= 0);
|
||||
ASSERT(list # NIL);
|
||||
|
||||
item := LISTS.getidx(list, idx DIV LENOFBYTECHUNK);
|
||||
ASSERT(item # NIL);
|
||||
chunk := item(BYTECHUNK);
|
||||
idx := idx MOD LENOFBYTECHUNK;
|
||||
ASSERT(idx < chunk.count)
|
||||
RETURN chunk.data[idx]
|
||||
END GetByte;
|
||||
|
||||
|
||||
PROCEDURE PushByte* (list: BYTELIST; byte: BYTE);
|
||||
VAR
|
||||
chunk: BYTECHUNK;
|
||||
|
||||
BEGIN
|
||||
ASSERT(list # NIL);
|
||||
|
||||
chunk := list.last(BYTECHUNK);
|
||||
|
||||
IF chunk.count = LENOFBYTECHUNK THEN
|
||||
NEW(chunk);
|
||||
chunk.count := 0;
|
||||
LISTS.push(list, chunk)
|
||||
END;
|
||||
|
||||
chunk.data[chunk.count] := byte;
|
||||
INC(chunk.count);
|
||||
|
||||
INC(list.length)
|
||||
END PushByte;
|
||||
|
||||
|
||||
PROCEDURE PushStr* (list: BYTELIST; str: ARRAY OF CHAR): INTEGER;
|
||||
VAR
|
||||
i, res: INTEGER;
|
||||
|
||||
BEGIN
|
||||
res := list.length;
|
||||
i := 0;
|
||||
REPEAT
|
||||
PushByte(list, ORD(str[i]));
|
||||
INC(i)
|
||||
UNTIL str[i - 1] = 0X
|
||||
|
||||
RETURN res
|
||||
END PushStr;
|
||||
|
||||
|
||||
PROCEDURE GetStr* (list: BYTELIST; pos: INTEGER; VAR str: ARRAY OF CHAR): BOOLEAN;
|
||||
VAR
|
||||
i: INTEGER;
|
||||
res: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
res := FALSE;
|
||||
i := 0;
|
||||
WHILE (pos < list.length) & (i < LEN(str)) & ~res DO
|
||||
str[i] := CHR(GetByte(list, pos));
|
||||
res := str[i] = 0X;
|
||||
INC(pos);
|
||||
INC(i)
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END GetStr;
|
||||
|
||||
|
||||
PROCEDURE WriteToFile* (list: BYTELIST);
|
||||
VAR
|
||||
chunk: BYTECHUNK;
|
||||
|
||||
BEGIN
|
||||
chunk := list.first(BYTECHUNK);
|
||||
WHILE chunk # NIL DO
|
||||
WR.Write(chunk.data, chunk.count);
|
||||
chunk := chunk.next(BYTECHUNK)
|
||||
END
|
||||
END WriteToFile;
|
||||
|
||||
|
||||
PROCEDURE CreateByteList* (): BYTELIST;
|
||||
VAR
|
||||
bytelist: BYTELIST;
|
||||
list: LISTS.LIST;
|
||||
chunk: BYTECHUNK;
|
||||
|
||||
BEGIN
|
||||
NEW(bytelist);
|
||||
list := LISTS.create(bytelist);
|
||||
bytelist.length := 0;
|
||||
|
||||
NEW(chunk);
|
||||
chunk.count := 0;
|
||||
LISTS.push(list, chunk)
|
||||
|
||||
RETURN list(BYTELIST)
|
||||
END CreateByteList;
|
||||
|
||||
|
||||
PROCEDURE SetInt* (list: INTLIST; idx: INTEGER; int: INTEGER);
|
||||
VAR
|
||||
chunk: INTCHUNK;
|
||||
item: LISTS.ITEM;
|
||||
|
||||
BEGIN
|
||||
ASSERT(idx >= 0);
|
||||
ASSERT(list # NIL);
|
||||
|
||||
item := LISTS.getidx(list, idx DIV LENOFINTCHUNK);
|
||||
ASSERT(item # NIL);
|
||||
chunk := item(INTCHUNK);
|
||||
idx := idx MOD LENOFINTCHUNK;
|
||||
ASSERT(idx < chunk.count);
|
||||
chunk.data[idx] := int
|
||||
END SetInt;
|
||||
|
||||
|
||||
PROCEDURE GetInt* (list: INTLIST; idx: INTEGER): INTEGER;
|
||||
|
||||
VAR
|
||||
chunk: INTCHUNK;
|
||||
item: LISTS.ITEM;
|
||||
|
||||
BEGIN
|
||||
ASSERT(idx >= 0);
|
||||
ASSERT(list # NIL);
|
||||
|
||||
item := LISTS.getidx(list, idx DIV LENOFINTCHUNK);
|
||||
ASSERT(item # NIL);
|
||||
chunk := item(INTCHUNK);
|
||||
idx := idx MOD LENOFINTCHUNK;
|
||||
ASSERT(idx < chunk.count)
|
||||
RETURN chunk.data[idx]
|
||||
END GetInt;
|
||||
|
||||
|
||||
PROCEDURE PushInt* (list: INTLIST; int: INTEGER);
|
||||
VAR
|
||||
chunk: INTCHUNK;
|
||||
|
||||
BEGIN
|
||||
ASSERT(list # NIL);
|
||||
|
||||
chunk := list.last(INTCHUNK);
|
||||
|
||||
IF chunk.count = LENOFINTCHUNK THEN
|
||||
NEW(chunk);
|
||||
chunk.count := 0;
|
||||
LISTS.push(list, chunk)
|
||||
END;
|
||||
|
||||
chunk.data[chunk.count] := int;
|
||||
INC(chunk.count);
|
||||
|
||||
INC(list.length)
|
||||
END PushInt;
|
||||
|
||||
|
||||
PROCEDURE CreateIntList* (): INTLIST;
|
||||
VAR
|
||||
intlist: INTLIST;
|
||||
list: LISTS.LIST;
|
||||
chunk: INTCHUNK;
|
||||
|
||||
BEGIN
|
||||
NEW(intlist);
|
||||
list := LISTS.create(intlist);
|
||||
intlist.length := 0;
|
||||
|
||||
NEW(chunk);
|
||||
chunk.count := 0;
|
||||
LISTS.push(list, chunk)
|
||||
|
||||
RETURN list(INTLIST)
|
||||
END CreateIntList;
|
||||
|
||||
|
||||
PROCEDURE Length* (list: ANYLIST): INTEGER;
|
||||
RETURN list.length
|
||||
END Length;
|
||||
|
||||
|
||||
END CHUNKLISTS.
|
||||
@@ -1,59 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2019, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE COLLECTIONS;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
ITEM* = POINTER TO RECORD
|
||||
|
||||
link: ITEM
|
||||
|
||||
END;
|
||||
|
||||
COLLECTION* = POINTER TO RECORD
|
||||
|
||||
last: ITEM
|
||||
|
||||
END;
|
||||
|
||||
|
||||
PROCEDURE push* (collection: COLLECTION; item: ITEM);
|
||||
BEGIN
|
||||
item.link := collection.last;
|
||||
collection.last := item
|
||||
END push;
|
||||
|
||||
|
||||
PROCEDURE pop* (collection: COLLECTION): ITEM;
|
||||
VAR
|
||||
item: ITEM;
|
||||
|
||||
BEGIN
|
||||
item := collection.last;
|
||||
IF item # NIL THEN
|
||||
collection.last := item.link
|
||||
END
|
||||
|
||||
RETURN item
|
||||
END pop;
|
||||
|
||||
|
||||
PROCEDURE create* (): COLLECTION;
|
||||
VAR
|
||||
collection: COLLECTION;
|
||||
|
||||
BEGIN
|
||||
NEW(collection);
|
||||
collection.last := NIL
|
||||
|
||||
RETURN collection
|
||||
END create;
|
||||
|
||||
|
||||
END COLLECTIONS.
|
||||
@@ -1,78 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2021, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE CONSOLE;
|
||||
|
||||
IMPORT UTILS, STRINGS;
|
||||
|
||||
|
||||
PROCEDURE String* (s: ARRAY OF CHAR);
|
||||
VAR
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
i := 0;
|
||||
WHILE (i < LEN(s)) & (s[i] # 0X) DO
|
||||
UTILS.OutChar(s[i]);
|
||||
INC(i)
|
||||
END
|
||||
END String;
|
||||
|
||||
|
||||
PROCEDURE Int* (x: INTEGER);
|
||||
VAR
|
||||
s: ARRAY 24 OF CHAR;
|
||||
|
||||
BEGIN
|
||||
STRINGS.IntToStr(x, s);
|
||||
String(s)
|
||||
END Int;
|
||||
|
||||
|
||||
PROCEDURE Int2* (x: INTEGER);
|
||||
BEGIN
|
||||
IF x < 10 THEN
|
||||
String("0")
|
||||
END;
|
||||
Int(x)
|
||||
END Int2;
|
||||
|
||||
|
||||
PROCEDURE Ln*;
|
||||
BEGIN
|
||||
String(UTILS.eol)
|
||||
END Ln;
|
||||
|
||||
|
||||
PROCEDURE StringLn* (s: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
String(s);
|
||||
Ln
|
||||
END StringLn;
|
||||
|
||||
|
||||
PROCEDURE IntLn* (x: INTEGER);
|
||||
BEGIN
|
||||
Int(x);
|
||||
Ln
|
||||
END IntLn;
|
||||
|
||||
|
||||
PROCEDURE Int2Ln* (x: INTEGER);
|
||||
BEGIN
|
||||
Int2(x);
|
||||
Ln
|
||||
END Int2Ln;
|
||||
|
||||
|
||||
PROCEDURE Dashes*;
|
||||
BEGIN
|
||||
StringLn("------------------------------------------------")
|
||||
END Dashes;
|
||||
|
||||
|
||||
END CONSOLE.
|
||||
@@ -1,352 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2023, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE Compiler;
|
||||
|
||||
IMPORT ST := STATEMENTS, PARS, UTILS, PATHS, PROG, C := CONSOLE,
|
||||
ERRORS, STRINGS, WRITER, MSP430, THUMB, TARGETS, SCAN, TEXTDRV;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
DEF_WINDOWS = "WINDOWS";
|
||||
DEF_LINUX = "LINUX";
|
||||
DEF_KOLIBRIOS = "KOLIBRIOS";
|
||||
DEF_CPU_X86 = "CPU_X86";
|
||||
DEF_CPU_X8664 = "CPU_X8664";
|
||||
|
||||
|
||||
PROCEDURE keys (VAR options: PROG.OPTIONS; VAR out: PARS.PATH);
|
||||
VAR
|
||||
param: PARS.PATH;
|
||||
i, j: INTEGER;
|
||||
_end: BOOLEAN;
|
||||
value: INTEGER;
|
||||
minor,
|
||||
major: INTEGER;
|
||||
checking: SET;
|
||||
|
||||
|
||||
PROCEDURE getVal (VAR i: INTEGER; VAR value: INTEGER);
|
||||
VAR
|
||||
param: PARS.PATH;
|
||||
val: INTEGER;
|
||||
BEGIN
|
||||
INC(i);
|
||||
UTILS.GetArg(i, param);
|
||||
IF STRINGS.StrToInt(param, val) THEN
|
||||
value := val
|
||||
END;
|
||||
IF param[0] = "-" THEN
|
||||
DEC(i)
|
||||
END
|
||||
END getVal;
|
||||
|
||||
|
||||
BEGIN
|
||||
options.lower := TRUE;
|
||||
out := "";
|
||||
checking := options.checking;
|
||||
_end := FALSE;
|
||||
i := 3;
|
||||
REPEAT
|
||||
UTILS.GetArg(i, param);
|
||||
|
||||
IF param = "-stk" THEN
|
||||
INC(i);
|
||||
UTILS.GetArg(i, param);
|
||||
IF STRINGS.StrToInt(param, value) & (1 <= value) & (value <= 32) THEN
|
||||
options.stack := value
|
||||
END;
|
||||
IF param[0] = "-" THEN
|
||||
DEC(i)
|
||||
END
|
||||
|
||||
ELSIF param = "-out" THEN
|
||||
INC(i);
|
||||
UTILS.GetArg(i, param);
|
||||
IF param[0] = "-" THEN
|
||||
DEC(i)
|
||||
ELSE
|
||||
out := param
|
||||
END
|
||||
|
||||
ELSIF param = "-tab" THEN
|
||||
getVal(i, options.tab)
|
||||
|
||||
ELSIF param = "-ram" THEN
|
||||
getVal(i, options.ram)
|
||||
|
||||
ELSIF param = "-rom" THEN
|
||||
getVal(i, options.rom)
|
||||
|
||||
ELSIF param = "-nochk" THEN
|
||||
INC(i);
|
||||
UTILS.GetArg(i, param);
|
||||
|
||||
IF param[0] = "-" THEN
|
||||
DEC(i)
|
||||
ELSE
|
||||
j := 0;
|
||||
WHILE param[j] # 0X DO
|
||||
|
||||
IF param[j] = "p" THEN
|
||||
EXCL(checking, ST.chkPTR)
|
||||
ELSIF param[j] = "t" THEN
|
||||
EXCL(checking, ST.chkGUARD)
|
||||
ELSIF param[j] = "i" THEN
|
||||
EXCL(checking, ST.chkIDX)
|
||||
ELSIF param[j] = "b" THEN
|
||||
EXCL(checking, ST.chkBYTE)
|
||||
ELSIF param[j] = "c" THEN
|
||||
EXCL(checking, ST.chkCHR)
|
||||
ELSIF param[j] = "w" THEN
|
||||
EXCL(checking, ST.chkWCHR)
|
||||
ELSIF param[j] = "r" THEN
|
||||
EXCL(checking, ST.chkCHR);
|
||||
EXCL(checking, ST.chkWCHR);
|
||||
EXCL(checking, ST.chkBYTE)
|
||||
ELSIF param[j] = "s" THEN
|
||||
EXCL(checking, ST.chkSTK)
|
||||
ELSIF param[j] = "a" THEN
|
||||
checking := {}
|
||||
END;
|
||||
|
||||
INC(j)
|
||||
END;
|
||||
|
||||
END
|
||||
|
||||
ELSIF param = "-ver" THEN
|
||||
INC(i);
|
||||
UTILS.GetArg(i, param);
|
||||
IF STRINGS.StrToVer(param, major, minor) THEN
|
||||
options.version := major * 65536 + minor
|
||||
END;
|
||||
IF param[0] = "-" THEN
|
||||
DEC(i)
|
||||
END
|
||||
|
||||
ELSIF param = "-lower" THEN
|
||||
options.lower := TRUE
|
||||
|
||||
ELSIF param = "-upper" THEN
|
||||
options.lower := FALSE
|
||||
|
||||
ELSIF param = "-pic" THEN
|
||||
options.pic := TRUE
|
||||
|
||||
ELSIF param = "-uses" THEN
|
||||
options.uses := TRUE
|
||||
|
||||
ELSIF param = "-def" THEN
|
||||
INC(i);
|
||||
UTILS.GetArg(i, param);
|
||||
SCAN.NewDef(param)
|
||||
|
||||
ELSIF param = "" THEN
|
||||
_end := TRUE
|
||||
|
||||
ELSE
|
||||
ERRORS.BadParam(param)
|
||||
END;
|
||||
|
||||
INC(i)
|
||||
UNTIL _end;
|
||||
|
||||
options.checking := checking
|
||||
END keys;
|
||||
|
||||
|
||||
PROCEDURE OutTargetItem (target: INTEGER; text: ARRAY OF CHAR);
|
||||
VAR
|
||||
width: INTEGER;
|
||||
|
||||
BEGIN
|
||||
width := 15;
|
||||
width := width - LENGTH(TARGETS.Targets[target].ComLinePar) - 4;
|
||||
C.String(" '"); C.String(TARGETS.Targets[target].ComLinePar); C.String("'");
|
||||
WHILE width > 0 DO
|
||||
C.String(20X);
|
||||
DEC(width)
|
||||
END;
|
||||
C.StringLn(text)
|
||||
END OutTargetItem;
|
||||
|
||||
|
||||
PROCEDURE main;
|
||||
VAR
|
||||
path: PARS.PATH;
|
||||
inname: PARS.PATH;
|
||||
ext: PARS.PATH;
|
||||
app_path: PARS.PATH;
|
||||
lib_path: PARS.PATH;
|
||||
modname: PARS.PATH;
|
||||
outname: PARS.PATH;
|
||||
param: PARS.PATH;
|
||||
temp: PARS.PATH;
|
||||
target: INTEGER;
|
||||
time: INTEGER;
|
||||
options: PROG.OPTIONS;
|
||||
|
||||
BEGIN
|
||||
options.stack := 2;
|
||||
options.tab := TEXTDRV.defTabSize;
|
||||
options.version := 65536;
|
||||
options.pic := FALSE;
|
||||
options.lower := FALSE;
|
||||
options.uses := FALSE;
|
||||
options.checking := ST.chkALL;
|
||||
|
||||
PATHS.GetCurrentDirectory(app_path);
|
||||
|
||||
UTILS.GetArg(0, temp);
|
||||
PATHS.split(temp, path, modname, ext);
|
||||
IF PATHS.isRelative(path) THEN
|
||||
PATHS.RelPath(app_path, path, temp);
|
||||
path := temp
|
||||
END;
|
||||
lib_path := path;
|
||||
|
||||
UTILS.GetArg(1, inname);
|
||||
STRINGS.replace(inname, "\", UTILS.slash);
|
||||
STRINGS.replace(inname, "/", UTILS.slash);
|
||||
|
||||
C.Ln;
|
||||
C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor);
|
||||
C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit) " + UTILS.Date);
|
||||
C.StringLn("Copyright (c) 2018-2023, Anton Krotov");
|
||||
|
||||
IF inname = "" THEN
|
||||
C.Ln;
|
||||
C.StringLn("Usage: Compiler <main module> <target> [optional settings]"); C.Ln;
|
||||
C.StringLn("target =");
|
||||
IF UTILS.bit_depth = 64 THEN
|
||||
OutTargetItem(TARGETS.Win64C, "Windows64 Console");
|
||||
OutTargetItem(TARGETS.Win64GUI, "Windows64 GUI");
|
||||
OutTargetItem(TARGETS.Win64DLL, "Windows64 DLL");
|
||||
OutTargetItem(TARGETS.Linux64, "Linux64 Exec");
|
||||
OutTargetItem(TARGETS.Linux64SO, "Linux64 SO")
|
||||
END;
|
||||
OutTargetItem(TARGETS.Win32C, "Windows32 Console");
|
||||
OutTargetItem(TARGETS.Win32GUI, "Windows32 GUI");
|
||||
OutTargetItem(TARGETS.Win32DLL, "Windows32 DLL");
|
||||
OutTargetItem(TARGETS.Linux32, "Linux32 Exec");
|
||||
OutTargetItem(TARGETS.Linux32SO, "Linux32 SO");
|
||||
OutTargetItem(TARGETS.KolibriOS, "KolibriOS Exec");
|
||||
OutTargetItem(TARGETS.KolibriOSDLL, "KolibriOS DLL");
|
||||
OutTargetItem(TARGETS.MSP430, "MSP430x{1,2}xx microcontrollers");
|
||||
OutTargetItem(TARGETS.STM32CM3, "STM32 Cortex-M3 microcontrollers");
|
||||
C.Ln;
|
||||
C.StringLn("optional settings:"); C.Ln;
|
||||
C.StringLn(" -out <file name> output"); C.Ln;
|
||||
C.StringLn(" -stk <size> set size of stack in Mbytes (Windows, Linux, KolibriOS)"); C.Ln;
|
||||
C.StringLn(" -nochk <'ptibcwra'> disable runtime checking (pointers, types, indexes,");
|
||||
C.StringLn(" BYTE, CHR, WCHR)"); C.Ln;
|
||||
C.StringLn(" -lower allow lower case for keywords (default)"); C.Ln;
|
||||
C.StringLn(" -upper only upper case for keywords"); C.Ln;
|
||||
C.StringLn(" -def <identifier> define conditional compilation symbol"); C.Ln;
|
||||
C.StringLn(" -ver <major.minor> set version of program (KolibriOS DLL)"); C.Ln;
|
||||
C.StringLn(" -ram <size> set size of RAM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
|
||||
C.StringLn(" -rom <size> set size of ROM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
|
||||
C.StringLn(" -tab <width> set width for tabs"); C.Ln;
|
||||
C.StringLn(" -uses list imported modules"); C.Ln;
|
||||
UTILS.Exit(0)
|
||||
END;
|
||||
|
||||
C.Dashes;
|
||||
PATHS.split(inname, path, modname, ext);
|
||||
|
||||
IF ext # UTILS.FILE_EXT THEN
|
||||
ERRORS.Error(207)
|
||||
END;
|
||||
|
||||
IF PATHS.isRelative(path) THEN
|
||||
PATHS.RelPath(app_path, path, temp);
|
||||
path := temp
|
||||
END;
|
||||
|
||||
UTILS.GetArg(2, param);
|
||||
IF param = "" THEN
|
||||
ERRORS.Error(205)
|
||||
END;
|
||||
|
||||
SCAN.NewDef(param);
|
||||
|
||||
IF TARGETS.Select(param) THEN
|
||||
target := TARGETS.target
|
||||
ELSE
|
||||
ERRORS.Error(206)
|
||||
END;
|
||||
|
||||
IF TARGETS.CPU = TARGETS.cpuMSP430 THEN
|
||||
options.ram := MSP430.minRAM;
|
||||
options.rom := MSP430.minROM
|
||||
END;
|
||||
|
||||
IF (TARGETS.CPU = TARGETS.cpuTHUMB) & (TARGETS.OS = TARGETS.osNONE) THEN
|
||||
options.ram := THUMB.minRAM;
|
||||
options.rom := THUMB.minROM
|
||||
END;
|
||||
|
||||
IF UTILS.bit_depth < TARGETS.BitDepth THEN
|
||||
ERRORS.Error(206)
|
||||
END;
|
||||
|
||||
STRINGS.append(lib_path, "lib");
|
||||
STRINGS.append(lib_path, UTILS.slash);
|
||||
STRINGS.append(lib_path, TARGETS.LibDir);
|
||||
STRINGS.append(lib_path, UTILS.slash);
|
||||
|
||||
keys(options, outname);
|
||||
TEXTDRV.setTabSize(options.tab);
|
||||
IF outname = "" THEN
|
||||
outname := path;
|
||||
STRINGS.append(outname, modname);
|
||||
STRINGS.append(outname, TARGETS.FileExt)
|
||||
ELSE
|
||||
IF PATHS.isRelative(outname) THEN
|
||||
PATHS.RelPath(app_path, outname, temp);
|
||||
outname := temp
|
||||
END
|
||||
END;
|
||||
|
||||
PARS.init(options);
|
||||
|
||||
CASE TARGETS.OS OF
|
||||
|TARGETS.osNONE:
|
||||
|TARGETS.osWIN32,
|
||||
TARGETS.osWIN64: SCAN.NewDef(DEF_WINDOWS)
|
||||
|TARGETS.osLINUX32,
|
||||
TARGETS.osLINUX64: SCAN.NewDef(DEF_LINUX)
|
||||
|TARGETS.osKOS: SCAN.NewDef(DEF_KOLIBRIOS)
|
||||
END;
|
||||
|
||||
CASE TARGETS.CPU OF
|
||||
|TARGETS.cpuX86: SCAN.NewDef(DEF_CPU_X86)
|
||||
|TARGETS.cpuAMD64: SCAN.NewDef(DEF_CPU_X8664)
|
||||
|TARGETS.cpuMSP430:
|
||||
|TARGETS.cpuTHUMB:
|
||||
|TARGETS.cpuRVM32I:
|
||||
|TARGETS.cpuRVM64I:
|
||||
END;
|
||||
|
||||
ST.compile(path, lib_path, modname, outname, target, options);
|
||||
|
||||
time := UTILS.GetTickCount() - UTILS.time;
|
||||
C.Dashes;
|
||||
C.Int(PARS.lines); C.String(" lines, ");
|
||||
C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, ");
|
||||
C.Int(WRITER.counter); C.StringLn(" bytes");
|
||||
|
||||
UTILS.Exit(0)
|
||||
END main;
|
||||
|
||||
|
||||
BEGIN
|
||||
main
|
||||
END Compiler.
|
||||
@@ -1,592 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2019-2021, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE ELF;
|
||||
|
||||
IMPORT BIN, WR := WRITER, CHL := CHUNKLISTS, LISTS, PE32, UTILS, STRINGS;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
EI_NIDENT = 16;
|
||||
ET_EXEC = 2;
|
||||
ET_DYN = 3;
|
||||
|
||||
EM_386 = 3;
|
||||
EM_8664 = 3EH;
|
||||
|
||||
ELFCLASS32 = 1;
|
||||
ELFCLASS64 = 2;
|
||||
|
||||
ELFDATA2LSB = 1;
|
||||
ELFDATA2MSB = 2;
|
||||
|
||||
PF_X = 1;
|
||||
PF_W = 2;
|
||||
PF_R = 4;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
Elf32_Ehdr = RECORD
|
||||
|
||||
e_ident: ARRAY EI_NIDENT OF BYTE;
|
||||
|
||||
e_type,
|
||||
e_machine: WCHAR;
|
||||
|
||||
e_version,
|
||||
e_entry,
|
||||
e_phoff,
|
||||
e_shoff,
|
||||
e_flags: INTEGER;
|
||||
|
||||
e_ehsize,
|
||||
e_phentsize,
|
||||
e_phnum,
|
||||
e_shentsize,
|
||||
e_shnum,
|
||||
e_shstrndx: WCHAR
|
||||
|
||||
END;
|
||||
|
||||
|
||||
Elf32_Phdr = RECORD
|
||||
|
||||
p_type,
|
||||
p_offset,
|
||||
p_vaddr,
|
||||
p_paddr,
|
||||
p_filesz,
|
||||
p_memsz,
|
||||
p_flags,
|
||||
p_align: INTEGER
|
||||
|
||||
END;
|
||||
|
||||
|
||||
Elf32_Dyn = POINTER TO RECORD (LISTS.ITEM)
|
||||
|
||||
d_tag, d_val: INTEGER
|
||||
|
||||
END;
|
||||
|
||||
|
||||
Elf32_Sym = POINTER TO RECORD (LISTS.ITEM)
|
||||
|
||||
name, value, size: INTEGER;
|
||||
info, other: CHAR;
|
||||
shndx: WCHAR
|
||||
|
||||
END;
|
||||
|
||||
|
||||
VAR
|
||||
|
||||
dynamic: LISTS.LIST;
|
||||
strtab: CHL.BYTELIST;
|
||||
symtab: LISTS.LIST;
|
||||
|
||||
hashtab, bucket, chain: CHL.INTLIST;
|
||||
|
||||
|
||||
PROCEDURE Write16 (w: WCHAR);
|
||||
BEGIN
|
||||
WR.Write16LE(ORD(w))
|
||||
END Write16;
|
||||
|
||||
|
||||
PROCEDURE WritePH (ph: Elf32_Phdr);
|
||||
BEGIN
|
||||
WR.Write32LE(ph.p_type);
|
||||
WR.Write32LE(ph.p_offset);
|
||||
WR.Write32LE(ph.p_vaddr);
|
||||
WR.Write32LE(ph.p_paddr);
|
||||
WR.Write32LE(ph.p_filesz);
|
||||
WR.Write32LE(ph.p_memsz);
|
||||
WR.Write32LE(ph.p_flags);
|
||||
WR.Write32LE(ph.p_align)
|
||||
END WritePH;
|
||||
|
||||
|
||||
PROCEDURE WritePH64 (ph: Elf32_Phdr);
|
||||
BEGIN
|
||||
WR.Write32LE(ph.p_type);
|
||||
WR.Write32LE(ph.p_flags);
|
||||
WR.Write64LE(ph.p_offset);
|
||||
WR.Write64LE(ph.p_vaddr);
|
||||
WR.Write64LE(ph.p_paddr);
|
||||
WR.Write64LE(ph.p_filesz);
|
||||
WR.Write64LE(ph.p_memsz);
|
||||
WR.Write64LE(ph.p_align)
|
||||
END WritePH64;
|
||||
|
||||
|
||||
PROCEDURE NewDyn (tag, val: INTEGER);
|
||||
VAR
|
||||
dyn: Elf32_Dyn;
|
||||
|
||||
BEGIN
|
||||
NEW(dyn);
|
||||
dyn.d_tag := tag;
|
||||
dyn.d_val := val;
|
||||
LISTS.push(dynamic, dyn)
|
||||
END NewDyn;
|
||||
|
||||
|
||||
PROCEDURE NewSym (name, value, size: INTEGER; info, other: CHAR; shndx: WCHAR);
|
||||
VAR
|
||||
sym: Elf32_Sym;
|
||||
|
||||
BEGIN
|
||||
NEW(sym);
|
||||
sym.name := name;
|
||||
sym.value := value;
|
||||
sym.size := size;
|
||||
sym.info := info;
|
||||
sym.other := other;
|
||||
sym.shndx := shndx;
|
||||
|
||||
LISTS.push(symtab, sym)
|
||||
END NewSym;
|
||||
|
||||
|
||||
PROCEDURE MakeHash (bucket, chain: CHL.INTLIST; symCount: INTEGER);
|
||||
VAR
|
||||
symi, hi, k: INTEGER;
|
||||
|
||||
BEGIN
|
||||
FOR symi := 0 TO symCount - 1 DO
|
||||
CHL.SetInt(chain, symi, 0);
|
||||
hi := CHL.GetInt(hashtab, symi) MOD symCount;
|
||||
IF CHL.GetInt(bucket, hi) # 0 THEN
|
||||
k := symi;
|
||||
WHILE CHL.GetInt(chain, k) # 0 DO
|
||||
k := CHL.GetInt(chain, k)
|
||||
END;
|
||||
CHL.SetInt(chain, k, CHL.GetInt(bucket, hi))
|
||||
END;
|
||||
CHL.SetInt(bucket, hi, symi)
|
||||
END
|
||||
END MakeHash;
|
||||
|
||||
|
||||
PROCEDURE write* (program: BIN.PROGRAM; FileName: ARRAY OF CHAR; fini: INTEGER; so, amd64: BOOLEAN);
|
||||
CONST
|
||||
interp = 0;
|
||||
dyn = 1;
|
||||
header = 2;
|
||||
text = 3;
|
||||
data = 4;
|
||||
bss = 5;
|
||||
|
||||
linuxInterpreter64 = "/lib64/ld-linux-x86-64.so.2";
|
||||
linuxInterpreter32 = "/lib/ld-linux.so.2";
|
||||
|
||||
exeBaseAddress32 = 8048000H;
|
||||
exeBaseAddress64 = 400000H;
|
||||
dllBaseAddress = 0;
|
||||
|
||||
DT_NULL = 0;
|
||||
DT_NEEDED = 1;
|
||||
DT_HASH = 4;
|
||||
DT_STRTAB = 5;
|
||||
DT_SYMTAB = 6;
|
||||
DT_RELA = 7;
|
||||
DT_RELASZ = 8;
|
||||
DT_RELAENT = 9;
|
||||
DT_STRSZ = 10;
|
||||
DT_SYMENT = 11;
|
||||
DT_INIT = 12;
|
||||
DT_FINI = 13;
|
||||
DT_SONAME = 14;
|
||||
DT_REL = 17;
|
||||
DT_RELSZ = 18;
|
||||
DT_RELENT = 19;
|
||||
|
||||
VAR
|
||||
ehdr: Elf32_Ehdr;
|
||||
phdr: ARRAY 16 OF Elf32_Phdr;
|
||||
|
||||
i, BaseAdr, DynAdr, offset, pad, VA, symCount: INTEGER;
|
||||
|
||||
SizeOf: RECORD header, code, data, bss: INTEGER END;
|
||||
|
||||
Offset: RECORD symtab, reltab, hash, strtab: INTEGER END;
|
||||
|
||||
Interpreter: ARRAY 40 OF CHAR; lenInterpreter: INTEGER;
|
||||
|
||||
item: LISTS.ITEM;
|
||||
|
||||
Name: ARRAY 2048 OF CHAR;
|
||||
|
||||
Address: PE32.VIRTUAL_ADDR;
|
||||
|
||||
BEGIN
|
||||
dynamic := LISTS.create(NIL);
|
||||
symtab := LISTS.create(NIL);
|
||||
strtab := CHL.CreateByteList();
|
||||
|
||||
IF amd64 THEN
|
||||
BaseAdr := exeBaseAddress64;
|
||||
Interpreter := linuxInterpreter64
|
||||
ELSE
|
||||
BaseAdr := exeBaseAddress32;
|
||||
Interpreter := linuxInterpreter32
|
||||
END;
|
||||
|
||||
IF so THEN
|
||||
BaseAdr := dllBaseAddress
|
||||
END;
|
||||
|
||||
lenInterpreter := LENGTH(Interpreter) + 1;
|
||||
|
||||
SizeOf.code := CHL.Length(program.code);
|
||||
SizeOf.data := CHL.Length(program.data);
|
||||
SizeOf.bss := program.bss;
|
||||
|
||||
ehdr.e_ident[0] := 7FH;
|
||||
ehdr.e_ident[1] := ORD("E");
|
||||
ehdr.e_ident[2] := ORD("L");
|
||||
ehdr.e_ident[3] := ORD("F");
|
||||
IF amd64 THEN
|
||||
ehdr.e_ident[4] := ELFCLASS64
|
||||
ELSE
|
||||
ehdr.e_ident[4] := ELFCLASS32
|
||||
END;
|
||||
ehdr.e_ident[5] := ELFDATA2LSB;
|
||||
ehdr.e_ident[6] := 1;
|
||||
ehdr.e_ident[7] := 3;
|
||||
FOR i := 8 TO EI_NIDENT - 1 DO
|
||||
ehdr.e_ident[i] := 0
|
||||
END;
|
||||
|
||||
IF so THEN
|
||||
ehdr.e_type := WCHR(ET_DYN)
|
||||
ELSE
|
||||
ehdr.e_type := WCHR(ET_EXEC)
|
||||
END;
|
||||
|
||||
ehdr.e_version := 1;
|
||||
ehdr.e_shoff := 0;
|
||||
ehdr.e_flags := 0;
|
||||
ehdr.e_shnum := WCHR(0);
|
||||
ehdr.e_shstrndx := WCHR(0);
|
||||
ehdr.e_phnum := WCHR(6);
|
||||
|
||||
IF amd64 THEN
|
||||
ehdr.e_machine := WCHR(EM_8664);
|
||||
ehdr.e_phoff := 40H;
|
||||
ehdr.e_ehsize := WCHR(40H);
|
||||
ehdr.e_phentsize := WCHR(38H);
|
||||
ehdr.e_shentsize := WCHR(40H)
|
||||
ELSE
|
||||
ehdr.e_machine := WCHR(EM_386);
|
||||
ehdr.e_phoff := 34H;
|
||||
ehdr.e_ehsize := WCHR(34H);
|
||||
ehdr.e_phentsize := WCHR(20H);
|
||||
ehdr.e_shentsize := WCHR(28H)
|
||||
END;
|
||||
|
||||
SizeOf.header := ORD(ehdr.e_ehsize) + ORD(ehdr.e_phentsize) * ORD(ehdr.e_phnum);
|
||||
|
||||
phdr[interp].p_type := 3;
|
||||
phdr[interp].p_offset := SizeOf.header;
|
||||
phdr[interp].p_vaddr := BaseAdr + phdr[interp].p_offset;
|
||||
phdr[interp].p_paddr := phdr[interp].p_vaddr;
|
||||
phdr[interp].p_filesz := lenInterpreter;
|
||||
phdr[interp].p_memsz := lenInterpreter;
|
||||
phdr[interp].p_flags := PF_R;
|
||||
phdr[interp].p_align := 1;
|
||||
|
||||
phdr[dyn].p_type := 2;
|
||||
phdr[dyn].p_offset := phdr[interp].p_offset + phdr[interp].p_filesz;
|
||||
phdr[dyn].p_vaddr := BaseAdr + phdr[dyn].p_offset;
|
||||
phdr[dyn].p_paddr := phdr[dyn].p_vaddr;
|
||||
|
||||
hashtab := CHL.CreateIntList();
|
||||
|
||||
CHL.PushInt(hashtab, STRINGS.HashStr(""));
|
||||
NewSym(CHL.PushStr(strtab, ""), 0, 0, 0X, 0X, 0X);
|
||||
CHL.PushInt(hashtab, STRINGS.HashStr("dlopen"));
|
||||
NewSym(CHL.PushStr(strtab, "dlopen"), 0, 0, 12X, 0X, 0X);
|
||||
CHL.PushInt(hashtab, STRINGS.HashStr("dlsym"));
|
||||
NewSym(CHL.PushStr(strtab, "dlsym"), 0, 0, 12X, 0X, 0X);
|
||||
|
||||
IF so THEN
|
||||
item := program.exp_list.first;
|
||||
WHILE item # NIL DO
|
||||
ASSERT(CHL.GetStr(program.export, item(BIN.EXPRT).nameoffs, Name));
|
||||
CHL.PushInt(hashtab, STRINGS.HashStr(Name));
|
||||
NewSym(CHL.PushStr(strtab, Name), item(BIN.EXPRT).label, 0, 12X, 0X, 0X);
|
||||
item := item.next
|
||||
END;
|
||||
ASSERT(CHL.GetStr(program.data, program.modname, Name))
|
||||
END;
|
||||
|
||||
symCount := LISTS.count(symtab);
|
||||
|
||||
bucket := CHL.CreateIntList();
|
||||
chain := CHL.CreateIntList();
|
||||
|
||||
FOR i := 1 TO symCount DO
|
||||
CHL.PushInt(bucket, 0);
|
||||
CHL.PushInt(chain, 0)
|
||||
END;
|
||||
|
||||
MakeHash(bucket, chain, symCount);
|
||||
|
||||
NewDyn(DT_NEEDED, CHL.PushStr(strtab, "libdl.so.2"));
|
||||
NewDyn(DT_STRTAB, 0);
|
||||
NewDyn(DT_STRSZ, CHL.Length(strtab));
|
||||
NewDyn(DT_SYMTAB, 0);
|
||||
|
||||
IF amd64 THEN
|
||||
NewDyn(DT_SYMENT, 24);
|
||||
NewDyn(DT_RELA, 0);
|
||||
NewDyn(DT_RELASZ, 48);
|
||||
NewDyn(DT_RELAENT, 24)
|
||||
ELSE
|
||||
NewDyn(DT_SYMENT, 16);
|
||||
NewDyn(DT_REL, 0);
|
||||
NewDyn(DT_RELSZ, 16);
|
||||
NewDyn(DT_RELENT, 8)
|
||||
END;
|
||||
|
||||
NewDyn(DT_HASH, 0);
|
||||
|
||||
IF so THEN
|
||||
NewDyn(DT_SONAME, CHL.PushStr(strtab, Name));
|
||||
NewDyn(DT_INIT, 0);
|
||||
NewDyn(DT_FINI, 0)
|
||||
END;
|
||||
|
||||
NewDyn(DT_NULL, 0);
|
||||
|
||||
Offset.symtab := LISTS.count(dynamic) * (8 + 8 * ORD(amd64));
|
||||
Offset.reltab := Offset.symtab + symCount * (16 + 8 * ORD(amd64));
|
||||
Offset.hash := Offset.reltab + (8 + 16 * ORD(amd64)) * 2;
|
||||
Offset.strtab := Offset.hash + (symCount * 2 + 2) * 4;
|
||||
|
||||
DynAdr := phdr[dyn].p_offset + BaseAdr;
|
||||
|
||||
item := LISTS.getidx(dynamic, 1); item(Elf32_Dyn).d_val := Offset.strtab + DynAdr;
|
||||
item := LISTS.getidx(dynamic, 3); item(Elf32_Dyn).d_val := Offset.symtab + DynAdr;
|
||||
item := LISTS.getidx(dynamic, 5); item(Elf32_Dyn).d_val := Offset.reltab + DynAdr;
|
||||
item := LISTS.getidx(dynamic, 8); item(Elf32_Dyn).d_val := Offset.hash + DynAdr;
|
||||
|
||||
phdr[dyn].p_filesz := Offset.strtab + CHL.Length(strtab) + 8 + 8 * ORD(amd64);
|
||||
phdr[dyn].p_memsz := phdr[dyn].p_filesz;
|
||||
|
||||
phdr[dyn].p_flags := PF_R;
|
||||
phdr[dyn].p_align := 1;
|
||||
|
||||
offset := 0;
|
||||
|
||||
phdr[header].p_type := 1;
|
||||
phdr[header].p_offset := offset;
|
||||
phdr[header].p_vaddr := BaseAdr;
|
||||
phdr[header].p_paddr := BaseAdr;
|
||||
phdr[header].p_filesz := SizeOf.header + lenInterpreter + phdr[dyn].p_filesz;
|
||||
phdr[header].p_memsz := phdr[header].p_filesz;
|
||||
phdr[header].p_flags := PF_R + PF_W;
|
||||
phdr[header].p_align := 1000H;
|
||||
|
||||
INC(offset, phdr[header].p_filesz);
|
||||
VA := BaseAdr + offset + 1000H;
|
||||
|
||||
phdr[text].p_type := 1;
|
||||
phdr[text].p_offset := offset;
|
||||
phdr[text].p_vaddr := VA;
|
||||
phdr[text].p_paddr := VA;
|
||||
phdr[text].p_filesz := SizeOf.code;
|
||||
phdr[text].p_memsz := SizeOf.code;
|
||||
phdr[text].p_flags := PF_X + PF_R;
|
||||
phdr[text].p_align := 1000H;
|
||||
|
||||
ehdr.e_entry := phdr[text].p_vaddr;
|
||||
|
||||
INC(offset, phdr[text].p_filesz);
|
||||
VA := BaseAdr + offset + 2000H;
|
||||
pad := (16 - VA MOD 16) MOD 16;
|
||||
|
||||
phdr[data].p_type := 1;
|
||||
phdr[data].p_offset := offset;
|
||||
phdr[data].p_vaddr := VA;
|
||||
phdr[data].p_paddr := VA;
|
||||
phdr[data].p_filesz := SizeOf.data + pad;
|
||||
phdr[data].p_memsz := SizeOf.data + pad;
|
||||
phdr[data].p_flags := PF_R + PF_W;
|
||||
phdr[data].p_align := 1000H;
|
||||
|
||||
INC(offset, phdr[data].p_filesz);
|
||||
VA := BaseAdr + offset + 3000H;
|
||||
|
||||
phdr[bss].p_type := 1;
|
||||
phdr[bss].p_offset := offset;
|
||||
phdr[bss].p_vaddr := VA;
|
||||
phdr[bss].p_paddr := VA;
|
||||
phdr[bss].p_filesz := 0;
|
||||
phdr[bss].p_memsz := SizeOf.bss + 16;
|
||||
phdr[bss].p_flags := PF_R + PF_W;
|
||||
phdr[bss].p_align := 1000H;
|
||||
|
||||
Address.Code := ehdr.e_entry;
|
||||
Address.Data := phdr[data].p_vaddr + pad;
|
||||
Address.Bss := WR.align(phdr[bss].p_vaddr, 16);
|
||||
Address.Import := 0;
|
||||
|
||||
PE32.fixup(program, Address, amd64);
|
||||
|
||||
item := symtab.first;
|
||||
WHILE item # NIL DO
|
||||
IF item(Elf32_Sym).value # 0 THEN
|
||||
INC(item(Elf32_Sym).value, ehdr.e_entry)
|
||||
END;
|
||||
item := item.next
|
||||
END;
|
||||
|
||||
IF so THEN
|
||||
item := LISTS.getidx(dynamic, 10); item(Elf32_Dyn).d_val := ehdr.e_entry;
|
||||
item := LISTS.getidx(dynamic, 11); item(Elf32_Dyn).d_val := BIN.GetLabel(program, fini) + ehdr.e_entry
|
||||
END;
|
||||
|
||||
WR.Create(FileName);
|
||||
|
||||
FOR i := 0 TO EI_NIDENT - 1 DO
|
||||
WR.WriteByte(ehdr.e_ident[i])
|
||||
END;
|
||||
|
||||
Write16(ehdr.e_type);
|
||||
Write16(ehdr.e_machine);
|
||||
|
||||
WR.Write32LE(ehdr.e_version);
|
||||
IF amd64 THEN
|
||||
WR.Write64LE(ehdr.e_entry);
|
||||
WR.Write64LE(ehdr.e_phoff);
|
||||
WR.Write64LE(ehdr.e_shoff)
|
||||
ELSE
|
||||
WR.Write32LE(ehdr.e_entry);
|
||||
WR.Write32LE(ehdr.e_phoff);
|
||||
WR.Write32LE(ehdr.e_shoff)
|
||||
END;
|
||||
WR.Write32LE(ehdr.e_flags);
|
||||
|
||||
Write16(ehdr.e_ehsize);
|
||||
Write16(ehdr.e_phentsize);
|
||||
Write16(ehdr.e_phnum);
|
||||
Write16(ehdr.e_shentsize);
|
||||
Write16(ehdr.e_shnum);
|
||||
Write16(ehdr.e_shstrndx);
|
||||
|
||||
IF amd64 THEN
|
||||
WritePH64(phdr[interp]);
|
||||
WritePH64(phdr[dyn]);
|
||||
WritePH64(phdr[header]);
|
||||
WritePH64(phdr[text]);
|
||||
WritePH64(phdr[data]);
|
||||
WritePH64(phdr[bss])
|
||||
ELSE
|
||||
WritePH(phdr[interp]);
|
||||
WritePH(phdr[dyn]);
|
||||
WritePH(phdr[header]);
|
||||
WritePH(phdr[text]);
|
||||
WritePH(phdr[data]);
|
||||
WritePH(phdr[bss])
|
||||
END;
|
||||
|
||||
FOR i := 0 TO lenInterpreter - 1 DO
|
||||
WR.WriteByte(ORD(Interpreter[i]))
|
||||
END;
|
||||
|
||||
IF amd64 THEN
|
||||
item := dynamic.first;
|
||||
WHILE item # NIL DO
|
||||
WR.Write64LE(item(Elf32_Dyn).d_tag);
|
||||
WR.Write64LE(item(Elf32_Dyn).d_val);
|
||||
item := item.next
|
||||
END;
|
||||
|
||||
item := symtab.first;
|
||||
WHILE item # NIL DO
|
||||
WR.Write32LE(item(Elf32_Sym).name);
|
||||
WR.WriteByte(ORD(item(Elf32_Sym).info));
|
||||
WR.WriteByte(ORD(item(Elf32_Sym).other));
|
||||
Write16(item(Elf32_Sym).shndx);
|
||||
WR.Write64LE(item(Elf32_Sym).value);
|
||||
WR.Write64LE(item(Elf32_Sym).size);
|
||||
item := item.next
|
||||
END;
|
||||
|
||||
WR.Write64LE(phdr[dyn].p_filesz + DynAdr - 16);
|
||||
WR.Write32LE(1);
|
||||
WR.Write32LE(1);
|
||||
WR.Write64LE(0);
|
||||
WR.Write64LE(phdr[dyn].p_filesz + DynAdr - 8);
|
||||
WR.Write32LE(1);
|
||||
WR.Write32LE(2);
|
||||
WR.Write64LE(0)
|
||||
|
||||
ELSE
|
||||
item := dynamic.first;
|
||||
WHILE item # NIL DO
|
||||
WR.Write32LE(item(Elf32_Dyn).d_tag);
|
||||
WR.Write32LE(item(Elf32_Dyn).d_val);
|
||||
item := item.next
|
||||
END;
|
||||
|
||||
item := symtab.first;
|
||||
WHILE item # NIL DO
|
||||
WR.Write32LE(item(Elf32_Sym).name);
|
||||
WR.Write32LE(item(Elf32_Sym).value);
|
||||
WR.Write32LE(item(Elf32_Sym).size);
|
||||
WR.WriteByte(ORD(item(Elf32_Sym).info));
|
||||
WR.WriteByte(ORD(item(Elf32_Sym).other));
|
||||
Write16(item(Elf32_Sym).shndx);
|
||||
item := item.next
|
||||
END;
|
||||
|
||||
WR.Write32LE(phdr[dyn].p_filesz + DynAdr - 8);
|
||||
WR.Write32LE(00000101H);
|
||||
WR.Write32LE(phdr[dyn].p_filesz + DynAdr - 4);
|
||||
WR.Write32LE(00000201H)
|
||||
|
||||
END;
|
||||
|
||||
WR.Write32LE(symCount);
|
||||
WR.Write32LE(symCount);
|
||||
|
||||
FOR i := 0 TO symCount - 1 DO
|
||||
WR.Write32LE(CHL.GetInt(bucket, i))
|
||||
END;
|
||||
|
||||
FOR i := 0 TO symCount - 1 DO
|
||||
WR.Write32LE(CHL.GetInt(chain, i))
|
||||
END;
|
||||
|
||||
CHL.WriteToFile(strtab);
|
||||
|
||||
IF amd64 THEN
|
||||
WR.Write64LE(0);
|
||||
WR.Write64LE(0)
|
||||
ELSE
|
||||
WR.Write32LE(0);
|
||||
WR.Write32LE(0)
|
||||
END;
|
||||
|
||||
CHL.WriteToFile(program.code);
|
||||
WHILE pad > 0 DO
|
||||
WR.WriteByte(0);
|
||||
DEC(pad)
|
||||
END;
|
||||
CHL.WriteToFile(program.data);
|
||||
WR.Close;
|
||||
UTILS.chmod(FileName)
|
||||
END write;
|
||||
|
||||
|
||||
END ELF.
|
||||
@@ -1,222 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2022, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE ERRORS;
|
||||
|
||||
IMPORT C := CONSOLE, UTILS;
|
||||
|
||||
|
||||
PROCEDURE HintMsg* (name: ARRAY OF CHAR; line, col, hint: INTEGER);
|
||||
BEGIN
|
||||
IF hint = 0 THEN
|
||||
C.String(" hint ("); C.Int(line); C.String(":"); C.Int(col); C.String(") ");
|
||||
C.String("variable '"); C.String(name); C.StringLn("' never used")
|
||||
END
|
||||
END HintMsg;
|
||||
|
||||
|
||||
PROCEDURE WarningMsg* (line, col, warning: INTEGER);
|
||||
BEGIN
|
||||
C.String(" warning ("); C.Int(line); C.String(":"); C.Int(col); C.String(") ");
|
||||
CASE warning OF
|
||||
|0: C.StringLn("passing a string value as a fixed array")
|
||||
|1: C.StringLn("endless FOR loop")
|
||||
|2: C.StringLn("identifier too long")
|
||||
END
|
||||
END WarningMsg;
|
||||
|
||||
|
||||
PROCEDURE ErrorMsg* (fname: ARRAY OF CHAR; line, col, errno: INTEGER);
|
||||
VAR
|
||||
str: ARRAY 80 OF CHAR;
|
||||
|
||||
BEGIN
|
||||
C.Ln;
|
||||
C.String(" error ("); C.Int(errno); C.String(") ("); C.Int(line); C.String(":"); C.Int(col); C.String(") ");
|
||||
|
||||
CASE errno OF
|
||||
| 1: str := "missing 'H' or 'X'"
|
||||
| 2: str := "missing scale"
|
||||
| 3: str := "unclosed string"
|
||||
| 4: str := "illegal character"
|
||||
| 5: str := "string too long"
|
||||
|
||||
| 7: str := "number too long"
|
||||
| 8..12: str := "number too large"
|
||||
| 13: str := "real numbers not supported"
|
||||
|
||||
| 21: str := "'MODULE' expected"
|
||||
| 22: str := "identifier expected"
|
||||
| 23: str := "module name does not match file name"
|
||||
| 24: str := "';' expected"
|
||||
| 25: str := "identifier does not match module name"
|
||||
| 26: str := "'.' expected"
|
||||
| 27: str := "'END' expected"
|
||||
| 28: str := "',', ';' or ':=' expected"
|
||||
| 29: str := "module not found"
|
||||
| 30: str := "multiply defined identifier"
|
||||
| 31: str := "recursive import"
|
||||
| 32: str := "'=' expected"
|
||||
| 33: str := "')' expected"
|
||||
| 34: str := "syntax error in expression"
|
||||
| 35: str := "'}' expected"
|
||||
| 36: str := "incompatible operand"
|
||||
| 37: str := "incompatible operands"
|
||||
| 38: str := "'RETURN' expected"
|
||||
| 39: str := "integer overflow"
|
||||
| 40: str := "floating point overflow"
|
||||
| 41: str := "not enough floating point registers; simplify expression"
|
||||
| 42: str := "out of range 0..255"
|
||||
| 43: str := "expression is not an integer"
|
||||
| 44: str := "out of range 0..MAXSET"
|
||||
| 45: str := "division by zero"
|
||||
| 46: str := "IV out of range"
|
||||
| 47: str := "'OF' or ',' expected"
|
||||
| 48: str := "undeclared identifier"
|
||||
| 49: str := "type expected"
|
||||
| 50: str := "recursive type definition"
|
||||
| 51: str := "illegal value of constant"
|
||||
| 52: str := "not a record type"
|
||||
| 53: str := "':' expected"
|
||||
| 54: str := "need to import SYSTEM"
|
||||
| 55: str := "pointer type not defined"
|
||||
| 56: str := "out of range 0..MAXSET"
|
||||
| 57: str := "'TO' expected"
|
||||
| 58: str := "not a record type"
|
||||
| 59: str := "this expression cannot be a procedure"
|
||||
| 60: str := "identifier does not match procedure name"
|
||||
| 61: str := "illegally marked identifier"
|
||||
| 62: str := "expression should be constant"
|
||||
| 63: str := "not enough RAM"
|
||||
| 64: str := "'(' expected"
|
||||
| 65: str := "',' expected"
|
||||
| 66: str := "incompatible parameter"
|
||||
| 67: str := "'OF' expected"
|
||||
| 68: str := "type expected"
|
||||
| 69: str := "result type of procedure is not a basic type"
|
||||
| 70: str := "import not supported"
|
||||
| 71: str := "']' expected"
|
||||
| 72: str := "expression is not BOOLEAN"
|
||||
| 73: str := "not a record"
|
||||
| 74: str := "undefined record field"
|
||||
| 75: str := "not an array"
|
||||
| 76: str := "expression is not an integer"
|
||||
| 77: str := "not a pointer"
|
||||
| 78: str := "type guard not allowed"
|
||||
| 79: str := "not a type"
|
||||
| 80: str := "not a record type"
|
||||
| 81: str := "not a pointer type"
|
||||
| 82: str := "type guard not allowed"
|
||||
| 83: str := "index out of range"
|
||||
| 84: str := "dimension too large"
|
||||
| 85: str := "procedure must have level 0"
|
||||
| 86: str := "not a procedure"
|
||||
| 87: str := "incompatible expression (RETURN)"
|
||||
| 88: str := "'THEN' expected"
|
||||
| 89: str := "'DO' expected"
|
||||
| 90: str := "'UNTIL' expected"
|
||||
| 91: str := "incompatible assignment"
|
||||
| 92: str := "procedure call of a function"
|
||||
| 93: str := "not a variable"
|
||||
| 94: str := "read only variable"
|
||||
| 95: str := "invalid type of expression (CASE)"
|
||||
| 96: str := "':=' expected"
|
||||
| 97: str := "not INTEGER variable"
|
||||
| 98: str := "illegal value of constant (0)"
|
||||
| 99: str := "incompatible label"
|
||||
|100: str := "multiply defined label"
|
||||
|101: str := "too large parameter of WCHR"
|
||||
|102: str := "label expected"
|
||||
|103: str := "illegal value of constant"
|
||||
|104: str := "type too large"
|
||||
|105: str := "access to intermediate variables not allowed"
|
||||
|106: str := "qualified identifier expected"
|
||||
|107: str := "too large parameter of CHR"
|
||||
|108: str := "a variable or a procedure expected"
|
||||
|109: str := "expression should be constant"
|
||||
|110: str := "out of range 0..65535"
|
||||
|111: str := "record [noalign] cannot have a base type"
|
||||
|112: str := "record [noalign] cannot be a base type"
|
||||
|113: str := "result type of procedure should not be REAL"
|
||||
|114: str := "identifiers 'lib_init' and 'version' are reserved"
|
||||
|115: str := "recursive constant definition"
|
||||
|116: str := "procedure too deep nested"
|
||||
|117: str := "string expected"
|
||||
|118: str := "'$END', '$ELSE' or '$ELSIF' without '$IF'"
|
||||
|119: str := "'$IF', '$ELSIF', '$ELSE' or '$END' expected"
|
||||
|120: str := "too many formal parameters"
|
||||
|121: str := "multiply defined handler"
|
||||
|122: str := "bad divisor"
|
||||
|123: str := "illegal flag"
|
||||
|124: str := "unknown flag"
|
||||
|125: str := "flag not supported"
|
||||
|126: str := "type of formal parameter should not be REAL"
|
||||
END;
|
||||
C.StringLn(str);
|
||||
C.String(" file: "); C.StringLn(fname);
|
||||
UTILS.Exit(1)
|
||||
END ErrorMsg;
|
||||
|
||||
|
||||
PROCEDURE Error1 (s1: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
C.Ln;
|
||||
C.StringLn(s1);
|
||||
UTILS.Exit(1)
|
||||
END Error1;
|
||||
|
||||
|
||||
PROCEDURE Error3 (s1, s2, s3: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
C.Ln;
|
||||
C.String(s1); C.String(s2); C.StringLn(s3);
|
||||
UTILS.Exit(1)
|
||||
END Error3;
|
||||
|
||||
|
||||
PROCEDURE Error5 (s1, s2, s3, s4, s5: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
C.Ln;
|
||||
C.String(s1); C.String(s2); C.String(s3); C.String(s4); C.StringLn(s5);
|
||||
UTILS.Exit(1)
|
||||
END Error5;
|
||||
|
||||
|
||||
PROCEDURE WrongRTL* (ProcName: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
Error5("procedure ", UTILS.RTL_NAME, ".", ProcName, " not found")
|
||||
END WrongRTL;
|
||||
|
||||
|
||||
PROCEDURE BadParam* (param: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
Error3("bad parameter: ", param, "")
|
||||
END BadParam;
|
||||
|
||||
|
||||
PROCEDURE FileNotFound* (Path, Name, Ext: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
Error5("file ", Path, Name, Ext, " not found")
|
||||
END FileNotFound;
|
||||
|
||||
|
||||
PROCEDURE Error* (n: INTEGER);
|
||||
BEGIN
|
||||
CASE n OF
|
||||
|201: Error1("writing file error")
|
||||
|202: Error1("too many relocations")
|
||||
|203: Error1("size of program is too large")
|
||||
|204: Error1("size of variables is too large")
|
||||
|205: Error1("not enough parameters")
|
||||
|206: Error1("bad parameter <target>")
|
||||
|207: Error3('inputfile name extension must be "', UTILS.FILE_EXT, '"')
|
||||
|208: Error1("not enough RAM")
|
||||
END
|
||||
END Error;
|
||||
|
||||
|
||||
END ERRORS.
|
||||
@@ -1,200 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2022, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE FILES;
|
||||
|
||||
IMPORT UTILS, C := COLLECTIONS;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
FILE* = POINTER TO RECORD (C.ITEM)
|
||||
|
||||
ptr: INTEGER;
|
||||
|
||||
buffer: ARRAY 64*1024 OF BYTE;
|
||||
count: INTEGER
|
||||
|
||||
END;
|
||||
|
||||
VAR
|
||||
|
||||
files: C.COLLECTION;
|
||||
|
||||
|
||||
PROCEDURE copy (src: ARRAY OF BYTE; src_idx: INTEGER; VAR dst: ARRAY OF BYTE; dst_idx: INTEGER; bytes: INTEGER);
|
||||
BEGIN
|
||||
WHILE bytes > 0 DO
|
||||
dst[dst_idx] := src[src_idx];
|
||||
INC(dst_idx);
|
||||
INC(src_idx);
|
||||
DEC(bytes)
|
||||
END
|
||||
END copy;
|
||||
|
||||
|
||||
PROCEDURE flush (file: FILE): INTEGER;
|
||||
VAR
|
||||
res: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF file # NIL THEN
|
||||
res := UTILS.FileWrite(file.ptr, file.buffer, file.count);
|
||||
IF res < 0 THEN
|
||||
res := 0
|
||||
END
|
||||
ELSE
|
||||
res := 0
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END flush;
|
||||
|
||||
|
||||
PROCEDURE NewFile (): FILE;
|
||||
VAR
|
||||
file: FILE;
|
||||
citem: C.ITEM;
|
||||
|
||||
BEGIN
|
||||
citem := C.pop(files);
|
||||
IF citem = NIL THEN
|
||||
NEW(file)
|
||||
ELSE
|
||||
file := citem(FILE)
|
||||
END
|
||||
|
||||
RETURN file
|
||||
END NewFile;
|
||||
|
||||
|
||||
PROCEDURE create* (name: ARRAY OF CHAR): FILE;
|
||||
VAR
|
||||
file: FILE;
|
||||
ptr: INTEGER;
|
||||
|
||||
BEGIN
|
||||
ptr := UTILS.FileCreate(name);
|
||||
|
||||
IF ptr > 0 THEN
|
||||
file := NewFile();
|
||||
file.ptr := ptr;
|
||||
file.count := 0
|
||||
ELSE
|
||||
file := NIL
|
||||
END
|
||||
|
||||
RETURN file
|
||||
END create;
|
||||
|
||||
|
||||
PROCEDURE open* (name: ARRAY OF CHAR): FILE;
|
||||
VAR
|
||||
file: FILE;
|
||||
ptr: INTEGER;
|
||||
|
||||
BEGIN
|
||||
ptr := UTILS.FileOpen(name);
|
||||
|
||||
IF ptr > 0 THEN
|
||||
file := NewFile();
|
||||
file.ptr := ptr;
|
||||
file.count := -1
|
||||
ELSE
|
||||
file := NIL
|
||||
END
|
||||
|
||||
RETURN file
|
||||
END open;
|
||||
|
||||
|
||||
PROCEDURE close* (VAR file: FILE);
|
||||
VAR
|
||||
n: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF file # NIL THEN
|
||||
|
||||
IF file.count > 0 THEN
|
||||
n := flush(file)
|
||||
END;
|
||||
|
||||
file.count := -1;
|
||||
|
||||
UTILS.FileClose(file.ptr);
|
||||
file.ptr := 0;
|
||||
|
||||
C.push(files, file);
|
||||
file := NIL
|
||||
END
|
||||
END close;
|
||||
|
||||
|
||||
PROCEDURE read* (file: FILE; VAR chunk: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
|
||||
VAR
|
||||
res: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF file # NIL THEN
|
||||
res := UTILS.FileRead(file.ptr, chunk, MAX(MIN(bytes, LEN(chunk)), 0));
|
||||
IF res < 0 THEN
|
||||
res := 0
|
||||
END
|
||||
ELSE
|
||||
res := 0
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END read;
|
||||
|
||||
|
||||
PROCEDURE write* (file: FILE; chunk: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
|
||||
VAR
|
||||
free, n, idx: INTEGER;
|
||||
|
||||
BEGIN
|
||||
idx := 0;
|
||||
IF (file # NIL) & (file.count >= 0) THEN
|
||||
|
||||
free := LEN(file.buffer) - file.count;
|
||||
WHILE bytes > 0 DO
|
||||
n := MIN(free, bytes);
|
||||
copy(chunk, idx, file.buffer, file.count, n);
|
||||
DEC(free, n);
|
||||
DEC(bytes, n);
|
||||
INC(idx, n);
|
||||
INC(file.count, n);
|
||||
IF free = 0 THEN
|
||||
IF flush(file) # LEN(file.buffer) THEN
|
||||
bytes := 0;
|
||||
DEC(idx, n)
|
||||
ELSE
|
||||
file.count := 0;
|
||||
free := LEN(file.buffer)
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
RETURN idx
|
||||
END write;
|
||||
|
||||
|
||||
PROCEDURE WriteByte* (file: FILE; byte: BYTE): BOOLEAN;
|
||||
VAR
|
||||
arr: ARRAY 1 OF BYTE;
|
||||
|
||||
BEGIN
|
||||
arr[0] := byte
|
||||
RETURN write(file, arr, 1) = 1
|
||||
END WriteByte;
|
||||
|
||||
|
||||
BEGIN
|
||||
files := C.create()
|
||||
END FILES.
|
||||
@@ -1,117 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2020, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE HEX;
|
||||
|
||||
IMPORT WRITER, CHL := CHUNKLISTS, UTILS;
|
||||
|
||||
|
||||
VAR
|
||||
|
||||
chksum: INTEGER;
|
||||
|
||||
|
||||
PROCEDURE Byte (byte: BYTE);
|
||||
BEGIN
|
||||
WRITER.WriteByte(UTILS.hexdgt(byte DIV 16));
|
||||
WRITER.WriteByte(UTILS.hexdgt(byte MOD 16));
|
||||
INC(chksum, byte)
|
||||
END Byte;
|
||||
|
||||
|
||||
PROCEDURE Byte4 (a, b, c, d: BYTE);
|
||||
BEGIN
|
||||
Byte(a);
|
||||
Byte(b);
|
||||
Byte(c);
|
||||
Byte(d)
|
||||
END Byte4;
|
||||
|
||||
|
||||
PROCEDURE NewLine;
|
||||
BEGIN
|
||||
Byte((-chksum) MOD 256);
|
||||
chksum := 0;
|
||||
WRITER.WriteByte(0DH);
|
||||
WRITER.WriteByte(0AH)
|
||||
END NewLine;
|
||||
|
||||
|
||||
PROCEDURE StartCode;
|
||||
BEGIN
|
||||
WRITER.WriteByte(ORD(":"));
|
||||
chksum := 0
|
||||
END StartCode;
|
||||
|
||||
|
||||
PROCEDURE Data* (mem: ARRAY OF BYTE; idx, cnt: INTEGER);
|
||||
VAR
|
||||
i, len: INTEGER;
|
||||
|
||||
BEGIN
|
||||
WHILE cnt > 0 DO
|
||||
len := MIN(cnt, 16);
|
||||
StartCode;
|
||||
Byte4(len, idx DIV 256, idx MOD 256, 0);
|
||||
FOR i := 1 TO len DO
|
||||
Byte(mem[idx]);
|
||||
INC(idx)
|
||||
END;
|
||||
DEC(cnt, len);
|
||||
NewLine
|
||||
END
|
||||
END Data;
|
||||
|
||||
|
||||
PROCEDURE ExtLA* (LA: INTEGER);
|
||||
BEGIN
|
||||
ASSERT((0 <= LA) & (LA <= 0FFFFH));
|
||||
StartCode;
|
||||
Byte4(2, 0, 0, 4);
|
||||
Byte(LA DIV 256);
|
||||
Byte(LA MOD 256);
|
||||
NewLine
|
||||
END ExtLA;
|
||||
|
||||
|
||||
PROCEDURE Data2* (mem: CHL.BYTELIST; idx, cnt, LA: INTEGER);
|
||||
VAR
|
||||
i, len, offset: INTEGER;
|
||||
|
||||
BEGIN
|
||||
ExtLA(LA);
|
||||
offset := 0;
|
||||
WHILE cnt > 0 DO
|
||||
ASSERT(offset <= 65536);
|
||||
IF offset = 65536 THEN
|
||||
INC(LA);
|
||||
ExtLA(LA);
|
||||
offset := 0
|
||||
END;
|
||||
len := MIN(cnt, 16);
|
||||
StartCode;
|
||||
Byte4(len, offset DIV 256, offset MOD 256, 0);
|
||||
FOR i := 1 TO len DO
|
||||
Byte(CHL.GetByte(mem, idx));
|
||||
INC(idx);
|
||||
INC(offset)
|
||||
END;
|
||||
DEC(cnt, len);
|
||||
NewLine
|
||||
END
|
||||
END Data2;
|
||||
|
||||
|
||||
PROCEDURE End*;
|
||||
BEGIN
|
||||
StartCode;
|
||||
Byte4(0, 0, 0, 1);
|
||||
NewLine
|
||||
END End;
|
||||
|
||||
|
||||
END HEX.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,206 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2020, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE KOS;
|
||||
|
||||
IMPORT BIN, WR := WRITER, LISTS, CHL := CHUNKLISTS;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
HEADER_SIZE = 36;
|
||||
|
||||
SIZE_OF_DWORD = 4;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
HEADER = RECORD
|
||||
|
||||
menuet01: ARRAY 9 OF CHAR;
|
||||
ver, start, size, mem, sp, param, path: INTEGER
|
||||
|
||||
END;
|
||||
|
||||
|
||||
PROCEDURE Import* (program: BIN.PROGRAM; idata: INTEGER; VAR ImportTable: CHL.INTLIST; VAR len, libcount, size: INTEGER);
|
||||
VAR
|
||||
i: INTEGER;
|
||||
imp: BIN.IMPRT;
|
||||
|
||||
BEGIN
|
||||
libcount := 0;
|
||||
imp := program.imp_list.first(BIN.IMPRT);
|
||||
WHILE imp # NIL DO
|
||||
IF imp.label = 0 THEN
|
||||
INC(libcount)
|
||||
END;
|
||||
imp := imp.next(BIN.IMPRT)
|
||||
END;
|
||||
|
||||
len := libcount * 2 + 2;
|
||||
size := (LISTS.count(program.imp_list) + len + 1) * SIZE_OF_DWORD;
|
||||
|
||||
ImportTable := CHL.CreateIntList();
|
||||
FOR i := 0 TO size DIV SIZE_OF_DWORD - 1 DO
|
||||
CHL.PushInt(ImportTable, 0)
|
||||
END;
|
||||
|
||||
i := 0;
|
||||
imp := program.imp_list.first(BIN.IMPRT);
|
||||
WHILE imp # NIL DO
|
||||
|
||||
IF imp.label = 0 THEN
|
||||
CHL.SetInt(ImportTable, len, 0);
|
||||
INC(len);
|
||||
CHL.SetInt(ImportTable, i, idata + len * SIZE_OF_DWORD);
|
||||
INC(i);
|
||||
CHL.SetInt(ImportTable, i, imp.nameoffs + size + idata);
|
||||
INC(i)
|
||||
ELSE
|
||||
CHL.SetInt(ImportTable, len, imp.nameoffs + size + idata);
|
||||
imp.label := len * SIZE_OF_DWORD;
|
||||
INC(len)
|
||||
END;
|
||||
|
||||
imp := imp.next(BIN.IMPRT)
|
||||
END;
|
||||
CHL.SetInt(ImportTable, len, 0);
|
||||
CHL.SetInt(ImportTable, i, 0);
|
||||
CHL.SetInt(ImportTable, i + 1, 0);
|
||||
INC(len);
|
||||
INC(size, CHL.Length(program._import))
|
||||
END Import;
|
||||
|
||||
|
||||
PROCEDURE write* (program: BIN.PROGRAM; FileName: ARRAY OF CHAR);
|
||||
|
||||
CONST
|
||||
|
||||
PARAM_SIZE = 2048;
|
||||
FileAlignment = 16;
|
||||
|
||||
|
||||
VAR
|
||||
header: HEADER;
|
||||
|
||||
base, text, data, idata, bss, offset: INTEGER;
|
||||
|
||||
reloc: BIN.RELOC;
|
||||
iproc: BIN.IMPRT;
|
||||
L: INTEGER;
|
||||
delta: INTEGER;
|
||||
|
||||
i: INTEGER;
|
||||
|
||||
ImportTable: CHL.INTLIST;
|
||||
ILen, libcount, isize: INTEGER;
|
||||
|
||||
icount, dcount, ccount: INTEGER;
|
||||
|
||||
code: CHL.BYTELIST;
|
||||
|
||||
BEGIN
|
||||
base := 0;
|
||||
|
||||
icount := CHL.Length(program._import);
|
||||
dcount := CHL.Length(program.data);
|
||||
ccount := CHL.Length(program.code);
|
||||
|
||||
text := base + HEADER_SIZE;
|
||||
data := WR.align(text + ccount, FileAlignment);
|
||||
idata := WR.align(data + dcount, FileAlignment);
|
||||
|
||||
Import(program, idata, ImportTable, ILen, libcount, isize);
|
||||
|
||||
bss := WR.align(idata + isize, FileAlignment);
|
||||
|
||||
header.menuet01 := "MENUET01";
|
||||
header.ver := 1;
|
||||
header.start := text;
|
||||
header.size := idata + isize - base;
|
||||
header.mem := WR.align(header.size + program.stack + program.bss + PARAM_SIZE * 2 + 4096, FileAlignment);
|
||||
header.sp := base + header.mem - PARAM_SIZE * 2;
|
||||
header.param := header.sp;
|
||||
header.path := header.param + PARAM_SIZE;
|
||||
|
||||
code := program.code;
|
||||
reloc := program.rel_list.first(BIN.RELOC);
|
||||
WHILE reloc # NIL DO
|
||||
|
||||
offset := reloc.offset;
|
||||
L := BIN.get32le(code, offset);
|
||||
delta := 3 - offset - text;
|
||||
|
||||
CASE reloc.opcode OF
|
||||
|
||||
|BIN.RIMP:
|
||||
iproc := BIN.GetIProc(program, L);
|
||||
delta := idata + iproc.label
|
||||
|
||||
|BIN.RBSS:
|
||||
delta := L + bss
|
||||
|
||||
|BIN.RDATA:
|
||||
delta := L + data
|
||||
|
||||
|BIN.RCODE:
|
||||
delta := BIN.GetLabel(program, L) + text
|
||||
|
||||
|BIN.PICDATA:
|
||||
INC(delta, L + data)
|
||||
|
||||
|BIN.PICCODE:
|
||||
INC(delta, BIN.GetLabel(program, L) + text)
|
||||
|
||||
|BIN.PICBSS:
|
||||
INC(delta, L + bss)
|
||||
|
||||
|BIN.PICIMP:
|
||||
iproc := BIN.GetIProc(program, L);
|
||||
INC(delta, idata + iproc.label)
|
||||
|
||||
|BIN.IMPTAB:
|
||||
INC(delta, idata)
|
||||
|
||||
END;
|
||||
BIN.put32le(code, offset, delta);
|
||||
|
||||
reloc := reloc.next(BIN.RELOC)
|
||||
END;
|
||||
|
||||
WR.Create(FileName);
|
||||
|
||||
FOR i := 0 TO 7 DO
|
||||
WR.WriteByte(ORD(header.menuet01[i]))
|
||||
END;
|
||||
|
||||
WR.Write32LE(header.ver);
|
||||
WR.Write32LE(header.start);
|
||||
WR.Write32LE(header.size);
|
||||
WR.Write32LE(header.mem);
|
||||
WR.Write32LE(header.sp);
|
||||
WR.Write32LE(header.param);
|
||||
WR.Write32LE(header.path);
|
||||
|
||||
CHL.WriteToFile(code);
|
||||
WR.Padding(FileAlignment);
|
||||
|
||||
CHL.WriteToFile(program.data);
|
||||
WR.Padding(FileAlignment);
|
||||
|
||||
FOR i := 0 TO ILen - 1 DO
|
||||
WR.Write32LE(CHL.GetInt(ImportTable, i))
|
||||
END;
|
||||
|
||||
CHL.WriteToFile(program._import);
|
||||
|
||||
WR.Close
|
||||
END write;
|
||||
|
||||
|
||||
END KOS.
|
||||
@@ -1,199 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2021, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE LISTS;
|
||||
|
||||
IMPORT C := COLLECTIONS;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
ITEM* = POINTER TO RECORD (C.ITEM)
|
||||
|
||||
prev*, next*: ITEM
|
||||
|
||||
END;
|
||||
|
||||
LIST* = POINTER TO RECORD
|
||||
|
||||
first*, last*: ITEM
|
||||
|
||||
END;
|
||||
|
||||
|
||||
PROCEDURE push* (list: LIST; item: ITEM);
|
||||
BEGIN
|
||||
ASSERT(list # NIL);
|
||||
ASSERT(item # NIL);
|
||||
|
||||
IF list.first = NIL THEN
|
||||
list.first := item;
|
||||
item.prev := NIL
|
||||
ELSE
|
||||
ASSERT(list.last # NIL);
|
||||
item.prev := list.last;
|
||||
list.last.next := item
|
||||
END;
|
||||
list.last := item;
|
||||
item.next := NIL
|
||||
END push;
|
||||
|
||||
|
||||
PROCEDURE pop* (list: LIST): ITEM;
|
||||
VAR
|
||||
last: ITEM;
|
||||
|
||||
BEGIN
|
||||
ASSERT(list # NIL);
|
||||
|
||||
last := list.last;
|
||||
|
||||
IF last # NIL THEN
|
||||
IF last = list.first THEN
|
||||
list.first := NIL;
|
||||
list.last := NIL
|
||||
ELSE
|
||||
list.last := last.prev;
|
||||
list.last.next := NIL
|
||||
END;
|
||||
|
||||
last.next := NIL;
|
||||
last.prev := NIL
|
||||
END
|
||||
|
||||
RETURN last
|
||||
END pop;
|
||||
|
||||
|
||||
PROCEDURE insert* (list: LIST; cur, nov: ITEM);
|
||||
VAR
|
||||
next: ITEM;
|
||||
|
||||
BEGIN
|
||||
ASSERT(list # NIL);
|
||||
ASSERT(nov # NIL);
|
||||
ASSERT(cur # NIL);
|
||||
|
||||
next := cur.next;
|
||||
|
||||
IF next # NIL THEN
|
||||
next.prev := nov;
|
||||
nov.next := next;
|
||||
cur.next := nov;
|
||||
nov.prev := cur
|
||||
ELSE
|
||||
push(list, nov)
|
||||
END
|
||||
|
||||
END insert;
|
||||
|
||||
|
||||
PROCEDURE insertL* (list: LIST; cur, nov: ITEM);
|
||||
VAR
|
||||
prev: ITEM;
|
||||
|
||||
BEGIN
|
||||
ASSERT(list # NIL);
|
||||
ASSERT(nov # NIL);
|
||||
ASSERT(cur # NIL);
|
||||
|
||||
prev := cur.prev;
|
||||
|
||||
IF prev # NIL THEN
|
||||
prev.next := nov;
|
||||
nov.prev := prev
|
||||
ELSE
|
||||
nov.prev := NIL;
|
||||
list.first := nov
|
||||
END;
|
||||
cur.prev := nov;
|
||||
nov.next := cur
|
||||
END insertL;
|
||||
|
||||
|
||||
PROCEDURE delete* (list: LIST; item: ITEM);
|
||||
VAR
|
||||
prev, next: ITEM;
|
||||
|
||||
BEGIN
|
||||
ASSERT(list # NIL);
|
||||
ASSERT(item # NIL);
|
||||
|
||||
prev := item.prev;
|
||||
next := item.next;
|
||||
|
||||
IF next # NIL THEN
|
||||
IF prev # NIL THEN
|
||||
prev.next := next;
|
||||
next.prev := prev
|
||||
ELSE
|
||||
next.prev := NIL;
|
||||
list.first := next
|
||||
END
|
||||
ELSE
|
||||
IF prev # NIL THEN
|
||||
prev.next := NIL;
|
||||
list.last := prev
|
||||
ELSE
|
||||
list.first := NIL;
|
||||
list.last := NIL
|
||||
END
|
||||
END
|
||||
END delete;
|
||||
|
||||
|
||||
PROCEDURE count* (list: LIST): INTEGER;
|
||||
VAR
|
||||
item: ITEM;
|
||||
res: INTEGER;
|
||||
|
||||
BEGIN
|
||||
ASSERT(list # NIL);
|
||||
res := 0;
|
||||
|
||||
item := list.first;
|
||||
WHILE item # NIL DO
|
||||
INC(res);
|
||||
item := item.next
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END count;
|
||||
|
||||
|
||||
PROCEDURE getidx* (list: LIST; idx: INTEGER): ITEM;
|
||||
VAR
|
||||
item: ITEM;
|
||||
|
||||
BEGIN
|
||||
ASSERT(list # NIL);
|
||||
ASSERT(idx >= 0);
|
||||
|
||||
item := list.first;
|
||||
WHILE (item # NIL) & (idx > 0) DO
|
||||
item := item.next;
|
||||
DEC(idx)
|
||||
END
|
||||
|
||||
RETURN item
|
||||
END getidx;
|
||||
|
||||
|
||||
PROCEDURE create* (list: LIST): LIST;
|
||||
BEGIN
|
||||
IF list = NIL THEN
|
||||
NEW(list)
|
||||
END;
|
||||
|
||||
list.first := NIL;
|
||||
list.last := NIL
|
||||
|
||||
RETURN list
|
||||
END create;
|
||||
|
||||
|
||||
END LISTS.
|
||||
@@ -1,309 +0,0 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2020, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
MODULE MSCOFF;
|
||||
|
||||
IMPORT BIN, PE32, KOS, WR := WRITER, UTILS, ERRORS, LISTS, CHL := CHUNKLISTS;
|
||||
|
||||
|
||||
CONST
|
||||
|
||||
SIZE_OF_DWORD = 4;
|
||||
|
||||
(* SectionHeader.Characteristics *)
|
||||
|
||||
SHC_flat = 040500020H;
|
||||
SHC_data = 0C0500040H;
|
||||
SHC_bss = 0C03000C0H;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
FH = PE32.IMAGE_FILE_HEADER;
|
||||
|
||||
SH = PE32.IMAGE_SECTION_HEADER;
|
||||
|
||||
|
||||
PROCEDURE WriteReloc (VirtualAddress, SymbolTableIndex, Type: INTEGER);
|
||||
BEGIN
|
||||
WR.Write32LE(VirtualAddress);
|
||||
WR.Write32LE(SymbolTableIndex);
|
||||
WR.Write16LE(Type)
|
||||
END WriteReloc;
|
||||
|
||||
|
||||
PROCEDURE Reloc (program: BIN.PROGRAM);
|
||||
VAR
|
||||
reloc: BIN.RELOC;
|
||||
offset: INTEGER;
|
||||
|
||||
BEGIN
|
||||
reloc := program.rel_list.first(BIN.RELOC);
|
||||
WHILE reloc # NIL DO
|
||||
|
||||
offset := reloc.offset;
|
||||
CASE reloc.opcode OF
|
||||
|BIN.RIMP,
|
||||
BIN.IMPTAB: WriteReloc(offset, 4, 6)
|
||||
|BIN.RBSS: WriteReloc(offset, 5, 6)
|
||||
|BIN.RDATA: WriteReloc(offset, 2, 6)
|
||||
|BIN.RCODE: WriteReloc(offset, 1, 6)
|
||||
END;
|
||||
|
||||
reloc := reloc.next(BIN.RELOC)
|
||||
END;
|
||||
END Reloc;
|
||||
|
||||
|
||||
PROCEDURE RelocCount (program: BIN.PROGRAM): INTEGER;
|
||||
VAR
|
||||
reloc: BIN.RELOC;
|
||||
iproc: BIN.IMPRT;
|
||||
res, L: INTEGER;
|
||||
offset: INTEGER;
|
||||
code: CHL.BYTELIST;
|
||||
|
||||
BEGIN
|
||||
res := 0;
|
||||
code := program.code;
|
||||
reloc := program.rel_list.first(BIN.RELOC);
|
||||
WHILE reloc # NIL DO
|
||||
|
||||
INC(res);
|
||||
offset := reloc.offset;
|
||||
|
||||
IF reloc.opcode = BIN.RIMP THEN
|
||||
L := BIN.get32le(code, offset);
|
||||
iproc := BIN.GetIProc(program, L);
|
||||
BIN.put32le(code, offset, iproc.label)
|
||||
END;
|
||||
|
||||
IF reloc.opcode = BIN.RCODE THEN
|
||||
L := BIN.get32le(code, offset);
|
||||
BIN.put32le(code, offset, BIN.GetLabel(program, L))
|
||||
END;
|
||||
|
||||
reloc := reloc.next(BIN.RELOC)
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END RelocCount;
|
||||
|
||||
|
||||
PROCEDURE write* (program: BIN.PROGRAM; FileName: ARRAY OF CHAR; ver: INTEGER);
|
||||
VAR
|
||||
exp: BIN.EXPRT;
|
||||
n, i: INTEGER;
|
||||
|
||||
szversion: PE32.NAME;
|
||||
|
||||
ImportTable: CHL.INTLIST;
|
||||
ILen, LibCount, isize: INTEGER;
|
||||
|
||||
ExpCount: INTEGER;
|
||||
|
||||
icount, ecount, dcount, ccount: INTEGER;
|
||||
|
||||
FileHeader: FH;
|
||||
|
||||
flat, data, edata, idata, bss: SH;
|
||||
|
||||
|
||||
PROCEDURE ICount (ImportTable: CHL.INTLIST; ILen: INTEGER): INTEGER;
|
||||
VAR
|
||||
i, res: INTEGER;
|
||||
|
||||
BEGIN
|
||||
res := 0;
|
||||
|
||||
FOR i := 0 TO ILen - 1 DO
|
||||
IF CHL.GetInt(ImportTable, i) # 0 THEN
|
||||
INC(res)
|
||||
END
|
||||
END
|
||||
|
||||
RETURN res
|
||||
END ICount;
|
||||
|
||||
|
||||
PROCEDURE SetNumberOfRelocations (VAR section: SH; NumberOfRelocations: INTEGER);
|
||||
BEGIN
|
||||
IF NumberOfRelocations >= 65536 THEN
|
||||
ERRORS.Error(202)
|
||||
END;
|
||||
section.NumberOfRelocations := WCHR(NumberOfRelocations)
|
||||
END SetNumberOfRelocations;
|
||||
|
||||
|
||||
BEGIN
|
||||
|
||||
szversion := "version";
|
||||
|
||||
ASSERT(LENGTH(szversion) = 7);
|
||||
|
||||
KOS.Import(program, 0, ImportTable, ILen, LibCount, isize);
|
||||
ExpCount := LISTS.count(program.exp_list);
|
||||
|
||||
icount := CHL.Length(program._import);
|
||||
dcount := CHL.Length(program.data);
|
||||
ccount := CHL.Length(program.code);
|
||||
ecount := CHL.Length(program.export);
|
||||
|
||||
FileHeader.Machine := 014CX;
|
||||
FileHeader.NumberOfSections := 5X;
|
||||
FileHeader.TimeDateStamp := UTILS.UnixTime();
|
||||
(* FileHeader.PointerToSymbolTable := 0; *)
|
||||
FileHeader.NumberOfSymbols := 6;
|
||||
FileHeader.SizeOfOptionalHeader := 0X;
|
||||
FileHeader.Characteristics := 0184X;
|
||||
|
||||
flat.Name := ".flat";
|
||||
flat.VirtualSize := 0;
|
||||
flat.VirtualAddress := 0;
|
||||
flat.SizeOfRawData := ccount;
|
||||
flat.PointerToRawData := ORD(FileHeader.NumberOfSections) * PE32.SIZE_OF_IMAGE_SECTION_HEADER + PE32.SIZE_OF_IMAGE_FILE_HEADER;
|
||||
(* flat.PointerToRelocations := 0; *)
|
||||
flat.PointerToLinenumbers := 0;
|
||||
SetNumberOfRelocations(flat, RelocCount(program));
|
||||
flat.NumberOfLinenumbers := 0X;
|
||||
flat.Characteristics := SHC_flat;
|
||||
|
||||
data.Name := ".data";
|
||||
data.VirtualSize := 0;
|
||||
data.VirtualAddress := 0;
|
||||
data.SizeOfRawData := dcount;
|
||||
data.PointerToRawData := flat.PointerToRawData + flat.SizeOfRawData;
|
||||
data.PointerToRelocations := 0;
|
||||
data.PointerToLinenumbers := 0;
|
||||
data.NumberOfRelocations := 0X;
|
||||
data.NumberOfLinenumbers := 0X;
|
||||
data.Characteristics := SHC_data;
|
||||
|
||||
edata.Name := ".edata";
|
||||
edata.VirtualSize := 0;
|
||||
edata.VirtualAddress := 0;
|
||||
edata.SizeOfRawData := ((ExpCount + 1) * 2 + 1) * SIZE_OF_DWORD + LENGTH(szversion) + 1 + ecount;
|
||||
edata.PointerToRawData := data.PointerToRawData + data.SizeOfRawData;
|
||||
(* edata.PointerToRelocations := 0; *)
|
||||
edata.PointerToLinenumbers := 0;
|
||||
SetNumberOfRelocations(edata, ExpCount * 2 + 1);
|
||||
edata.NumberOfLinenumbers := 0X;
|
||||
edata.Characteristics := SHC_data;
|
||||
|
||||
idata.Name := ".idata";
|
||||
idata.VirtualSize := 0;
|
||||
idata.VirtualAddress := 0;
|
||||
idata.SizeOfRawData := isize;
|
||||
idata.PointerToRawData := edata.PointerToRawData + edata.SizeOfRawData;
|
||||
(* idata.PointerToRelocations := 0; *)
|
||||
idata.PointerToLinenumbers := 0;
|
||||
SetNumberOfRelocations(idata, ICount(ImportTable, ILen));
|
||||
idata.NumberOfLinenumbers := 0X;
|
||||
idata.Characteristics := SHC_data;
|
||||
|
||||
bss.Name := ".bss";
|
||||
bss.VirtualSize := 0;
|
||||
bss.VirtualAddress := 0;
|
||||
bss.SizeOfRawData := program.bss;
|
||||
bss.PointerToRawData := 0;
|
||||
bss.PointerToRelocations := 0;
|
||||
bss.PointerToLinenumbers := 0;
|
||||
bss.NumberOfRelocations := 0X;
|
||||
bss.NumberOfLinenumbers := 0X;
|
||||
bss.Characteristics := SHC_bss;
|
||||
|
||||
flat.PointerToRelocations := idata.PointerToRawData + idata.SizeOfRawData;
|
||||
edata.PointerToRelocations := flat.PointerToRelocations + ORD(flat.NumberOfRelocations) * 10;
|
||||
idata.PointerToRelocations := edata.PointerToRelocations + ORD(edata.NumberOfRelocations) * 10;
|
||||
|
||||
FileHeader.PointerToSymbolTable := idata.PointerToRelocations + ORD(idata.NumberOfRelocations) * 10;
|
||||
|
||||
WR.Create(FileName);
|
||||
|
||||
PE32.WriteFileHeader(FileHeader);
|
||||
|
||||
PE32.WriteSectionHeader(flat);
|
||||
PE32.WriteSectionHeader(data);
|
||||
PE32.WriteSectionHeader(edata);
|
||||
PE32.WriteSectionHeader(idata);
|
||||
PE32.WriteSectionHeader(bss);
|
||||
|
||||
CHL.WriteToFile(program.code);
|
||||
CHL.WriteToFile(program.data);
|
||||
|
||||
exp := program.exp_list.first(BIN.EXPRT);
|
||||
WHILE exp # NIL DO
|
||||
WR.Write32LE(exp.nameoffs + edata.SizeOfRawData - ecount);
|
||||
WR.Write32LE(exp.label);
|
||||
exp := exp.next(BIN.EXPRT)
|
||||
END;
|
||||
|
||||
WR.Write32LE(((ExpCount + 1) * 2 + 1) * SIZE_OF_DWORD);
|
||||
WR.Write32LE(ver);
|
||||
|
||||
WR.Write32LE(0);
|
||||
|
||||
PE32.WriteName(szversion);
|
||||
CHL.WriteToFile(program.export);
|
||||
|
||||
FOR i := 0 TO ILen - 1 DO
|
||||
WR.Write32LE(CHL.GetInt(ImportTable, i))
|
||||
END;
|
||||
|
||||
CHL.WriteToFile(program._import);
|
||||
|
||||
Reloc(program);
|
||||
|
||||
n := 0;
|
||||
exp := program.exp_list.first(BIN.EXPRT);
|
||||
WHILE exp # NIL DO
|
||||
WriteReloc(n, 3, 6);
|
||||
INC(n, 4);
|
||||
|
||||
WriteReloc(n, 1, 6);
|
||||
INC(n, 4);
|
||||
|
||||
exp := exp.next(BIN.EXPRT)
|
||||
END;
|
||||
|
||||
WriteReloc(n, 3, 6);
|
||||
|
||||
FOR i := 0 TO LibCount * 2 - 1 DO
|
||||
WriteReloc(i * SIZE_OF_DWORD, 4, 6)
|
||||
END;
|
||||
|
||||
FOR i := LibCount * 2 TO ILen - 1 DO
|
||||
IF CHL.GetInt(ImportTable, i) # 0 THEN
|
||||
WriteReloc(i * SIZE_OF_DWORD, 4, 6)
|
||||
END
|
||||
END;
|
||||
|
||||
PE32.WriteName("EXPORTS");
|
||||
WriteReloc(0, 3, 2);
|
||||
|
||||
PE32.WriteName(".flat");
|
||||
WriteReloc(0, 1, 3);
|
||||
|
||||
PE32.WriteName(".data");
|
||||
WriteReloc(0, 2, 3);
|
||||
|
||||
PE32.WriteName(".edata");
|
||||
WriteReloc(0, 3, 3);
|
||||
|
||||
PE32.WriteName(".idata");
|
||||
WriteReloc(0, 4, 3);
|
||||
|
||||
PE32.WriteName(".bss");
|
||||
WriteReloc(0, 5, 3);
|
||||
|
||||
WR.Write32LE(4);
|
||||
|
||||
WR.Close
|
||||
END write;
|
||||
|
||||
|
||||
END MSCOFF.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user