PDA

Просмотр полной версии : Оконный интерфейс для БК0011



vinxru
10.03.2012, 18:46
Тут я буду писать реализованное API

Первая цель - это демо программа в корой будет несколько окон MessageBox. Это окно с изображением, текстом, кнопками Да, Нет. На нажатии на кнопку Да будет запускаться еще одно окно. При нажатии на Нет, окно будет закрываться. Окна можно будет перемещать и изменять их размер. Система должна корректно перерисовывать весь инетрфейс (используя отсечение). Используется черно-белый графический режим.

Вторая цель - это панель пуск. При нажатии на пуск открывается всплывающее меню со списком возможных действий и программ. Так же на панели находятся кнопки окон и объем свободной памяти.

Реализованное API

Память:
MemAlloc(R1 - размер) - Выделяет память. Возвращает R0-указатель.
MemFree(R0 - указатель) - Освобождает память.
ZeroMemory(R0 - указатель, R1 - размер) - Заполняет память нулями.
iFreeMem - Объем свободной памяти (только для чтения)

Глобальные переменные
iRectX, iRectY, iRectX1, iRectY1 - Используется для передачи параметров во многие функции.
DecComRect() - Уменьшить iRect (iRectX++, iRectY++, iRectX1--, iRectY1--).

Окна:
CreateWindow(R0-предок, R1-указатель на WndProc) - Создает окно. Возвращает R0-указатель на объект.
DestroyWindow(R0-окно) - Уничтожает окно.
SendMessage(R0-окно, R1-сообщение ...) - Переключает контекст задачи, сохраняет регистры R0-R3, R5 и запускает функцию WndProc.
Invalidate(R0-окно) - Поставить окно в очередь на перерисовку.
WindowFromPoint(R0,R1) - Какое окно находится в этой точке. Возвращается R2-указатель на объект.
RedrawWindows() - Перерисовать интерфейс (Разослать сообщения WM_PAINT. Вызывается системой автоматически при простое.)
iGraphWindow - Окно выбранное для функций рисования (только чтение)

Курсор мыши:
iCursorImage - Изображение курсора
iCursorX, iCursorY - Положение курсора мыши на экране (только для чтения)
ShowMouse() - Показывает курсор мыши
HideMouse() - Прячет курсор мыши (Восстанавливает изображение под ним).

Рисование (эти функции рисуют в окне. Учитывается, если окно частично закрыто другим окном):
SetPixel(R1,R2-положение) - рисование точки
BitBlt(R1,R2-положение, R3-изображение) - Вывод изображения (с отсечением определенным в iComRect)
DrawText(R1,R2-положение, R3-текст) - Вывод текста шрифтом 8x10 (с отсечением определенным в iComRect)
Rectangle() - Вывод прямоугольника размером iComRect
FillRect() - Вывод закрашенного прямоугольника размером iComRect
InverseMode(R1) - Включить/выключить инверсный режим для DrawText и FillRect.

Драйвер экрана (рисует на экране):
DrvSetPixel(...), DrvBitBlt(...), DrvDrawText(...), DrvFillRect(...).
DrvXorRect(...) - Рисование пунктирного прямоугольника XOR-ом (Для изменения размера и положения окна)

Объекты интерфейса (функции WndProc):
CtlWindow(...) - Рамка и заголовок окна. Логика изменения размера, перемещения.

События окон:
WM_CONSTRUCTOR - Получить кол-во дополнительной памяти в объекте окна
WM_PAINT - Окно необходимо перерисовать
WM_LBUTTONDOWN - Нажатие левой кнопки мыши
WM_LBUTTONUP - Отпускание левой кнопки мыши
WM_LBUTTONDBLCLK - Двойной клик
WM_MOUSEWHEEL - Колесо мыши
WM_RBUTTONDOWN - Нажатие правой кнопки мыши
WM_RBUTTONUP - Отпускание правой кнопки мыши
WM_MOUSEMOVE - Перемещение курсора мыши
WM_CAPTURECHANGED - Окно потеряло монополию над курсором мыши
WM_SETFOCUS, WM_KILLFOCUS - Окно получило/потеряло фокус.
WM_KEYDOWN - Нажатие клавиши клавиатуры (рассылается, только если фокус на окне)
WM_DESTROY - Окно сейчас будет уничтожено
WM_ACTIVATE - Окно стало/перестало быть активным (только для объектов CtlWindow)
WM_CLOSE - Пользователь хочет закрыть окно
WM_ENABLE - Изменение свойства Enabled окна
WM_MOVE - Окно было перемещено
WM_SIZE - Размер окна был изменен
WM_TIMER - Таймер

Объект окна доступен для чтения программисту. Он содержит поля:
Task - Задача, которой принадлежит окно
Parent - Указатель на окно предка
FirstChild - Указатель на первое окно ребенка
LastChild - Последнее окно ребенок
PrevWindow - Предыдущий брат
NextWindow - Следующий брат
Left, Top - Относительные координаты окна
Width, Height - Размер окна
X, Y, X1, Y1 - Координаты окна относительно экрана
WndProc - Обработчик сообщений окна
Style & FW_Intersect - Окно частично закрыто другими окнами
Style & FW_TabStop - Окно может получить фокус (получать сообщения WM_KEYDOWN)
Style & FW_Visible - Окно отображается
Style & FW_Enabled - Окно доступно пользователю
Style & FW_TopMost - Окно всегда сверху

Планируемое API я временно убрал. Там очень много функций.

vinxru
11.03.2012, 14:22
Пока только отрисовывается такая картинка и поверх двигается курсор.

По плану сделать вывод текста. И там есть тормоза. Если выводить текст в координаты по горизонтали не кратные 8, то приходится двигать биты. Поэтому я сделаю так, что положение любого окна или объекта будут кратны 8.

Первый этап работы - это сделать демку, где окна будут перемещаться мышью, их размеры будут изменяться. И будет выполняться функции MessageBoxYN и MessageBoxOk. (И следовательно пару десятков побочных функций).

...

А в идеале хочу рабочий стол с файлами и папками. При щелчке по файлу, будет запускаться соответствующая программа. Если тыкнуть на папку, запустится проводник. (Рабочий стол и проводник - это одна и та же программа). Внизу экрана панель ПУСК и кнопки запущенных программ. Вместо времени - объем свободной памяти. Сворачивание программы, выгружает её из ОЗУ.

При запуске стандартной программы, ОС будет закрываться. Хотя можно попробовать сделать при нажатии на кнпоку СТОП, сохранение такой программы на диск и возврат в ОС. (Как было в DOS Shell)

Из программ пока: блокнот, черно-белый пеинт, сапер, косынка, тетрис, таблица символов, калькулятор, панель управления, часы, простейшая БД, календарь, терминал.

CD-Inc
11.03.2012, 18:14
По плану сделать вывод текста. И там есть тормоза. Если выводить текст в координаты по горизонтали не кратные 8, то приходится двигать биты. Поэтому я сделаю так, что положение любого окна или объекта будут кратны 8.

Правильно.
Но со сдвигом (кратным 2) для символов,я бы всё таки заморочился, т.к. можно сделать нормальный пропорциональный (в пределах слова) шрифт в т.ч. для цветного режима, только перед выводом можно делать проверку на смещение/ширину символа если 8/8 тупо пихаем BICB/BISB"ами шрифт/экран, иначе двигаем шрифт в Rx+Ry - выводим BIC/BIS"ами на Rx,(ADR) и Ry,2(ADR)
Если окно не будет отрисовываться заново каждую секунду, то скорости хватит, т.е. тормозни не получится


Первый этап работы - это сделать демку, где окна будут перемещаться мышью, их размеры будут изменяться. И будет выполняться функции MessageBoxYN и MessageBoxOk. (И следовательно пару десятков побочных функций).

...

А в идеале хочу рабочий стол с файлами и папками. При щелчке по файлу, будет запускаться соответствующая программа. Если тыкнуть на папку, запустится проводник. (Рабочий стол и проводник - это одна и та же программа). Внизу экрана панель ПУСК и кнопки запущенных программ. Вместо времени - объем свободной памяти. Сворачивание программы, выгружает её из ОЗУ.

При запуске стандартной программы, ОС будет закрываться. Хотя можно попробовать сделать при нажатии на кнпоку СТОП, сохранение такой программы на диск и возврат в ОС. (Как было в DOS Shell)

Из программ пока: блокнот, черно-белый пеинт, сапер, косынка, тетрис, таблица символов, калькулятор, панель управления, часы, простейшая БД, календарь, терминал.

Хорошая вещь для этого СМК:
+ стандартная железка и для 10тки и для 11
+ не занимает основную память (в т.ч. и сист. стек туда можно писать)
+ если всё заработает можно грузить при начальной загрузке с винта автоматом.

Удачи

vinxru
11.03.2012, 18:39
Хорошая вещь для этого СМК:
+ стандартная железка и для 10тки и для 11
+ не занимает основную память (в т.ч. и сист. стек туда можно писать)
+ если всё заработает можно грузить при начальной загрузке с винта автоматом.

Удачи

Спаисбо. Я собираюсь купить SMK, но пока я бюджет исчерпал на месяц вперед. Если повезет, то я Кристу 2 на молотке куплю. (У неё разрешение 1024x256.)

dk_spb
11.03.2012, 20:14
vinxru, Мда, ценничек Вы задрали - мама не горюй.

vinxru
11.03.2012, 20:14
А кодировку какую использовать?
Покоцанную KOI-8 из БК или 1251 ?

Нашел таблицу символов 8х10 по адресу #0112036. Пока её использую.

vinxru
12.03.2012, 00:20
Пишу кстати на своем макро-ассемблере. Уверен, что так будет всем понятнее и проще.



//----------------------------------------------------------------------------
// Вывод текста R5 в (R0,R1)

DrawText: R3 = R0;
// Расчет адреса в видеопамяти
R1 <<= #6;
R0 >>= #3 + R1 + #040000;
// Расчет адреса перехода
R3 !&= #0FFF8h;
R3b = shlTranslate(R3b);
do {
// Обработка всех символов
R1b = (R5b)+;
ASM BEQ DrawTextRet;
R1 !&= #0FF00h; // Долбанное расширение знака
// Особенность знакогенератора БК
if(R1>#128) R1 -= #32;
// Расчет адреса в знакогенераторе
R4 = R1 << #3 + R1 + R1 + #0111576;
// Высота символа
R2 = #10;
// Вывод символа
do {
R1b = (R4b)+;
R1 !&= #0FF00h; // Долбанное расширение знака
shl(R3)();
(R0b)+ |= R1b;
ASM SWAB R1;
(R0b) |= R1b;
R0 += #63;
} while(R2--);
R0 -= #639;
};
DrawTextRet: return;

//----------------------------------------------------------------------------

shlTranslate: db 14,12,10,8,6,4,2,0;

//----------------------------------------------------------------------------

shl: R1 <<= #1; R1 <<= #1; R1 <<= #1; R1 <<= #1;
R1 <<= #1; R1 <<= #1; R1 <<= #1;
return;

//----------------------------------------------------------------------------
// Работает примерно в 2 раза быстрее

FastDrawText: // Расчет адреса в видеопамяти
R1 <<= #6;
R0 >>= #3 + R1 + #040000;
do {
// Обработка всех символов
R1b = (R5b)+;
ASM BEQ DrawTextRet;
R1 !&= #0FF00h; // Долбанное расширение знака, попробую еще CLR+BIS
// Особенность знакогенератора БК
if(R1>#128) R1 -= #32;
R4 = R1 << #3 + R1 + R1 + #0111576;
// Вывод символа
R2 = #10;
do {
(R0b) |= (R4b)+;
R0 += #64;
} while(R2--);
R0 -= #639;
};
return;


Рисует где то секунду.

http://s019.radikal.ru/i603/1203/19/f04e23ed9bd4.png

---------- Post added at 23:20 ---------- Previous post was at 22:25 ----------


vinxru, Мда, ценничек Вы задрали - мама не горюй.

Это не я задрал. :) Я бы за 500 рублей с удовольствием купил. БК0011 кстати там то же за 5000 руб лежит :)

vinxru
13.03.2012, 10:29
Пока будет 4 функции рисования:

SetPixel(x,y) - рисование точки
FillRect(x,y,x1,y1) - рисование прямоугольников и верт/гор линий.
DrawText(tx,ty,x,y,x1,y1,text) - рисование надписи.
InverseMode(f) - Установка цвета букв и цвета фона для (FillRect и DrawText).
BitBlt(x,y,x1,y1,sourceBitmap,sx,sy) - вывод изображения
FocusRect(x,y,x1,y1) - Пунктирный прямоугольник нарисованный XOR-ом (для изменения размера окна).

Этого хватит почти для всего.

В параметрах x,y,x1,y1 задается прямоугольник за пределами которого рисовать нельзя.

Если окно программы будет частично закрыто другим окном, то оконный интерфейс вызов этих функций рисования разобьет на несколько вызовов с различными областями отсечения так, что бы нарисовать всё что нужно и не испортить окно сверху.

Пример работы этой функции с параметрами a=(20,20,250,250), b=(60,60,200,200).
http://s60.radikal.ru/i168/1203/14/760abfec6db9.png



void intersect(RECT& a, RECT& b) {
// Не переcекается
if(b.left > a.right || b.right < a.left || b.top > a.bottom || b.bottom < a.top) { draw(a); return; }

// Низ не тронут
if(a.bottom>b.bottom) {
int t = a.top; a.top = b.bottom+1; draw(a); a.top = t;
a.bottom = b.bottom;
}

// Верх не тронут
if(a.top<b.top) {
int t = a.bottom; a.bottom = b.top-1; draw(a); a.bottom = t;
a.top = b.top;
}

// Слева не тронуто
if(a.left<b.left) {
int t = a.right; a.right = b.left-1; draw(a); a.right = t;
}

// Справа не тронуто
if(a.right>b.right) {
a.left = b.right+1; draw(a);
}
}


Вот эта функция будет выполнена для каждого окна, которое закрывает наше окно.

Mad Killer/PG
13.03.2012, 10:46
Клaссно,мнe нрaвится,что это в конeчно будeт ГЮИ или нeчто ОСябeльноe с ядром,комaндeром ?

vinxru
13.03.2012, 10:59
Коммандер будет.

Мне проще было бы посадить ГУИ на существующую ОС. Что бы не писать поддержку файловой системы. В общем всё как в Windows 3.0.

Надо глянуть на все ОС для БК.

Но распределение памяти и загрузку программ мне придется делать свою. Каждый выделенный блок памяти будет помечаться, к какой задаче он относится. Когда завершаешь задачу, вся занимаемая ей память (и окна) будут уничтожаться. Так же можно будет вести учет памяти занимаемый каждой задачей.

Памяти у БК совсем не много, поэтому я планирую сделать DLL. Каждая функция системы будет хранится в отдельном файле.

В каждой программе будет заголовок в котором будет указано, какие DLL надо загрузить. Система будет перед загрузкой программы догружать все DLL-ки и корректировать адреса в коде. То есть, получится аналог линкера.

Если не нужен объект CheckBox, то его просто не будет в ОЗУ.

В каждой программе будет две специальные функции AppSwap и AppUnswap. Они должны сохранить в файл все настройки программы, а потом загрузить из файла настройки. Когда не будет хватать памяти, пользователь сможет свернуть программу и программа сохранится на диск с помощью этих функций.

Так что это будет ОС с кооперативной многозадачностью. Но если у вас не поворачивается назвать Windows 3.0 операционной системой, то это будет оболочка :)

Хотелось бы получить вот такую картинку, только с панелью ПУСК:
http://upload.wikimedia.org/wikipedia/en/1/15/Windows_3.0_workspace.png

Надеюсь, что получится на 16-48 Кб ОЗУ и тормозном процессоре (относительно 286 25 МГц, который в 30 раз быстрее)

Mad Killer/PG
13.03.2012, 11:14
Спaсибо, подгруз процeдур увeличит врeмя исполнeния подпрогрaм,нaсколько это критично будeт,eфeкт стоп кaдр нe поломaeт вeсь смaк интeрaктивности?
Хорошо в цeлом мнe нрaвится,жить бeз SMK нaвeрноe нe сможeт,мaгнитофон нe погоняeш тaк)

vinxru
13.03.2012, 11:28
Спaсибо, подгруз процeдур увeличит врeмя исполнeния подпрогрaм,нaсколько это критично будeт,eфeкт стоп кaдр нe поломaeт вeсь смaк интeрaктивности?
Хорошо в цeлом мнe нрaвится,жить бeз SMK нaвeрноe нe сможeт,мaгнитофон нe погоняeш тaк)

Тормоза будут только при запуске программы. В современном мире - это норма. А иначе оперативки не хватит.

Я уже 2 Кб занял, не считая стека.

"Ни одна уважающая себя программа не запускается быстрее 5 секунд" (c) :)

Atari
13.03.2012, 11:55
1. Найдите и почитайте Мэтт Питрек «Внутренний мир Windows»
Книга, хотя и о Windows 3.1, но чего-либо подобного больше нет в природе. Она содержит дизассемблерные листинги C-подобного кода для огромного количества Windows API, с подробными объяснениями что, зачем, почему и как работает. Т.к. основные принципы внутренней работы Windows не изменились до сих пор, это самая ценная книга с точки зрения разработчика Wine.

2. Погоняйте под эмулером классическую МакОС, например 7.5

SKcorp.
13.03.2012, 14:05
Коммандер будет.

Мне проще было бы посадить ГУИ на существующую ОС. Что бы не писать поддержку файловой системы. В общем всё как в Windows 3.0.

Надо глянуть на все ОС для БК.


Хотелось бы получить вот такую картинку, только с панелью ПУСК:
http://upload.wikimedia.org/wikipedia/en/1/15/Windows_3.0_workspace.png


Дык баян же.

http://bk0010.spb.ru/os.php

vinxru
13.03.2012, 14:21
Вот блин. А я не нашел :)

---------- Post added at 13:21 ---------- Previous post was at 13:20 ----------

Ты писал? Это многозадачная ОС с несколькими программами, или просто меню?

SKcorp.
13.03.2012, 18:31
Вот блин. А я не нашел :)

---------- Post added at 13:21 ---------- Previous post was at 13:20 ----------

Ты писал? Это многозадачная ОС с несколькими программами, или просто меню?

Первые две я. Считай, что просто меню (подкаталоги виртуальные) для сетевой работы с ДВК, хотя все признаки ОС присутствуют.
Третья не я. Многозадачка под HALT-контроллер (SMK).

vinxru
13.03.2012, 18:36
В 1988 году?

Woland
13.03.2012, 19:17
Нет, подозреваю где-то 1996-1998.
vinxru, если дам SMK64, напишите с учетом его возможностей? Через некоторое время SMK512 (512 кб ДОЗУ) появится, можно и его будет использовать.

Atari
13.03.2012, 20:28
Это многозадачная ОС с несколькими программами, или просто меню?
мне кажется что это не может быть полноценной ОСью.

vinxru, думаю если есть желание и квалификация Вам стоит попробовать написать полноценную ОСь для БК, единственное - стоит сразу определиться с концепцией, хотя в некотором смысле она у Вас уже почти сложилась.

vinxru
13.03.2012, 23:01
Нет, подозреваю где-то 1996-1998.
vinxru, если дам SMK64, напишите с учетом его возможностей? Через некоторое время SMK512 (512 кб ДОЗУ) появится, можно и его будет использовать.

Я его куплю даже. Но пока я думаю о страничной адресации, как о страшном сне. :)

Желательно, что бы поддержка SMK512 была в эмуляторе.

---------- Post added at 20:01 ---------- Previous post was at 19:40 ----------

Если напишу ОС, то потом под неё IDE с визуальным редактором форм сделаю.

---------- Post added at 22:01 ---------- Previous post was at 20:01 ----------

В моем варианте ассемблера получаются неоднозначные конструкции.

(R0)+=#1

Может быть

(R0)+ = #2 ... MOV #2, (R0)+
(R0) += #2 ... ADD #2, (R0)

Вообще, правильнее бы смотрелось (R0++), а не (R0)+. Но не буду переиначивать PDP-11.

Woland
14.03.2012, 11:43
Я его куплю даже. Но пока я думаю о страничной адресации, как о страшном сне. :)
Но все-таки БК0011М, за счет большего объема памяти (той же страничной) на порядок и софт позволила поднять по сравнению с БК0010.


Желательно, что бы поддержка SMK512 была в эмуляторе.

А в каком именно? :) Её конечно же нигде нет в эмуляторах.

vinxru
14.03.2012, 12:28
А в каком именно?

Мне без разницы. Сейчас я пользуюсь каким то BK Emulator by Yuriy Kalmykov, потому что он прописался на автозапуск rom-файлов. Но у меня есть подозрение, что программы работают в нем медленнее, чем на реале. В этом эмуляторе время выполнения всех команд одинаково и в общем, процессор выполняет 100.000 команд в секунду. И еще там клавиатура не совсем реально работает и ноутбук жжот колени, когда запущен этот эмулятор.

Но только что посмотрел на эмулятор b2m. Попробую использовать его, надеюсь, что получится сделать автозапуск rom-ов для него. Я думаю, что когда потребуется использовать дополнительную память, b2m без проблем добавит её в свой эмулятор.

P.S. А еще его эмулятор падает, если не выбирая машину запустить отладчик.

---------- Post added at 11:15 ---------- Previous post was at 11:03 ----------

Кстати, сделал функции MemAlloc, MemFree. Пока в самом тормозном виде.

MemAlloc просматривает все блоки памяти от начала до конца. И если находится свободный блок подходящего размера, то этот блок делится пополам. Если находится несколько подряд идущих свободных блоков, то они объединяются.

В начале каждого блока памяти находится указатель на следующий блок. Односвязный список. А еще идентификатор задачи: 0-свободно, 1-15 система, 16-32767 задача, 32767-65535 DLL-файл. Причем номер является именем DLL-файла. Имена не используются для экономии ОЗУ.

Функция MemFree просто помечает блок свободным [CLR -4(R0)]

Попозже перепишу менеджер памяти. Он будет свободные блоки держать в виде двоичного дерева. И всегда находить минимально возможный блок (дефрагментация ОЗУ) за время log(n). Это работает быстрее, но расходует больше ОЗУ.

Еще будет функция EMemAlloc выделяющая страничную память. Указатель на эту память будет 32-х битным (Смещение + Страница). Она в том числе может выделить память и из основного пространства, если страницы закончились.

---------- Post added at 11:28 ---------- Previous post was at 11:15 ----------

У задач будет признак, разрешающий загружать их в страничную память. ОС будет устанавливать нужную страницу, при обращении к таким задачам.

Я вот только не знаю, сколько окон будет у страничной-памяти (зависит от используемого контроллера). Если всего одно окно, то такие задачи не смогут нормально использовать страничную-память, так как не смогут переключать страницы.

А в остальном работа со страницами будет полностью аналогична работе с сегментными регистрами x86 процессора. Только сегменты будут чуть меньше.

Woland
14.03.2012, 14:55
Серьезно Вы за дело взялись...
А насколько реализуемо предусмотреть, чтобы когда на БК0012 будет эта система запускаться, она нормально работала на полной скорости процессора (которая в 150-200 раз будет быстрее реального ВМ1)?

vinxru
14.03.2012, 15:07
Не вижу проблем. Чем быстрее выполнится код, тем лучше.

А для всякой анимации, используется процессорный таймер.

Atari
14.03.2012, 15:10
vinxru, как думаете переключать задачи, передавать между ними данные (вызов ф-ции DLL в т.ч.), думаете ли организовывать кольца защиты?

Задаю глупые вопросы ибо с архитектурой БК знаком очень слабо.

---------- Post added at 13:10 ---------- Previous post was at 13:08 ----------

как вообще на PDP организованно обработка ловушек и исключений?

vinxru
14.03.2012, 16:15
vinxru, как думаете переключать задачи, передавать между ними данные (вызов ф-ции DLL в т.ч.), думаете ли организовывать кольца защиты?

Защиты не будет, любая программа может уронить систему. У БК0010 есть пультовый режим (типа режима отладки с подключением альтернативного ПЗУ, с возможностью пошаговой отладки), но он требует железной поддержки (доп платы) и пока я его не планирую использовать. Так же можно сделать полноценный пейджинг (блокирование чтения или записи блоков размером 64 байта) на внешнем контроллере памяти, но это то же паяльник.

DLL

DLL выполняется в контексте задачи. То есть все созданные окна и выделенная память будет принадлежать вызвавшему процессу. Завершается процесс, уничтожаются все созданные окна.

DLL может обладать собственными данными, только если будет модифицировать свой сегмент данных.

(Но не должна. И если будет использоваться пейджинг, то это вызовет ошибку.)

Взаимодействие задач

Задачи должны будут общаться только через функцию SendMessage. Она переключает страницы памяти и изменяет контекст задачи. То есть все созданные ресурсы будут принадлежать новой задаче.

Если одна задача передает другой задаче блок памяти (например строку), то эта строка должна быть создана функцией GlobalMemAlloc. Что бы строка гарантированно была создана в общей памяти. А принимающая задача должна изменить владельца блока на себя.

(Если будет использоваться пейджинг, то любое обращение к строке, до изменения владельца, вызовет исключение. В адресном пространстве будет дыра).

Еще будут файловые трубы (CreatePipe). Одна задача пишет в виртуальный файл, другая читает.

---------- Post added at 14:43 ---------- Previous post was at 14:37 ----------


как вообще на PDP организованно обработка ловушек и исключений?

Внешнем или встроенным в процессор MMU (менеджером памяти). Он обеспечивает что то похожее на защищенный режим 286/386 процессоров.
В БК0010 этого нет.

---------- Post added at 15:15 ---------- Previous post was at 14:43 ----------

Вообще разные бывают MMU, я видел такой:

Адресное пространство 64Кб делится на 8 блоков по 8 килобайт.

К каждому блоку можно подключить любую область физической памяти. Например 4 Мб с шагом 64 байта.

(Аналог сегментных регистров, только тут их 8 и шаг 64 байта.)

Плюс контроллируется, имеет ли право процесс обращаться к определенной области памяти. Попытался прочитать чужие данные, произошло исключение.

(Аналог защищенного режима)

alone
14.03.2012, 16:16
В БК есть страничная память? Как она организована? Для полноценной многозадачности надо как минимум два переключаемых окна, лучше 4 (несколько страниц ОС и переключаемые страницы кода задачи), ещё лучше 8 (как в UNIX для PDP-11).

Atari
14.03.2012, 16:32
Задачи должны будут общаться только через функцию SendMessage. Она переключает страницы памяти и изменяет контекст задачи. То есть все созданные ресурсы будут принадлежать новой задаче.

Если одна задача передает другой задаче блок памяти (например строку), то эта строка должна быть создана функцией GlobalMemAlloc. Что бы строка гарантированно была создана в общей памяти. А принимающая задача должна изменить владельца блока на себя.

это прямой путь к микроядерной архитектуре ;)

т.е. задача передаёт данные ядру с "номером" получателя ядро делает все необходимые проверки распоряжения, если надо перекладывает данные и переключает контекст.

vinxru
14.03.2012, 16:36
В БК0010-01 нет страничной памяти.

Сначала находится 32 Кб ОЗУ, из которых 16 Кб занимает видеопамять.
Потом идет ПЗУ 24 Кб (Бейсик).
Конец памяти свободен для внешних устройств. Там обычно ПЗУ дисковода.

В БК0011 есть страничная память.

Адресное пространство поделено на 4 окна по 16 Кб.

В окне 0 всегда 0 страница ОЗУ.
В окне 1 можно выбирать любую страницу ОЗУ (их 8)
В окне 2 можно выбирать любую страницу ОЗУ или ПЗУ
Окно 3 свободно для внешних устройств. Там обычно ПЗУ дисковода.

Но к обоим компьютерам можно подключить внешнее ОЗУ с собственной страничной адресацией. У БК0010-01 обычно подключали 16-32 Кб вместо стандартного ПЗУ.

---------- Post added at 15:36 ---------- Previous post was at 15:32 ----------


т.е. задача передаёт данные ядру с "номером" получателя ядро делает все необходимые проверки распоряжения, если надо перекладывает данные и переключает контекст.

Почти.

1) Задача передаёт данные ядру с "номером" получателя.
2) Ядро делает все необходимые проверки распоряжения, переключает контекст.
3) Вторая задача дает команду ядру, что на хочет забрать данные. Ядро меняет владельца у блока памяти.

Иначе, глючная Программа 1 может повесить на задачу 2 кучу ресурсов без её ведома.

Atari
14.03.2012, 16:46
Иначе, глючная Программа 1 может повесить на задачу 2 кучу ресурсов без её ведома.
для этого существует системы симафоров и TTL ответа.
т.е. DLL после инициализации становится в позу "готов!" и ждет.
задача осуществляет вызов, ситема передает данные включает счетчик и блокирут в ход в DLL. Следующаа задача вынуждена в очереди ждать освобождения или система будет вынуждена перегрузить DLL по TTL как повисшую.
такая реентерабильность потребует написания соответсвующего кода и передачу данных через стек.

bigral
15.03.2012, 12:00
Память:
MemAlloc(R1 - размер) - Выделяет память. Возвращает R0-указатель.
MemFree(R0 - указатель) - Освобождает память.
ZeroMemory(R0 - указатель, R1 - размер) - Заполняет память нулями.
iFreeMem - Объем свободной памяти (только для чтения)


Советую это сразу переделать, в новых OS-aх менеджеры памяти эмулируют виртуальную память таким интерфейсом:

REGION_HANDLE malloc(SIZE); // выделяет память и возвращает REGION_HANDLE - index или ID-шник на выделенный блок памяти.
ADDRESS lock_region(REGION_HANDLE); // отображает блок памяти в текущее адресное пространство для чтения\изменения.
void release_region(REGION_HANDLE); // убирает блок памяти из текущего адресного пространства.
void free(REGION_HANDLE); // освобождает выделенную память.

Ну и везде где ранее параметром передавался ADDRESS теперь надо передавать REGION_HANDLE.

REGION_HANDLE для БК-0010 может быть 8-bit так как 256 кусков памяти это уже довольно много а сами выделенные блоки можно держать на диске или в отключенных страницах (для этого надо вести статистику какие из них больше всего востребованны).

---------- Post added at 10:00 ---------- Previous post was at 09:47 ----------


передачу данных через стек.

Передавать через стек параметры нелепо, если они маленькие передавать через регистры а если большие то они и так уже в памяти и надо передавать указатель или handle на них. Ну естественно malloc работает медленее чем push и например для рекурсии это сулит большую потерю производительности НО! учитывая что в БК-0010 мало памяти это очень даже приемлемая потеря.

vinxru
15.03.2012, 13:50
у и везде где ранее параметром передавался ADDRESS теперь надо передавать REGION_HANDLE.

Может быть потом, вторым слоем добавлю. Я пока делаю, что бы быстрее работало.

Тем более, что можно считать, что память плоская и без защиты. А окна не более, чем сегментные регистры.

SKcorp.
15.03.2012, 18:11
У БК0010 обычно подключали 16-32 Кб вместо стандартного ПЗУ.[/B]

Гон, причем полный.

vinxru
15.03.2012, 18:22
Гон, причем полный.

Да, действительно никакой дополнительной оперативной памяти к БК0010 не подключали. А если и подключали, то в область последних свободных 8 Кб. (сарказм)

SKcorp.
15.03.2012, 18:34
Да, действительно никакой дополнительной оперативной памяти к БК0010 не подключали. А если и подключали, то в область последних свободных 8 Кб.

Все-таки загляни в карту памяти БК0010. В последних 8 Кб МСТД.

vinxru
15.03.2012, 18:55
Все-таки загляни в карту памяти БК0010. В последних 8 Кб МСТД.

А как там может быть МСТД, если блок МСТД лежит в метре от компьютера?

http://s017.radikal.ru/i426/1203/e5/8e26af09e3a7.jpg

---------- Post added at 17:55 ---------- Previous post was at 17:46 ----------

Вот что происходит с адресным пространством, после подключения контроллера SMK64. A16, A16М работают похоже.



Название режима Start Std10 ОЗУ10 Basic Std11 ОЗУ11 ОЗУзз Hlt11
Код включения 160 60 120 20 140 40 100 20000
Откл. мон. БК10 + + + +
-/- мон. БК11М + + + +
-/- верх.ОЗУ-11М + + + +
170000-177777 ПЗУ - - - - - - 3W
160000-167777 ПЗУ ПЗУ ПЗУ - ПЗУ 2 ПЗУ 2
150000-157777 1 1 - - - 1 - 1
140000-147777 0 0 - - - 0 - 0
130000-137777 3 3 3 - - - 3 -
120000-127777 2 2 2 - - - 2 -
110000-117777 - - 1 1 - - 1 -
100000-107777 - - 0 0R - - 0R -

Обозначения: ПЗУ - ПЗУ объемом 10000; 0,1,2,3 - 4 сегмента ОЗУ по 10000 (по 4 Кб); R,W (0R,3W) - указанный сегмент доступен только по чтению или записи соответственно.


(c) http://www.vak.ru/doku.php/proj/bk/bk-a16tech

SKcorp.
15.03.2012, 19:12
А как там может быть МСТД, если блок МСТД лежит в метре от компьютера?



Откуда в БК0010 блок МСТД, когда там ПЗУ неотключаемые?

vinxru
15.03.2012, 19:26
Ааа... а я -01 не написал. Текст "У БК0010 обычно подключали 16-32 Кб вместо стандартного ПЗУ." относится к первому компьютеру в сообщении.

Про первый БК0010 без 01 я не писал вообще. :)

SKcorp.
15.03.2012, 19:35
Ааа... а я -01 не написал. Текст "У БК0010 обычно подключали 16-32 Кб вместо стандартного ПЗУ." относится к первому компьютеру в сообщении.

Про первый БК0010 без 01 я не писал вообще. :)

У БК0010-01 первые 8Кб не отключались (за исключением последних выпусков), так что ДОЗУ было или 16Кб прямое или 32 Кб страничное.

http://bk0010.narod.ru/docs/BK_Magazine/199301/019.htm

PS: Кто там спрашивал про изготовителя - завод "ЭРИДАН".

vinxru
15.03.2012, 20:08
Я видел статьи про то, как исправить этот недостаток.

b2m
16.03.2012, 12:17
Но только что посмотрел на эмулятор b2m. Попробую использовать его, надеюсь, что получится сделать автозапуск rom-ов для него. Я думаю, что когда потребуется использовать дополнительную память, b2m без проблем добавит её в свой эмулятор.

P.S. А еще его эмулятор падает, если не выбирая машину запустить отладчик.
Ошибка исправлена.

vinxru
16.03.2012, 23:44
Ничего интересного.

B2M подключил в эмуляторе мышь. Протокол выбрал я. Мышь посылает абсолютные координаты по запросу, а не относительные как обычно. Я аналогично подключу мышь с помощью микроконтроллера к БК.

Но вообще мне без разницы какую мышь подключать. Будет несколько драйверов и будет поддержка стандартной Марсианки.

http://s59.radikal.ru/i164/1203/5b/4e4208ba8341.jpg

Во вложении конфигурации для эмулятора. И программа, которая рисует линии и звездочки мышью.

vinxru
17.03.2012, 13:53
Сделал отсечение для функции рисования прямоугольников, закрашенных прямоугольников, линий.

http://s019.radikal.ru/i644/1203/a1/6a6842dcc7de.jpg

Теперь еще надо доделать отсечение для текста и изображений.

Еще добавил функции DecComRect - уменьшает ComRect, PushAll, PopAll, Shl, MoveWindow - перемещает окно, WindowFromPoint - возвращает окно находящееся в заданной точке.

Пока программа занимает 1.9 Кб.

b2m
17.03.2012, 19:33
Во вложении конфигурации для эмулятора.
"ppi : bk001x-register" в конфиге уже был, надо было удалить его, когда добавлял свои строчки. Странно, что работает. Могло и не получиться.