Наперёд забегая, отвечу на возможно возникшие вопросы, у того, кого это творение заинтересовало.
Ну на вопрос, - «Что такое DAK, для чего и для кого он?», - я уже ответил выше.
Почему название именно "DAK"? - да всё очень просто, - аббревиатура Delphi-Asm-Kolibri, подумал, что такое название вполне годится.
Под какую ОС данный продукт ? - Под Windows (XP).
Давно ли я начал его разрабатывать? - недели три как я его начал разрабатывать, это заодно и ответ на вопрос о его состоянии. А состояние его, - «сырое», «расшатанное». «кишащее» кучей ошибок, да и вообще назвать его продуктом или даже полуфабрикатом очень сложно, - это просто начальная стадия продукта.
Зачем же я его выкладываю в таком состоянии? - Для того, чтобы дать знать, о том, что я начал заниматься разработкой такой «диковинки». Возможно, она кого-то заинтересует и будут появляться вопросы и предложения по усовершенствованию в нужную сторону. Чтобы это всё происходило постепенно, а не после того как я выложу более-менее готовый продукт.
Когда будет продукт пригодным для полноценного использования? - Никогда! Как и любые другие программы, ЯВУ и среды разработок, которые разрабатываются и усовершенствуются годами, десятилетиями. Я лично, буду считать его готовым, полноценным продуктом, тогда, когда смогу на нём создать пример SAS Emulatora ( viewtopic.php?f=43&t=3253 ). А пределом совершенства ”DAK”-а, буду считать когда на этом ”DAK”-е, который под Windows (XP), смогу написать DAK для КОС.
Будет ли DAK будет полной аналогией Pascal (Delphi) по мнемонике написания? По возможности, да. Хотя не обойдётся без всевозможных спецификаций связанных с моим желанием использовать, среду Delphi для предварительного редактирования и проверки синтаксиса, перед использованием DAKа. Например, написание директив Pascal (Delphi) и DAKа отличаются. В Pascal (Delphi) директивы «{$...}”, а в DAKе, - «{#...}”. Это сделано для того, чтобы не возникало конфликта директив. Хотя не исключено, что в конце-концов, директивы с мнемоникой написания в Pascal (Delphi) , DAK тоже будет обрабатывать. Время покажет.
DAK можно использовать только при наличии Delphi ? DAK можно использовать без наличия Delphi, он будет работать, т. е. преобразовывать, также, как и например, Fasm в исполнительный код. Но, очень настоятельная рекомендация, чтобы перед использованием DAKа, файлы были проверены на ошибки, какой-нибудь Паскелеподобдной средой программирования, поскольку проверка синтаксиса в DAKе, и сообщения об ошибках, еще долго будут желать лучшего! А может, и вообще, эта проверка синтаксиса, в DAK, никогда не будет совершенной!
Почему автор пишет продукт который предполагает наличие и использование Delphi ? Автор не в состоянии написать, такую полноценную проверку синтаксиса которая есть в Pascal (Delphi), а также, при использовании среды Delphi, можно полностью автоматизировать процесс написания кода для КОС. т. е. пишешь код в среде Delphi, сохраняешь, нажимаешь «Запустить», само собой Delphi проверит на ошибки, а далее запустит DAK для преобразования кода в асм-код-КОС, далее Delphi запустит Fasm который скомпилирует преобразованное DAKом и конце-концов, запустит готовый код на исполнение в KlbrInWin или же в QEMU, (если конечно кто-то знает как это сделать в QEMU) .
Возможно ли зависание (зацикливание) DAKа ? Не должно конечно такого быть, хотя, всего ведь не учтёшь и не рассчитаешь! Если, будет, что-то подобное, - подробно напишите, буду устранять! Для того, чтобы уменьшить вероятность зависания (зацикливания) DAKа, повторюсь, - делайте предварительную проверку синтаксиса средами Pascal (Delphi).
Пример кода который на данный момент в состоянии обработать DAK:
Spoiler:
{#BEGIN SECTION PROJECT DAK}{#NOT SHOW REPORT SUCCESSFUL COMPILING}
{#START CompileProject.bat} {#START RunProject.bat}
const
SF_CREATE_WINDOW=0; {Функция 0 - определить и нарисовать окно.}
SF_GET_KEY=2;{Функция 2 - получить код нажатой клавиши}
SF_WAIT_EVENT=10;{Функция 10 - ожидать события}
SF_CHECK_EVENT=11;{Функция 11 - проверить, есть ли событие, без ожидания.}
SF_REDRAW=12;{Функция 12 - начать/закончить перерисовку окна.}
SSF_BEGIN_DRAW=1; {Подфункция 1 - начать перерисовку окна.}
SSF_END_DRAW=2; {Подфункция 2 - закончить перерисовку окна.}
SF_DRAW_RECT=13; { Функция 13 - нарисовать прямоугольник в окне.}
SF_GET_BUTTON=17;{Функция 17 - получить код нажатой кнопки.}
procedure CREATE_WINDOW; {Функция 0 - определить и нарисовать окно.}
begin
EAX:=SF_CREATE_WINDOW;
int0x40;
end;
procedure GET_KEY; {Функция 2 - получить код нажатой клавиши}
begin
EAX:=SF_GET_KEY;int0x40;
end;
procedure WAIT_EVENT; {Функция 10 - ожидать события}
begin
EAX:=SF_WAIT_EVENT; int0x40;
end;
procedure CHECK_EVENT; {Функция 11 - проверить, есть ли событие, без ожидания.}
begin
EAX:=SF_CHECK_EVENT; int0x40;
end;
procedure REDRAW; {Функция 12 - начать/закончить перерисовку окна.} {Подфункция 1 - начать перерисовку окна.}
begin
EAX:=SF_REDRAW; int0x40;
end;
procedure DRAW_RECT; { Функция 13 - нарисовать прямоугольник в окне.}
begin
EAX:=SF_DRAW_RECT; int0x40;
end;
procedure GET_BUTTON; {Функция 17 - получить код нажатой кнопки.}
begin
EAX:=SF_GET_BUTTON;int0x40;
end;
procedure CycleProcesEvents; // ЦИКЛ ОБРАБОТКИ СОБЫТИЙ
Label CycleProcesEventsL, CycleProcesEvents_ret,DrawWindow,key,button,exit,My1;
Begin
CycleProcesEventsL:
CHECK_EVENT;
If EAX =0 then goto CycleProcesEvents_ret;
WAIT_EVENT;
If EAX=1 then goto DrawWindow;
If EAX=2 then goto key;
If EAX=3 then goto button;
RET;
DrawWindow:
EBX:=SSF_BEGIN_DRAW; REDRAW;
EBX:=655910; ECX:=655860; EDX:=866827212; CREATE_WINDOW;
EBX:=SSF_END_DRAW; REDRAW;
goto CycleProcesEventsL;
key:
GET_KEY;
goto CycleProcesEventsL;
button:
GET_BUTTON;
if AH<>1 then goto CycleProcesEventsL;
exit: Halt;
CycleProcesEvents_ret:
end;
procedure BEGINPROGRAM; {#START PROJECT DAK}
label CycleProgram;
begin
CycleProgram:
CycleProcesEvents;
EBX:=1311220; ECX:=1311150; EDX:=16711680; DRAW_RECT;
EBX:=1966560; ECX:=1966490; EDX:=65280; DRAW_RECT;
EBX:=1966560; ECX:=1966490; EDX:=255; DRAW_RECT;
goto CycleProgram;
end;
{#END SECTION PROJECT DAK}
Spoiler:
use32 ; включить 32-битный режим ассемблераorg 0x0 ; адресация с нуля
db 'MENUET01' ; 8-байтный идентификатор MenuetOS
dd 0x01 ; версия заголовка (всегда 1)
dd START ; адрес первой команды
dd I_END ; размер программы
dd 1700000 ; количество памяти
dd 1700000 ; адрес вершины стэка
dd 0x0 ; адрес буфера для параметров
dd 0x0 ; зарезервировано
;---------------------------------------------------------------------
uMAIN_pCREATE_WINDOW:
mov EAX , uMAIN_cSF_CREATE_WINDOW
INT 0x40
RET
uMAIN_pGET_KEY:
mov EAX , uMAIN_cSF_GET_KEY
INT 0x40
RET
uMAIN_pWAIT_EVENT:
mov EAX , uMAIN_cSF_WAIT_EVENT
INT 0x40
RET
uMAIN_pCHECK_EVENT:
mov EAX , uMAIN_cSF_CHECK_EVENT
INT 0x40
RET
uMAIN_pREDRAW:
mov EAX , uMAIN_cSF_REDRAW
INT 0x40
RET
uMAIN_pDRAW_RECT:
mov EAX , uMAIN_cSF_DRAW_RECT
INT 0x40
RET
uMAIN_pGET_BUTTON:
mov EAX , uMAIN_cSF_GET_BUTTON
INT 0x40
RET
uMAIN_pCYCLEPROCESEVENTS:
uMAIN_pCYCLEPROCESEVENTS_mCYCLEPROCESEVENTSL:
CALL uMAIN_pCHECK_EVENT
cmp EAX , 0
je uMAIN_pCYCLEPROCESEVENTS_mCYCLEPROCESEVENTS_RET
CALL uMAIN_pWAIT_EVENT
cmp EAX , 1
je uMAIN_pCYCLEPROCESEVENTS_mDRAWWINDOW
cmp EAX , 2
je uMAIN_pCYCLEPROCESEVENTS_mKEY
cmp EAX , 3
je uMAIN_pCYCLEPROCESEVENTS_mBUTTON
RET
uMAIN_pCYCLEPROCESEVENTS_mDRAWWINDOW:
mov EBX , uMAIN_cSSF_BEGIN_DRAW
CALL uMAIN_pREDRAW
mov EBX , 655910
mov ECX , 655860
mov EDX , 866827212
CALL uMAIN_pCREATE_WINDOW
mov EBX , uMAIN_cSSF_END_DRAW
CALL uMAIN_pREDRAW
JMP uMAIN_pCYCLEPROCESEVENTS_mCYCLEPROCESEVENTSL
uMAIN_pCYCLEPROCESEVENTS_mKEY:
CALL uMAIN_pGET_KEY
JMP uMAIN_pCYCLEPROCESEVENTS_mCYCLEPROCESEVENTSL
uMAIN_pCYCLEPROCESEVENTS_mBUTTON:
CALL uMAIN_pGET_BUTTON
cmp AH , 1
jne uMAIN_pCYCLEPROCESEVENTS_mCYCLEPROCESEVENTSL
uMAIN_pCYCLEPROCESEVENTS_mEXIT:
JMP HALT
uMAIN_pCYCLEPROCESEVENTS_mCYCLEPROCESEVENTS_RET:
RET
uMAIN_pBEGINPROGRAM:
uMAIN_pBEGINPROGRAM_mCYCLEPROGRAM:
CALL uMAIN_pCYCLEPROCESEVENTS
mov EBX , 1311220
mov ECX , 1311150
mov EDX , 16711680
CALL uMAIN_pDRAW_RECT
mov EBX , 1966560
mov ECX , 1966490
mov EDX , 65280
CALL uMAIN_pDRAW_RECT
mov EBX , 1966560
mov ECX , 1966490
mov EDX , 255
CALL uMAIN_pDRAW_RECT
JMP uMAIN_pBEGINPROGRAM_mCYCLEPROGRAM
RET
START:
START_PROJECT:
Call uMAIN_pBEGINPROGRAM
END_PROJECT:
HALT:
mov EAX,4294967295
int 0x40
I_END:
uMAIN_cSF_CREATE_WINDOW = 0
uMAIN_cSF_GET_KEY = 2
uMAIN_cSF_WAIT_EVENT = 10
uMAIN_cSF_CHECK_EVENT = 11
uMAIN_cSF_REDRAW = 12
uMAIN_cSSF_BEGIN_DRAW = 1
uMAIN_cSSF_END_DRAW = 2
uMAIN_cSF_DRAW_RECT = 13
uMAIN_cSF_GET_BUTTON = 17