Compare commits

..
3 Commits
Author SHA1 Message Date
rgimad 6d58d57ed6 impl calcSegmentBitLength 2025-04-08 00:22:17 +03:00
rgimad 62b3c9b8e6 impl qrcodegen_encodeBinary 2025-04-07 14:23:34 +03:00
rgimad 69ba2674ba first commit 2025-04-07 13:10:50 +03:00
3797 changed files with 739396 additions and 97058 deletions

No files matched your search

+3 -4
View File
@@ -29,7 +29,6 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0
- name: Get describe
@@ -40,7 +39,7 @@ jobs:
id: toolchain-hash
run: |
a=$(find ${{ gitea.workspace }}/programs/develop/cmm/ -type f -print0 | sort -z | xargs -0 sha1sum)
b=$(sha1sum ${{ gitea.workspace }}/programs/develop/ktcc/bin/kos32-tcc)
b=$(sha1sum ${{ gitea.workspace }}/programs/develop/ktcc/trunk/bin/kos32-tcc)
c=$(find ${{ gitea.workspace }}/programs/develop/objconv/ -type f -print0 | sort -z | xargs -0 sha1sum)
d=$(find ${{ gitea.workspace }}/programs/other/kpack/kerpack_linux/ -type f -print0 | sort -z | xargs -0 sha1sum)
e=$(find ${{ gitea.workspace }}/programs/other/kpack/linux/ -type f -print0 | sort -z | xargs -0 sha1sum)
@@ -67,7 +66,7 @@ jobs:
- name: Install TCC
if: steps.cache-toolchain.outputs.cache-hit != 'true'
run: |
cp ${{ gitea.workspace }}/programs/develop/ktcc/bin/kos32-tcc /home/autobuild/tools/win32/bin/kos32-tcc
cp ${{ gitea.workspace }}/programs/develop/ktcc/trunk/bin/kos32-tcc /home/autobuild/tools/win32/bin/kos32-tcc
chmod +x /home/autobuild/tools/win32/bin/kos32-tcc
- name: Build and install objconv
@@ -132,7 +131,7 @@ jobs:
echo "CONFIG_LANG=ru_RU" >> ru_RU.config
echo "CONFIG_BUILD_TYPE=ru_RU" >> ru_RU.config
tup variant ru_RU.config
# Configure es_ES
echo "CONFIG_LANG=es_ES" >> es_ES.config
echo "CONFIG_BUILD_TYPE=es_ES" >> es_ES.config
-3
View File
@@ -1,3 +0,0 @@
[submodule "programs/develop/oberon07"]
path = programs/develop/oberon07
url = https://github.com/AntKrotov/oberon-07-compiler.git
+4 -7
View File
@@ -1,6 +1,3 @@
; SPDX-License-Identifier: NOASSERTION
;
format coff
use32 ; Tell compiler to use 32 bit instructions
@@ -10,8 +7,8 @@ include '../../../programs/proc32.inc'
include '../../../programs/macros.inc'
purge section,mov,add,sub
include '../../../programs/develop/libraries/box_lib/box_lib.mac'
include '../../../programs/system/run/txtbut.inc'
include '../../../programs/develop/libraries/box_lib/trunk/box_lib.mac'
include '../../../programs/system/run/trunk/txtbut.inc'
include '../../../programs/dll.inc'
public init_boxlib as '_kolibri_boxlib_init'
@@ -162,8 +159,8 @@ public path_show_draw as '_path_show_draw'
public fb_draw_panel as '_filebrowse_draw'
public fb_mouse as '_filebrowse_mouse'
public fb_key as '_filebrowse_key'
public fb_key as '_filebrowse_key'
public ted_but_sumb_upper as '_ted_but_sumb_upper'
public ted_but_sumb_lover as '_ted_but_sumb_lover'
public ted_but_convert_by_table as '_ted_but_convert_by_table'
+2 -2
View File
@@ -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 , 'ini_get_color' , \
LIBINI_get_shortcut , 'ini_get_shortcut' , \
LIBINI_get_color , 'int_get_color' , \
LIBINI_get_shortcut , 'int_get_shortcut' , \
LIBINI_set_str , 'ini_set_str' , \
LIBINI_set_int , 'ini_set_int' , \
LIBINI_set_color , 'ini_set_color'
+152 -153
View File
@@ -1,153 +1,152 @@
// BOXLIB example (scrollbar, progressbar)
// ! without kolibri_gui !
// Writed by maxcodehack
// TCC version is in /programs/develop/ktcc/libc.obj/samples/clayer/boxlib.c
#include <kos32sys.h>
#include <stdlib.h>
/// BOXLIB
// Modified from C_Layer
// C_Layer variant I don't like
extern int kolibri_boxlib_init(void);
typedef struct __attribute__ ((__packed__)) {
uint16_t xsize;
uint16_t xpos;
uint16_t ysize;
uint16_t ypos;
uint32_t btn_height;
uint32_t type;
uint32_t max_area;
uint32_t cur_area;
uint32_t position;
uint32_t back_color;
uint32_t front_color;
uint32_t line_color;
uint32_t redraw;
uint16_t delta;
uint16_t delta2;
uint16_t r_size_x;
uint16_t r_start_x;
uint16_t r_size_y;
uint16_t r_start_y;
uint32_t m_pos;
uint32_t m_pos2;
uint32_t m_keys;
uint32_t run_size;
uint32_t position2;
uint32_t work_size;
uint32_t all_redraw;
uint32_t ar_offset;
} scrollbar;
extern void (*scrollbar_h_draw)(scrollbar*) __attribute__((__stdcall__));
extern void (*scrollbar_h_mouse)(scrollbar*) __attribute__((__stdcall__));
extern void (*scrollbar_v_draw)(scrollbar*) __attribute__((__stdcall__));
extern void (*scrollbar_v_mouse)(scrollbar*) __attribute__((__stdcall__));
typedef struct {
unsigned int value;
unsigned int left;
unsigned int top;
unsigned int width;
unsigned int height;
unsigned int style;
unsigned int min;
unsigned int max;
unsigned int back_color;
unsigned int progress_color;
unsigned int frame_color;
} progressbar;
extern void (*progressbar_draw)(progressbar *) __attribute__((__stdcall__));
extern void (*progressbar_progress)(progressbar *) __attribute__((__stdcall__));
/// BOXLIB
#define evReDraw 1
#define evKey 2
#define evButton 3
#define evExit 4
#define evDesktop 5
#define evMouse 6
#define evIPC 7
#define evNetwork 8
#define evDebug 9
#define WIN_W 640
#define WIN_H 563
uint32_t wheels;
char* title = "Boxlib example";
int win_bg_color = 0x858585;
scrollbar scroll = {15, WIN_W - 26, WIN_H - 29, 0, 0, 2, 215, 15, 0,0x707070,0xD2CED0,0x555555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
progressbar pg = {0, 10, 10, 270, 35, 1, 0, 200, 0xB4B4B4, 0x2728FF, 0xA9A9A9};
void draw_window(){
BeginDraw();
DrawWindow(215,100,WIN_W,WIN_H,title,win_bg_color,0x34);
scrollbar_v_draw(&scroll);
progressbar_draw(&pg);
EndDraw();
}
//// EVENTMASK
#define EVM_REDRAW 1
#define EVM_KEY 2
#define EVM_BUTTON 4
#define EVM_EXIT 8
#define EVM_BACKGROUND 16
#define EVM_MOUSE 32
#define EVM_IPC 64
#define EVM_STACK 128
#define EVM_DEBUG 256
#define EVM_STACK2 512
#define EVM_MOUSE_FILTER 0x80000000
#define EVM_CURSOR_FILTER 0x40000000
//// EVENTMASK
int main()
{
kolibri_boxlib_init();
set_wanted_events_mask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER);
while(1)
{
switch(GetOsEvent())
{
case evButton:
if (get_os_button() == 1) exit(0);
break;
case evKey:
get_key();
break;
case evReDraw:
draw_window();
break;
case evMouse:
scrollbar_v_mouse(&scroll);
// Wheel scrolling
// Quite unstable
/*
int scroll_strong = 40;
wheels = GetMouseWheels();
if(wheels & 0xFFFF)
{
if((short)wheels > 0 && scroll.position < scroll.max_area - scroll_strong)
scroll.position += scroll_strong;
else if((short)wheels < 0 && scroll.position > 0)
scroll.position -= scroll_strong;
scrollbar_v_draw(&scroll);
}
*/
pg.value = scroll.position;
progressbar_draw(&pg);
break;
}
}
}
// BOXLIB example (scrollbar, progressbar)
// ! without kolibri_gui !
// Writed by maxcodehack
// TCC version is in /programs/develop/ktcc/trunk/samples
#include <kos32sys.h>
#include <stdlib.h>
/// BOXLIB
// Modified from C_Layer
// C_Layer variant I don't like
extern int kolibri_boxlib_init(void);
typedef struct __attribute__ ((__packed__)) {
uint16_t xsize;
uint16_t xpos;
uint16_t ysize;
uint16_t ypos;
uint32_t btn_height;
uint32_t type;
uint32_t max_area;
uint32_t cur_area;
uint32_t position;
uint32_t back_color;
uint32_t front_color;
uint32_t line_color;
uint32_t redraw;
uint16_t delta;
uint16_t delta2;
uint16_t r_size_x;
uint16_t r_start_x;
uint16_t r_size_y;
uint16_t r_start_y;
uint32_t m_pos;
uint32_t m_pos2;
uint32_t m_keys;
uint32_t run_size;
uint32_t position2;
uint32_t work_size;
uint32_t all_redraw;
uint32_t ar_offset;
} scrollbar;
extern void (*scrollbar_h_draw)(scrollbar*) __attribute__((__stdcall__));
extern void (*scrollbar_h_mouse)(scrollbar*) __attribute__((__stdcall__));
extern void (*scrollbar_v_draw)(scrollbar*) __attribute__((__stdcall__));
extern void (*scrollbar_v_mouse)(scrollbar*) __attribute__((__stdcall__));
typedef struct {
unsigned int value;
unsigned int left;
unsigned int top;
unsigned int width;
unsigned int height;
unsigned int style;
unsigned int min;
unsigned int max;
unsigned int back_color;
unsigned int progress_color;
unsigned int frame_color;
} progressbar;
extern void (*progressbar_draw)(progressbar *) __attribute__((__stdcall__));
extern void (*progressbar_progress)(progressbar *) __attribute__((__stdcall__));
/// BOXLIB
#define evReDraw 1
#define evKey 2
#define evButton 3
#define evExit 4
#define evDesktop 5
#define evMouse 6
#define evIPC 7
#define evNetwork 8
#define evDebug 9
#define WIN_W 640
#define WIN_H 563
uint32_t wheels;
char* title = "Boxlib example";
int win_bg_color = 0x858585;
scrollbar scroll = {15, WIN_W - 26, WIN_H - 29, 0, 0, 2, 215, 15, 0,0x707070,0xD2CED0,0x555555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
progressbar pg = {0, 10, 10, 270, 35, 1, 0, 200, 0xB4B4B4, 0x2728FF, 0xA9A9A9};
void draw_window(){
BeginDraw();
DrawWindow(215,100,WIN_W,WIN_H,title,win_bg_color,0x34);
scrollbar_v_draw(&scroll);
progressbar_draw(&pg);
EndDraw();
}
//// EVENTMASK
#define EVM_REDRAW 1
#define EVM_KEY 2
#define EVM_BUTTON 4
#define EVM_EXIT 8
#define EVM_BACKGROUND 16
#define EVM_MOUSE 32
#define EVM_IPC 64
#define EVM_STACK 128
#define EVM_DEBUG 256
#define EVM_STACK2 512
#define EVM_MOUSE_FILTER 0x80000000
#define EVM_CURSOR_FILTER 0x40000000
//// EVENTMASK
int main()
{
kolibri_boxlib_init();
set_wanted_events_mask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER);
while(1)
{
switch(GetOsEvent())
{
case evButton:
if (get_os_button() == 1) exit(0);
break;
case evKey:
get_key();
break;
case evReDraw:
draw_window();
break;
case evMouse:
scrollbar_v_mouse(&scroll);
// Wheel scrolling
// Quite unstable
/*
int scroll_strong = 40;
wheels = GetMouseWheels();
if(wheels & 0xFFFF)
{
if((short)wheels > 0 && scroll.position < scroll.max_area - scroll_strong)
scroll.position += scroll_strong;
else if((short)wheels < 0 && scroll.position > 0)
scroll.position -= scroll_strong;
scrollbar_v_draw(&scroll);
}
*/
pg.value = scroll.position;
progressbar_draw(&pg);
break;
}
}
}
@@ -864,7 +864,7 @@ void ff_set_mpeg4_time(MpegEncContext * s){
}
static void mpeg4_encode_gop_header(MpegEncContext * s){
int64_t hours, minutes, seconds;
int hours, minutes, seconds;
int64_t time;
put_bits(&s->pb, 16, 0);
@@ -2035,13 +2035,8 @@ 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,10 +2580,8 @@ 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 or invalid chunk size
c->chunk_size = 0;
if (c->chunk_size == 0) // end of stream
goto fail;
}
c->buffer_ptr = c->buffer;
break;
} else if (++loop_run > 10)
@@ -2605,7 +2603,6 @@ 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,12 +267,8 @@ static int cine_read_header(AVFormatContext *avctx)
/* parse image offsets */
avio_seek(pb, offImageOffsets, SEEK_SET);
for (i = 0; i < st->duration; i++) {
if (avio_feof(pb))
return AVERROR_INVALIDDATA;
for (i = 0; i < st->duration; i++)
av_add_index_entry(st, avio_rl64(pb), i, 0, 0, AVINDEX_KEYFRAME);
}
return 0;
}
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -5,7 +5,7 @@ diamond'ом. Она используется в проектах xonix и fara
Kolibri-программу. Утилита всего лишь изменяет формат exe-шника, так что,
чтобы действительно получилась работающая программа, нужно выполнение
определённых условий. Понятно, что требуется, чтобы программа общалась
с внешним миром средствами КолибриОС (т.е. int 0x40) и не использовала
с внешним миром средствами Колибри (т.е. int 0x40) и не использовала
никаких Windows-библиотек. Помимо этого, требуется также, чтобы программа
размещалась по нулевому адресу (ключ линкера "/base:0"). Как писать такие
программы - смотрите в уже упомянутых проектах xonix и fara.
+1034 -1047
View File
File diff suppressed because it is too large. Load diff
+1 -2
View File
@@ -1,4 +1,4 @@
[icons18]
[icons16]
<dir>=0
<up>=1
<lot>=20
@@ -162,7 +162,6 @@ min=23
nes=23
sna=23
snes=23
rom=23
bat=24
sh=24
sys=25
-1
View File
@@ -68,7 +68,6 @@ 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
Binary file not shown.
File renamed without changes.
-5
View File
@@ -22,8 +22,3 @@ ToggleBar=Tab
path=/usbhd0/1/kolibri.img
autoclose=0
[WebView]
proxy_address=http://proxy.kolibrios.org:82/?site=
search_engine=http://wiby.me/?q=
;search_engine=http://bing.com/search?q=
;search_engine=https://html.duckduckgo.com/html/?q=
+1
View File
@@ -29,6 +29,7 @@ Dicty=/k/utils/DICTY.KEX,79
fNav=/k/utils/fNav/fNav,93
CncEditor=/k/utils/cnc_editor/cnc_editor,15
Life=/k/demos/life2,13
Calc+=/k/utils/calcplus,4
TinyBasic=/k/develop/TinyBasic/TinyBasic,91
THashView=/k/utils/thashview,124
Notes=/k/utils/notes,117
+2 -3
View File
@@ -190,9 +190,8 @@ gbc=/kolibrios/emul/gameboy
min=/kolibrios/emul/pokemini
nc=/kolibrios/utils/cnc_editor/cnc_editor
ch8=/kolibrios/emul/chip8/chip8
md=/kolibrios/emul/dgen/dgen_open
gen=/kolibrios/emul/dgen/dgen_open
rom=/kolibrios/emul/uxn
md=/kolibrios/emul/dgen/dgen
gen=/kolibrios/emul/dgen/dgen
zip=$Unz
7z=$Unz
+2 -2
View File
@@ -235,8 +235,8 @@ ico=58
x=68
y=68
[21]
name=CALC+
path=CALCPLUS
name=CALC
path=CALC
param=
ico=4
x=204
-1
View File
@@ -92,7 +92,6 @@
59 Screen keyboard |zkey
#10 **** DATA PROCESSING
16 Calculator |calc
16 Calculator+ |calcplus
03 Tinypad |tinypad
28 CodeEdit |develop/cedit
21 Table processor |table
+2 -2
View File
@@ -235,8 +235,8 @@ ico=58
x=68
y=68
[21]
name=CALC+
path=CALCPLUS
name=CALC
path=CALC
param=
ico=4
x=204
-1
View File
@@ -96,7 +96,6 @@
24 NDN * |/kolibrios/utils/ndn/ndn
#11 **** PROCESO DE DATOS
16 Calculadora |calc
16 Calculadora+ |calcplus
16 Tinypad |tinypad
16 CodeEdit |develop/cedit
16 Procesador de tablas |table
+2 -2
View File
@@ -235,8 +235,8 @@ ico=58
x=68
y=68
[21]
name=CALC+
path=CALCPLUS
name=CALC
path=CALC
param=
ico=4
x=204
-1
View File
@@ -80,7 +80,6 @@
65 NDN * |/kolibrios/utils/ndn/ndn
#11 **** DATA PROCESSING ****
16 Kalkulaator |calc
16 Kalkulaator+ |calcplus
16 Teksti redaktor |tinypad
16 CodeEdit |develop/cedit
16 Tabelarvutus |table
+2 -2
View File
@@ -235,8 +235,8 @@ ico=58
x=68
y=68
[21]
name=CALC+
path=CALCPLUS
name=CALC
path=CALC
param=
ico=4
x=204
-1
View File
@@ -79,7 +79,6 @@
65 NDN * |/kolibrios/utils/ndn/ndn
#11 **** DATA PROCESSING
16 Calcolatrice |calc
16 Calcolatrice+ |calcplus
16 Tinypad |tinypad
16 CodeEdit |develop/cedit
16 Table Processor |table
+14 -14
View File
@@ -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">&lt; Назад</a>
<b>Какие есть варианты загрузки КолибриОС?</b>
<b>Какие есть варианты загрузки Колибри?</b>
С флешки, жесткого диска, CD, дискеты. Смотрите папку /HD_Load в скачанном дистрибутиве.
При загрузке с флешки иногда может требоваться использование setmbr.exe, иногда нет. Вначале попробуйте загрузится без него, если не получится, то с ним.
@@ -27,7 +27,7 @@
2. Поменять настройки в BIOS: зайти в раздел с жесткими дисками и выставить режим совместимости с IDE или что-то похожее. (После всех эксперименов не забудьте поменять все обратно!)
3. Воспользоваться драйвером ACHI. Для этого зайдите в SYSPANEL &gt; <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>
Портированы:
&bull; Компилятор 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 — Диапазонные регистры
&bull; Использовать PS/2 мышь...
&bull; Купить 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>
+2 -2
View File
@@ -235,8 +235,8 @@ ico=58
x=68
y=68
[21]
name=CALC+
path=CALCPLUS
name=CALC
path=CALC
param=
ico=4
x=204
-1
View File
@@ -90,7 +90,6 @@
59 Экранная клавиатура |zkey
#10 **** Офис
16 Калькулятор |calc
16 Калькулятор+ |calcplus
03 Редактор Tinypad |tinypad
28 Редактор CodeEdit |develop/cedit
21 Табличный процессор |table
+1 -1
View File
@@ -1,7 +1,7 @@
KTCC=kos32-tcc
KPACK = kpack
KLIBC = ../../../programs/develop/ktcc/libc.obj
KLIBC = ../../../programs/develop/ktcc/trunk/libc.obj
CFLAGS = -I $(KLIBC)/include
LDFLAGS = -nostdlib -L$(KLIBC)/lib $(KLIBC)/lib/crt0.o
@@ -1,3 +1,3 @@
if tup.getconfig("NO_FASM") ~= "" then return end
ROOT = "../../.."
ROOT = "../../../.."
tup.rule("ps2mouse.asm", "fasm %f %o " .. tup.getconfig("PESTRIP_CMD") .. tup.getconfig("KPACK_CMD"), "%B.sys")
@@ -1,279 +1,276 @@
; SPDX-License-Identifier: NOASSERTION
;
; standard driver stuff; version of driver model = 5
format PE DLL native 0.05
DEBUG equ 1
MT_3B equ 0
MT_3BScroll equ 3
MT_5BScroll equ 4
PS2_DRV_VER equ 1
section '.flat' code readable writable executable
data fixups
end data
include '../../struct.inc'
include '../../macros.inc'
include '../../proc32.inc'
include '../../peimport.inc'
entry START
proc START c, state:dword, cmdline:dword
cmp [state], DRV_ENTRY
je .init
cmp [state], DRV_EXIT
je .fini
jmp .nothing
.init:
; disable keyboard and mouse interrupts
; keyboard IRQ handler can interfere badly otherwise
pushf
cli
mov bl, 0x20 ; read command byte
call kbd_cmd
test ah,ah
jnz .fin
call kbd_read
test ah,ah
jnz .fin
popf
and al, 0xFC ; disable interrupts
or al, 0x10 ; disable keyboard
push eax
mov bl, 0x60 ; write command byte
call kbd_cmd
pop eax
call kbd_write
call detect_mouse
test eax,eax
jnz .exit
mov [MouseType],MT_3B
call try_mode_ID3
test eax,eax
jnz .stop_try
mov [MouseType],MT_3BScroll
call try_mode_ID4
test eax,eax
jnz .stop_try
mov [MouseType],MT_5BScroll
.stop_try:
mov al, 0xF4 ; enable data reporting
call mouse_cmd
; enable keyboard and mouse interrupts
mov bl, 0x20 ; read command byte
call kbd_cmd
call kbd_read
or al, 3 ; enable interrupts
and al, not 0x10 ; enable keyboard
push eax
mov bl, 0x60 ; write command byte
call kbd_cmd
pop eax
call kbd_write
invoke AttachIntHandler, 12, irq_handler, 0
invoke RegService, my_service, service_proc
ret
.fin:
popf
;invoke DetachIntHandler, 12, irq_handler
mov bl, 0xA7 ; disable mouse interface
call kbd_cmd
.nothing:
xor eax, eax
ret
.fini:
mov al, 0xF5
call mouse_cmd
ret
.exit:
mov bl, 0xA7 ; disable mouse interface
call kbd_cmd
; enable keyboard interrupt, leave mouse interrupt disabled
mov bl, 0x20 ; read command byte
call kbd_cmd
call kbd_read
or al, 1 ; enable keyboard interrupt
and al, not 0x10 ; enable keyboard
push eax
mov bl, 0x60 ; write command byte
call kbd_cmd
pop eax
call kbd_write
xor eax, eax
ret
endp
proc service_proc stdcall, ioctl:dword
mov edi, [ioctl]
mov eax, [edi+IOCTL.io_code]
test eax, eax
jz .getversion
cmp eax,1
jz .gettype
.err:
or eax, -1
ret
.ok:
xor eax, eax
ret
.getversion:
cmp [edi+IOCTL.out_size], 4
jb .err
mov edi, [edi+IOCTL.output]
mov dword [edi], PS2_DRV_VER ; version of driver
jmp .ok
.gettype:
cmp [edi+IOCTL.out_size], 4
jb .err
mov edi, [edi+IOCTL.output]
mov eax,[MouseType]
mov dword [edi], eax ; mouse type
jmp .ok
endp
detect_mouse:
mov bl, 0xA8 ; enable mouse interface
call kbd_cmd
cmp ah,1
je .fail
mov al, 0xFF ; reset
call mouse_cmd
jc .fail
call mouse_read
jc .fail
cmp al, 0xAA
jne .fail ; dead mouse
; get device ID
call mouse_read
jc .fail
cmp al, 0x00
jne .fail ; unknown device
xor eax,eax
ret
.fail:
or eax,-1
ret
try_mode_ID3:
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0xC8 ;200d
call mouse_cmd
jc .fail
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0x64 ;100d
call mouse_cmd
jc .fail
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0x50 ;80d
call mouse_cmd
jc .fail
mov al, 0xF2 ;Get device id
call mouse_cmd
jc .fail
call mouse_read
jc .fail
cmp al, 0x03
jne .fail
xor eax,eax
ret
.fail:
or eax,-1
ret
try_mode_ID4:
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0xC8 ;200d
call mouse_cmd
jc .fail
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0xC8 ;100d
call mouse_cmd
jc .fail
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0x50 ;80d
call mouse_cmd
jc .fail
mov al, 0xF2 ;Get device id
call mouse_cmd
jc .fail
call mouse_read
jc .fail
cmp al, 0x04
jne .fail
xor eax,eax
ret
.fail:
or eax,-1
ret
include 'ps2m_iofuncs.inc'
include 'ps2m_irqh.inc'
my_service db 'ps2mouse',0
;iofuncs data
mouse_cmd_byte db 0
mouse_nr_tries db 0
mouse_nr_resends db 0
;hid data
mouse_byte dd 0
first_byte db 0
second_byte db 0
third_byte db 0
fourth_byte db 0
;main data
MouseType dd 0
XMoving dd 0
YMoving dd 0
ZMoving dd 0
ButtonState dd 0
;timerTicks dd 0
; standard driver stuff; version of driver model = 5
format PE DLL native 0.05
DEBUG equ 1
MT_3B equ 0
MT_3BScroll equ 3
MT_5BScroll equ 4
PS2_DRV_VER equ 1
section '.flat' code readable writable executable
data fixups
end data
include '../../../struct.inc'
include '../../../macros.inc'
include '../../../proc32.inc'
include '../../../peimport.inc'
entry START
proc START c, state:dword, cmdline:dword
cmp [state], DRV_ENTRY
je .init
cmp [state], DRV_EXIT
je .fini
jmp .nothing
.init:
; disable keyboard and mouse interrupts
; keyboard IRQ handler can interfere badly otherwise
pushf
cli
mov bl, 0x20 ; read command byte
call kbd_cmd
test ah,ah
jnz .fin
call kbd_read
test ah,ah
jnz .fin
popf
and al, 0xFC ; disable interrupts
or al, 0x10 ; disable keyboard
push eax
mov bl, 0x60 ; write command byte
call kbd_cmd
pop eax
call kbd_write
call detect_mouse
test eax,eax
jnz .exit
mov [MouseType],MT_3B
call try_mode_ID3
test eax,eax
jnz .stop_try
mov [MouseType],MT_3BScroll
call try_mode_ID4
test eax,eax
jnz .stop_try
mov [MouseType],MT_5BScroll
.stop_try:
mov al, 0xF4 ; enable data reporting
call mouse_cmd
; enable keyboard and mouse interrupts
mov bl, 0x20 ; read command byte
call kbd_cmd
call kbd_read
or al, 3 ; enable interrupts
and al, not 0x10 ; enable keyboard
push eax
mov bl, 0x60 ; write command byte
call kbd_cmd
pop eax
call kbd_write
invoke AttachIntHandler, 12, irq_handler, 0
invoke RegService, my_service, service_proc
ret
.fin:
popf
;invoke DetachIntHandler, 12, irq_handler
mov bl, 0xA7 ; disable mouse interface
call kbd_cmd
.nothing:
xor eax, eax
ret
.fini:
mov al, 0xF5
call mouse_cmd
ret
.exit:
mov bl, 0xA7 ; disable mouse interface
call kbd_cmd
; enable keyboard interrupt, leave mouse interrupt disabled
mov bl, 0x20 ; read command byte
call kbd_cmd
call kbd_read
or al, 1 ; enable keyboard interrupt
and al, not 0x10 ; enable keyboard
push eax
mov bl, 0x60 ; write command byte
call kbd_cmd
pop eax
call kbd_write
xor eax, eax
ret
endp
proc service_proc stdcall, ioctl:dword
mov edi, [ioctl]
mov eax, [edi+IOCTL.io_code]
test eax, eax
jz .getversion
cmp eax,1
jz .gettype
.err:
or eax, -1
ret
.ok:
xor eax, eax
ret
.getversion:
cmp [edi+IOCTL.out_size], 4
jb .err
mov edi, [edi+IOCTL.output]
mov dword [edi], PS2_DRV_VER ; version of driver
jmp .ok
.gettype:
cmp [edi+IOCTL.out_size], 4
jb .err
mov edi, [edi+IOCTL.output]
mov eax,[MouseType]
mov dword [edi], eax ; mouse type
jmp .ok
endp
detect_mouse:
mov bl, 0xA8 ; enable mouse interface
call kbd_cmd
cmp ah,1
je .fail
mov al, 0xFF ; reset
call mouse_cmd
jc .fail
call mouse_read
jc .fail
cmp al, 0xAA
jne .fail ; dead mouse
; get device ID
call mouse_read
jc .fail
cmp al, 0x00
jne .fail ; unknown device
xor eax,eax
ret
.fail:
or eax,-1
ret
try_mode_ID3:
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0xC8 ;200d
call mouse_cmd
jc .fail
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0x64 ;100d
call mouse_cmd
jc .fail
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0x50 ;80d
call mouse_cmd
jc .fail
mov al, 0xF2 ;Get device id
call mouse_cmd
jc .fail
call mouse_read
jc .fail
cmp al, 0x03
jne .fail
xor eax,eax
ret
.fail:
or eax,-1
ret
try_mode_ID4:
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0xC8 ;200d
call mouse_cmd
jc .fail
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0xC8 ;100d
call mouse_cmd
jc .fail
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0x50 ;80d
call mouse_cmd
jc .fail
mov al, 0xF2 ;Get device id
call mouse_cmd
jc .fail
call mouse_read
jc .fail
cmp al, 0x04
jne .fail
xor eax,eax
ret
.fail:
or eax,-1
ret
include 'ps2m_iofuncs.inc'
include 'ps2m_irqh.inc'
my_service db 'ps2mouse',0
;iofuncs data
mouse_cmd_byte db 0
mouse_nr_tries db 0
mouse_nr_resends db 0
;hid data
mouse_byte dd 0
first_byte db 0
second_byte db 0
third_byte db 0
fourth_byte db 0
;main data
MouseType dd 0
XMoving dd 0
YMoving dd 0
ZMoving dd 0
ButtonState dd 0
;timerTicks dd 0
+4 -34
View File
@@ -1,5 +1,3 @@
SERIAL_COMPATIBLE_API_VER = 0 ; increments in case of breaking changes
SERIAL_API_GET_VERSION = 0
SERIAL_API_SRV_ADD_PORT = 1
SERIAL_API_SRV_REMOVE_PORT = 2
@@ -23,18 +21,14 @@ SERIAL_CONF_PARITY_ODD = 2
SERIAL_CONF_PARITY_MARK = 3
SERIAL_CONF_PARITY_SPACE = 4
SERIAL_CONF_STOP_BITS_1 = 0
SERIAL_CONF_STOP_BITS_1_5 = 1
SERIAL_CONF_STOP_BITS_2 = 2
SERIAL_CONF_FLOW_CTRL_NONE = 0
struct SP_DRIVER
size dd ? ; size of this struct
startup dd ? ; int __stdcall (*startup)(void *drv_data, const struct serial_conf *conf);
shutdown dd ? ; int __stdcall (*shutdown)(void *drv_data);
reconf dd ? ; int __stdcall (*reconf)(void *drv_data, const struct serial_conf *conf);
tx dd ? ; int __stdcall (*tx)(void *drv_data);
startup dd ? ; void __stdcall (*startup)(void *drv_data, const struct serial_conf *conf);
shutdown dd ? ; void __stdcall (*shutdown)(void *drv_data);
reconf dd ? ; void __stdcall (*reconf)(void *drv_data, const struct serial_conf *conf);
tx dd ? ; void __stdcall (*tx)(void *drv_data);
ends
struct SP_CONF
@@ -129,30 +123,6 @@ proc serial_port_init
ret
endp
proc serial_port_get_version stdcall, version:dword
locals
.handler dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
endl
mov eax, [serial_drv_handle]
mov [.handler], eax
mov dword [.io_code], SERIAL_API_GET_VERSION
mov [.input], 0
mov dword [.inp_size], 0
mov eax, [version]
mov [.output], eax
mov dword [.out_size], 4
lea ecx, [.handler]
mcall SF_SYS_MISC, SSF_CONTROL_DRIVER
ret
endp
proc serial_port_open stdcall uses ebx, port_id:dword, conf:dword, handle:dword
locals
.handler dd ?
+11 -8
View File
@@ -9,6 +9,8 @@ __DEBUG_LEVEL__ = L_DBG
SERIAL_RING_BUF_SIZE = 32768
API_VERSION = 1
section '.flat' readable writable executable
include '../struct.inc'
@@ -21,9 +23,6 @@ include 'common.inc'
include 'ring_buf.inc'
include 'uart16550.inc'
CURRENT_API = 0x0001
API_VERSION = (SERIAL_COMPATIBLE_API_VER shl 16) + CURRENT_API
struct SERIAL_OBJ
magic dd ?
destroy dd ?
@@ -46,7 +45,7 @@ struct SERIAL_PORT
conf SP_CONF
ends
proc START c, reason:dword, cmdline:dword
proc START c, reason:dword
cmp [reason], DRV_ENTRY
jne .fail
@@ -348,12 +347,15 @@ proc sp_validate_conf
mov eax, [ecx + SP_CONF.baudrate]
test eax, eax
jz .fail
mov al, [ecx + SP_CONF.word_size]
cmp al, 8
jne .fail ; TODO implement different word size
mov al, [ecx + SP_CONF.stop_bits]
cmp al, SERIAL_CONF_STOP_BITS_2
ja .fail
cmp al, 1
jne .fail ; TODO implement different stop bits count
mov al, [ecx + SP_CONF.parity]
cmp al, SERIAL_CONF_PARITY_SPACE
ja .fail
cmp al, SERIAL_CONF_PARITY_NONE
jne .fail ; TODO implement parity
mov al, [ecx + SP_CONF.flow_ctrl]
cmp al, SERIAL_CONF_FLOW_CTRL_NONE
jne .fail ; TODO implement flow control
@@ -548,6 +550,7 @@ proc sp_setup
mov eax, [edi + SERIAL_PORT.drv]
mov ecx, [edi + SERIAL_PORT.drv_data]
stdcall dword [eax + SP_DRIVER.reconf], ecx, esi
xor eax, eax
push eax
test eax, eax
jnz @f
+2 -2
View File
@@ -350,10 +350,10 @@ endl
; calc stop bits
mov bx, LCR_STOP_1
mov al, [esi + SP_CONF.stop_bits]
cmp al, SERIAL_CONF_STOP_BITS_1
cmp al, 1
je .stop_bits_ok
or bx, LCR_STOP_2
cmp al, SERIAL_CONF_STOP_BITS_2
cmp al, 2
jne .fail
.stop_bits_ok:
or [lcr], bx
+17 -80
View File
@@ -1123,53 +1123,11 @@ proc uart_shutdown stdcall uses ebx, data:dword
ret
endp
proc uart_reconf stdcall uses esi, dev:dword, conf:dword
locals
ConfPacket rb 8
endl
proc uart_reconf stdcall uses ebx esi, dev:dword, conf:dword
mov ebx, [dev]
mov esi, [conf]
xor edx, edx
mov al, [esi + SP_CONF.word_size]
cmp al, 7
jb .invalid
cmp al, 8
ja .invalid
mov dl, al
; odd and even parities are different from serial api
; serial api: even=1 odd=2
; ft232x api: odd=1 even=2
movzx eax, [esi + SP_CONF.parity]
cmp al, SERIAL_CONF_PARITY_SPACE
ja .invalid
cmp al, SERIAL_CONF_PARITY_ODD
ja .parity_ok
cmp al, SERIAL_CONF_PARITY_EVEN
jb .parity_ok
; swap bits
xor al, 0x3
.parity_ok:
shl eax, 8 ; parity offset
or edx, eax
movzx eax, [esi + SP_CONF.stop_bits]
cmp al, SERIAL_CONF_STOP_BITS_2
ja .invalid
shl eax, 11 ; stop bits offset
or edx, eax
mov word [ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
+ (SIO_SET_DATA shl 8)
mov word [ConfPacket + 2], dx
mov word [ConfPacket + 4], 0
mov word [ConfPacket + 6], 0
lea edx, [ConfPacket]
stdcall ftdi_blocking_ctrl_tranfser, [dev], edx
test eax, eax
jnz .exit
stdcall ftdi_set_baudrate, [dev], [esi + SP_CONF.baudrate]
ret
.invalid:
or eax, -1
.exit:
stdcall ftdi_set_baudrate, ebx, [esi + SP_CONF.baudrate]
; TODO set word_size, parity, etc.
ret
endp
@@ -1246,10 +1204,17 @@ proc uart_rx stdcall uses ebx esi, data:dword
ret
endp
proc ftdi_set_baudrate stdcall uses ebx, dev:dword, baud:dword
proc ftdi_set_baudrate stdcall uses ebx esi edi, dev:dword, baud:dword
locals
ConfPacket rb 8
ConfPacket rb 10
EventData rd 3
endl
xor esi, esi
xor ecx, ecx
invoke CreateEvent
mov [EventData], eax
mov [EventData + 4], edx
mov ebx, [dev]
cmp [ebx + ftdi_context.chipType], TYPE_2232H
jl .c_clk
@@ -1292,7 +1257,7 @@ endl
jmp .calcend
.c_nextbaud2:
cmp dword [baud], C_CLK / (2 * 16)
cmp dword [edi + 8], C_CLK / (2 * 16)
jl .c_nextbaud3
mov edx, 2
mov ecx, C_CLK / (2 * 16)
@@ -1383,51 +1348,23 @@ endl
mov word [ConfPacket + 4], cx
mov word [ConfPacket + 6], 0
lea ebx, [ConfPacket]
stdcall ftdi_blocking_ctrl_tranfser, [dev], ebx
ret
endp
proc ftdi_blocking_ctrl_tranfser stdcall uses ebx esi edi, dev:dword, conf:dword
; conf is a pointer to values: bmRequestType, bRequest, wValue, wIndex, wLength
locals
EventData rd 3
endl
xor esi, esi
xor ecx, ecx
invoke CreateEvent
test eax, eax
jz .exit
mov [EventData], eax
mov [EventData + 4], edx
mov eax, [dev]
mov esi, [conf]
lea esi, [ConfPacket]
lea edi, [EventData]
invoke USBControlTransferAsync, [eax + ftdi_context.nullP], esi, 0,\
invoke USBControlTransferAsync, [ebx + ftdi_context.nullP], esi, 0,\
0, control_callback, edi, 0
test eax, eax
jz .error
mov eax, [EventData]
mov ebx, [EventData + 4]
invoke WaitEvent
cmp [EventData + 8], 0 ; USB_STATUS_OK
jne .error
mov eax, [EventData]
mov ebx, [EventData + 4]
invoke DestroyEvent
xor eax, eax
ret
.error:
mov eax, [EventData]
mov ebx, [EventData + 4]
invoke DestroyEvent
.exit:
.error:
or eax, -1
ret
endp
-4
View File
@@ -1,4 +0,0 @@
if tup.getconfig("NO_FASM") ~= "" then return end
ROOT = "../../.."
tup.rule("usbother.asm", "fasm %f %o " .. tup.getconfig("PESTRIP_CMD") .. tup.getconfig("KPACK_CMD"), "%B.sys")
tup.rule("usbdrv.asm", "fasm %f %o ", "%B.dat")
-214
View File
@@ -1,214 +0,0 @@
;*****************************************************************************;
; Copyright (C) 2025, Mikhail Frolov aka Doczom . All rights reserved. ;
; Distributed under terms of the 3-Clause BSD License. ;
;*****************************************************************************;
; File of usb drivers
; base = 0
; offset | Size | Name | Description
;=======================|=======|===============|=============================
; base + 0 | 4 | ID_drv_table | offset to dev_ven drv array
; base + 4 | 4 | Class_table | offset to class drv array
;
; n = 0 .. count driver with ID table
; nt = count driver with ID table
; ID_drv_table + 0*(n-1)| 4 | ID_TABLE | offset from base to table VID:PID
; ID_drv_table + 4*(n-1)| 4 | DRV_NAME | offset from base to name of driver
; ID_drv_table + 8*nt | 8 | __ZERO | terminaror of list
; k = 0 .. count driver on class code
; kt = count driver on class code
; Class_table + 0*(k-1) | 1 | LENGTH_CLASS | length of class code 1..3
; Class_table + 1*(k-1) | 1 | USB_CLASS | main usb class code (M)
; Class_table + 2*(k-1) | 1 | USB_SUBCLASS | USB subclass code or zero(V)
; Class_table + 2*(k-1) | 1 | USB_PROTOCOL | USB protocol code or zero(V)
; Class_table + 4*(k-1) | 4 | DRV_NAME | offset from base to name of driver
; Class_table + 8*kt | 8 | __ZERO | terminaror of list
; i = 0 .. count VID:PID
; it = count VID:PID
; ID_TABLE + 0*(i-1) | 2 | VID | Vendor id
; ID_TABLE + 2*(i-1) | 2 | PID | Product id
; ID_TABLE + 4*it | 4 | __ZERO | terminaror of list
macro INIT_USBDRV_FILE {
local ..id_list, ..class_list
format binary as 'dat'
use32
org 0
dd ..id_list
dd ..class_list
macro ID_DRV_TABLE \{
dd 0, 0
\}
macro CLASS_TABLE \{
dd 0, 0
\}
macro ID_TABLE \{
\}
macro DRV_NAME_LIST \{
\}
postpone \{
..id_list: ID_DRV_TABLE
..class_list: CLASS_TABLE
ID_TABLE
DRV_NAME_LIST
\}
}
macro ADD_CLASS drv_name, class, subclass, protocol {
local ..length, ..class_code, ..drv_name
..length = 3
match =X, class \{
err 'Class is mandatory argument'
\}
match =X, protocol \{
..length = 2
\}
match =X, subclass \{
..length = 1
\}
..class_code = ..length or (class shl 8)
if ..length = 3
..class_code = ..class_code or (protocol shl 24)
end if
if ..length = 2
..class_code = ..class_code or (subclass shl 16)
end if
; add in list
macro DRV_NAME_LIST \{
..drv_name: db drv_name, 0
DRV_NAME_LIST
\}
macro CLASS_TABLE \{
dd ..class_code, ..drv_name
CLASS_TABLE
\}
}
macro ADD_ID drv_name, [device_id] {
common
local ..drv_name, ..id_table
macro ID_TABLE \{
ID_TABLE
..id_table:
\}
reverse
local vid_pid
match VID:PID, device_id \{
vid_pid = (PID shl 16) + VID
\}
macro ID_TABLE \{
ID_TABLE
dd vid_pid
\}
common
macro ID_TABLE \{
ID_TABLE
dd 0
\}
macro DRV_NAME_LIST \{
..drv_name: db drv_name, 0
DRV_NAME_LIST
\}
macro ID_DRV_TABLE \{
dd ..id_table, ..drv_name
ID_DRV_TABLE
\}
}
; ADD ID driver Linux
macro ADD_IDL drv_name, [vendor_id, device_id] {
common
local ..drv_name, ..id_table
macro ID_TABLE \{
ID_TABLE
..id_table:
\}
reverse
local vid_pid
vid_pid = (device_id shl 16) + vendor_id
macro ID_TABLE \{
ID_TABLE
dd vid_pid
\}
common
macro ID_TABLE \{
ID_TABLE
dd 0
\}
macro DRV_NAME_LIST \{
..drv_name: db drv_name, 0
DRV_NAME_LIST
\}
macro ID_DRV_TABLE \{
dd ..id_table, ..drv_name
ID_DRV_TABLE
\}
}
INIT_USBDRV_FILE
;ADD_CLASS 'usbcdc-ctrl' , 0x02, X , X
;ADD_CLASS 'usbimage' , 0x06, 1 , 1
;ADD_CLASS 'usbcdc-data' , 0x0A, X , X
;ADD_CLASS 'ccid' , 0x0B, X , X
;ADD_CLASS 'uvd' , 0x0E, X , X
;ADD_CLASS 'uvd_2' , 0x0E, 0x02, X
;ADD_CLASS 'usb_bluetooth' , 0xE0, 0x01, X
;ADD_CLASS 'usb_wifi' , 0xE0, 0x02, X
ADD_ID 'usbftdi',\
0x0403:0 ; Any FTDI device
;https://github.com/avrdudes/avrdude/blob/main/src/usbdevs.h#L51
;ADD_ID 'usbasp',\
; 0x16c0:0x05dc,\ ; VOTI Obdev's free shared PID
; 0x03e8:0xc7b4,\ ; ATMEL (unofficial) USBasp
; 0x16c0:0x092f ; VOTI NIBObee PID
;https://github.com/WCHSoftGroup/ch341par_linux/blob/main/driver/ch34x_pis.c
;ADD_IDL 'ch341par',\
; 0x1a86, 0x5512,\ ; ch341a default
; 0x1a86, 0x55db,\ ; CH347T Mode1 SPI+IIC+UART
; 0x1a86, 0x55dd,\ ; CH347T Mode3 JTAG+UART
; 0x1a86, 0x55de,\ ; CH347F
; 0x1a86, 0x55e7 ; CH339W
;https://github.com/openbsd/src/blob/master/sys/dev/usb/uchcom.c
;https://github.com/WCHSoftGroup/ch341ser_linux/blob/main/driver/ch341.c
;ADD_IDL 'ch341ser',\
; 0x1a86, 0x7523,\ ; ch340 chip
; 0x1a86, 0x7522,\ ; ch340k chip
; 0x1a86, 0x5523,\ ; ch341 chip
; 0x1a86, 0xe523,\ ; ch330 chip
; 0x4348, 0x5523 ; ch340 custom chip
-523
View File
@@ -1,523 +0,0 @@
;*****************************************************************************;
; Copyright (C) 2025, Mikhail Frolov aka Doczom . All rights reserved. ;
; Distributed under terms of the 3-Clause BSD License. ;
; ;
; usbother is a driver for loading USB drivers of a certain class and vendor. ;
; ;
; Version 0.1.1, 24 May 2025 ;
; ;
;*****************************************************************************;
format PE native 0.05
entry START
; const
DRV_VERSION = 0x0101 ; 0.1.1
; struct
include '../../struct.inc'
; USB device descriptor
struct DEVICE_DESCR
bLength db ?
bDescriptorType db ?
bcdUSB dw ?
bDeviceClass db ?
bDeviceSubClass db ?
bDeviceProtocol db ?
bMaxPacketSize0 db ?
idVendor dw ?
idProduct dw ?
bcdDevice dw ?
iManufacturer db ?
iProduct db ?
iSerialNumber db ?
bNumConfigurations db ?
ends
struct INTERFACE_DESCR
bLength db ?
bDescriptorType db ?
bInterfaceNumber db ?
bAlternateSetting db ?
bNumEndpoints db ?
bInterfaceClass db ?
bInterfaceSubClass db ?
bInterfaceProtocol db ?
iInterface db ?
ends
struct SRV
srv_name rb 16 ;ASCIIZ string
magic dd ? ;+0x10 ;'SRV '
size dd ? ;+0x14 ;size of structure SRV
fd dd ? ;+0x18 ;next SRV descriptor
bk dd ? ;+0x1C ;prev SRV descriptor
base dd ? ;+0x20 ;service base address
entry dd ? ;+0x24 ;service START function
srv_proc dd ? ;+0x28 ;user mode service handler
srv_proc_ex dd ? ;+0x2C ;kernel mode service handler
ends
struct USBSRV
srv SRV
usb_func dd ?
ends
struct USBFUNC
strucsize dd ?
add_device dd ?
device_disconnect dd ?
ends
USBDRV_TYPE_NOLOCK = 0 ; usb device not controlled (native driver
; not found and IOCTL not opened device)
USBDRV_TYPE_NATIVE = 1 ; native PE kernel driver for usb
USBDRV_TYPE_IOCTL = 2 ; usb device is controlled by IOCTL service
; (driver or userspace process/threads)
USBDRV_IOCTL_BLOCKED = 4 ; blocked IOCTL interface, device disconnected
struct DRV_CONTEXT
next dd ?
prev dd ?
drv_hand dd ?
drv_pdata dd ?
flags dd ?
config_descr dd ?
interface_descr dd ?
ep rd 64 ; 32 IN + 32 OUT endpoints' pipes
ends
DRV_CONTEXT.ep0 fix (DRV_CONTEXT.ep + 0)
section '.flat' code readable writable executable
include '../../proc32.inc'
include '../../peimport.inc'
include '../../macros.inc'
proc START c, state:dword, cmdline:dword
cmp [state], DRV_ENTRY
jne .end
; init
mov ecx, drv_list_lock
invoke MutexInit
mov ecx, interface_list_lock
invoke MutexInit
; load drv_list
stdcall load_drv_list, default_list
test eax, eax
jnz .end
; reg driver
invoke RegUSBDriver, drv_name, service_proc, usb_functions
ret
.end:
xor eax, eax
ret
endp
proc load_drv_list stdcall, .path:dword
push ebx
mov ecx, drv_list_lock
invoke MutexLock
; load file
invoke LoadFile, [.path]
test eax, eax
push eax
jnz @f
mov dword[esp], -1
jmp .exit
@@:
cmp [drv_list], 0
jz @f
invoke KernelFree, [drv_list]
@@:
mov eax,[esp]
mov [drv_list], eax
mov dword[esp], 0
.exit:
mov ecx, drv_list_lock
invoke MutexUnlock
pop eax
pop ebx
ret
endp
proc service_proc stdcall, .ioctl:dword
push esi
or eax, -1
mov esi, [.ioctl]
mov ecx, [esi + IOCTL.io_code]
cmp ecx, .count_ioctl_codes
jae .fail
jmp dword[.table_subfunction + ecx*4]
.table_subfunction:
dd .get_version
dd .update_list
dd .get_array_dev
dd .get_full_dev_data
dd .open_dev
dd .close_dev
dd .control_transfer
dd .bulk_transfer
dd .interrupt_transfer
;dd .control_transfer_async
;dd .bulk_transfer_async
;dd .interrupt_transfer_async
.count_ioctl_codes = ($ - .table_subfunction)/4
.get_version:
mov eax, [esi + IOCTL.output]
cmp [esi + IOCTL.out_size], 4
jne .fail
mov dword[eax], DRV_VERSION
xor eax, eax
jmp .exit
.update_list:
; update list
mov ecx, [esi + IOCTL.input]
cmp [esi + IOCTL.inp_size], 0
jnz @f
mov ecx, default_list
@@:
stdcall load_drv_list, ecx
.exit:
pop esi
ret
.get_array_dev:
.get_full_dev_data:
.open_dev:
.close_dev:
;
.control_transfer:
.bulk_transfer:
.interrupt_transfer:
.fail:
or eax, -1
jmp .exit
endp
proc AddDevice stdcall, .config_pipe:dword, \
.config_descr:dword,\
.interface:dword
push esi edi
mov eax, sizeof.DRV_CONTEXT
invoke Kmalloc
test eax, eax
jz .err_init
mov esi, eax
mov ecx, interface_list_lock
invoke MutexLock
mov edx, [usb_interface_list] ; next
mov [esi + DRV_CONTEXT.next], edx
mov [esi + DRV_CONTEXT.prev], usb_interface_list
mov [usb_interface_list], esi
mov [edx + DRV_CONTEXT.prev], esi
mov ecx, interface_list_lock
invoke MutexUnlock
and [esi + DRV_CONTEXT.drv_hand], 0
mov [esi + DRV_CONTEXT.flags], USBDRV_TYPE_NOLOCK
; lock mutex
mov ecx, drv_list_lock
invoke MutexLock
; save device context data
mov eax, [.config_pipe]
mov [esi + DRV_CONTEXT.ep0], eax
mov eax, [.config_descr]
mov [esi + DRV_CONTEXT.config_descr], eax
mov eax, [.interface]
mov [esi + DRV_CONTEXT.interface_descr], eax
; get pointer to list
mov edx, [drv_list]
test edx, edx
jz .err_exit
mov edi, edx
add edi, [edx]
; get in ecx VID:PID code
invoke USBGetParam, [.config_pipe], 0
mov ecx, dword[eax + DEVICE_DESCR.idVendor]
.loop_id_drv:
cmp dword[edi], 0
jz .end_loop_id_drv
mov edx, [drv_list]
add edx, [edi] ; ID_TABLE
.loop_id:
cmp dword[edx], 0
jz .end_loop_id
; check id
mov eax, ecx
test word[edx + 2], 0xffff
jne @f
; driver for all devices of VID
and eax, 0xffff
@@:
cmp [edx], eax ; check VID:PID
je @f
add edx, 4
jmp .loop_id
@@: ; found
call .load_drv
jnz .exit
add edx, 4
jmp .loop_id
.end_loop_id:
add edi, 8
jmp .loop_id_drv
.end_loop_id_drv:
push esi
mov esi, str_1
invoke SysMsgBoardStr
pop esi
; get in ecx class code
mov eax, [.interface]
mov ecx, dword[eax + INTERFACE_DESCR.bInterfaceClass] ; 24-31 bits
mov edi, [drv_list]
add edi, [edi + 4]
.loop_class:
cmp dword[edi], 0
jz .end_loop_class
; check class
movzx eax, byte[edi] ; length
and eax, 11b ; protect - max length = 3
lea eax, [eax*8] ; 1 = 8; 2 = 16; 3 = 24
xor edx, edx
bts edx, eax
dec edx ; bitmask
mov eax, [edi]
shr eax, 8
and eax, edx ; good class in list
and edx, ecx ; good class of device
cmp eax, edx
je @f
add edi, 8
jmp .loop_class
@@: ; found
call .load_drv
jnz .exit
add edi, 8
jmp .loop_class
; IN: edi - item list of driver
; esi - DRV_CONTEXT
; OUT: ZF - not found zF - found
; function save drv handl in DRV_CONTEXT.drv_hand
; and pdata in DRV_CONTEXT.drv_pdata
.load_drv:
push ecx edx
; load driver
push esi
mov esi, str_2
invoke SysMsgBoardStr
pop esi
mov ecx, [drv_list]
add ecx, [edi + 4]
pusha
mov esi, ecx
invoke SysMsgBoardStr
mov esi, str_newline
invoke SysMsgBoardStr
popa
invoke GetService, ecx
test eax, eax
jz @f
mov [esi + DRV_CONTEXT.drv_hand], eax
; get function list
mov ecx, [eax + USBSRV.usb_func]
; call AddDevice of driver
stdcall [ecx + USBFUNC.add_device], [.config_pipe], \
[.config_descr],\
[.interface]
mov [esi + DRV_CONTEXT.drv_pdata], eax
test eax, eax
jnz .load_drv.good
push esi
mov esi, str_4
invoke SysMsgBoardStr
pop esi
and [esi + DRV_CONTEXT.drv_hand], 0
@@:
pushf
push esi
mov esi, str_5
invoke SysMsgBoardStr
pop esi
popf
pop edx ecx
retn
.load_drv.good:
pushf
push esi
mov esi, str_3
invoke SysMsgBoardStr
pop esi
popf
mov [esi + DRV_CONTEXT.flags], USBDRV_TYPE_NATIVE
pop edx ecx
retn
.err_exit:
mov eax, esi
invoke Kfree
xor esi, esi
.end_loop_class:
.exit:
; driver not found - Added libusb driver
; unlock mutex
mov ecx, drv_list_lock
invoke MutexUnlock
mov eax, esi
pop edi esi
ret
.err_init:
xor eax, eax
pop edi esi
ret
endp
proc DeviceDisconnected stdcall, .pdata:dword
mov eax, [.pdata]
test [eax + DRV_CONTEXT.flags], USBDRV_TYPE_NATIVE
jz .no_native
cmp [eax + DRV_CONTEXT.drv_hand], 0
jz .free
; call device disconnected
mov ecx, [eax + DRV_CONTEXT.drv_hand]
mov edx, [ecx + USBSRV.usb_func]
cmp dword[edx], USBFUNC.device_disconnect
jbe .free ; TODO: check
stdcall [edx + USBFUNC.device_disconnect], [eax + DRV_CONTEXT.drv_pdata]
.free:
; clear list of DRV_CONTENT
mov ecx, interface_list_lock
invoke MutexLock
mov eax, [.pdata]
mov edx, [eax + DRV_CONTEXT.prev]
mov ecx, [eax + DRV_CONTEXT.next]
mov [edx + DRV_CONTEXT.next], ecx
mov [ecx + DRV_CONTEXT.prev], edx
mov ecx, interface_list_lock
invoke MutexUnlock
; free context
mov eax, [.pdata]
invoke Kfree
ret
.no_native:
test [eax + DRV_CONTEXT.flags], USBDRV_TYPE_IOCTL
jz .free
; set state for block user api and clear struct
or [eax + DRV_CONTEXT.flags], USBDRV_IOCTL_BLOCKED
xor ecx, ecx
;mov [eax + DRV_CONTEXT.drv_hand], ecx
;mov [eax + DRV_CONTEXT.drv_pdata], ecx
mov [eax + DRV_CONTEXT.config_descr], ecx
mov [eax + DRV_CONTEXT.interface_descr], ecx
mov [eax + DRV_CONTEXT.ep0], ecx
; TODO
jmp .free
endp
; data
drv_list_lock MUTEX
drv_list dd ?
interface_list_lock MUTEX
usb_interface_list:
dd usb_interface_list
dd usb_interface_list
usb_functions:
dd .end - usb_functions
dd AddDevice
dd DeviceDisconnected
.end:
drv_name db 'usbother', 0
default_list: db '/sys/settings/usbdrv.dat', 0
str_1: db 'USBOTHER: Driver for this ID not found', 13, 10, 0
str_2: db 'USBOTHER: Check found driver: ', 0, 13, 10, 0
str_3: db 'USBOTHER: Device driver is good', 13, 10, 0
str_4: db 'USBOTHER: Device driver fail prob', 13, 10, 0
str_5: db 'USBOTHER: Device driver load error', 13, 10, 0
str_newline: db 13,10,0
data fixups
end data
@@ -5,7 +5,7 @@
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Загрузочный сектор для КолибриОС (FAT12, дискета)
Загрузочный сектор для ОС Колибри (FAT12, дискета)
- Описание
Позволяет загружать KERNEL.MNT с дискет/образов
@@ -5,7 +5,7 @@
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Загрузочный сектор для КолибриОС (FAT12, дискета)
Загрузочный сектор для ОС Колибри (FAT12, дискета)
- Описание
Позволяет загружать KERNEL.MNT с дискет/образов
Loaded 100 of 3797 files, more files were not shown because too many files have changed in this diff. Show more