- Move source code from `trunk` into root directory for each program. - Update build files and ASM include paths. Add SPDX license header where appropriate. - Note: Line endings standardised from `CRLF` > `LF`, so best to view diffs with whitespace changes hidden. (Work towards #75, point 3) Reviewed-on: KolibriOS/kolibrios#419 Co-authored-by: Andrew <dent.ace@gmail.com> Co-committed-by: Andrew <dent.ace@gmail.com>
168 lines
5.9 KiB
FASM
168 lines
5.9 KiB
FASM
; Простой пример программы для KolibriOS
|
||
; озвучивает код нажатой клавиши
|
||
;
|
||
; Компилировать FASM'ом
|
||
; Можно открыть example.asm через программу FASM (её ярлык есть
|
||
; на рабочем столе)
|
||
; А можно просто нажать F9 в Tinypad'е. Лог компиляции
|
||
; отображается на доске отладки (программа BOARD)
|
||
;
|
||
; Что важно знать при программировании под Колибри:
|
||
; Номер функции помещается в регистр eax.
|
||
; Вызов системной функции осуществляется командой "int 0x40".
|
||
; Все регистры, кроме явно указанных в возвращаемом значении,
|
||
; включая регистр флагов eflags, сохраняются.
|
||
;
|
||
; Пример:
|
||
; mov eax, 1 ;Функция 1 - поставить точку в окне
|
||
; ;список сисфункций см. в DOCPACK - sysfuncr.txt
|
||
; mov ebx, 10 ; координата x=10
|
||
; mov ecx, 20 ; координата y=10
|
||
; mov edx, 0xFFFfff ;цвет точки
|
||
; int 0x40 ;вызвать функцию
|
||
;
|
||
; Тоже самое с использованием макроса:
|
||
; mcall 1, 10, 20, 0xFFFfff
|
||
;---------------------------------------------------------------------
|
||
|
||
use32 ; включить 32-битный режим ассемблера
|
||
org 0 ; адресация с нуля
|
||
|
||
db 'MENUET01' ; 8-байтный идентификатор MenuetOS
|
||
dd 1 ; версия заголовка (1 либо 2, см. док-ю)
|
||
dd START ; адрес первой команды
|
||
dd I_END ; размер программы
|
||
dd MEM ; количество памяти
|
||
dd STACKTOP ; адрес вершины стэка
|
||
dd 0 ; адрес буфера для параметров
|
||
dd 0 ; зарезервировано
|
||
|
||
include "macros.inc" ; макросы облегчают жизнь ассемблерщиков!
|
||
|
||
;---------------------------------------------------------------------
|
||
;--- НАЧАЛО ПРОГРАММЫ ----------------------------------------------
|
||
;---------------------------------------------------------------------
|
||
|
||
START:
|
||
|
||
red: ; перерисовать окно
|
||
|
||
call draw_window ; вызываем процедуру отрисовки окна
|
||
|
||
;---------------------------------------------------------------------
|
||
;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ----------------------------------------
|
||
;---------------------------------------------------------------------
|
||
|
||
still:
|
||
mcall 10 ; функция 10 - ждать события
|
||
|
||
cmp eax,1 ; перерисовать окно ?
|
||
je red ; если да - на метку red
|
||
cmp eax,2 ; нажата клавиша ?
|
||
je key ; если да - на key
|
||
cmp eax,3 ; нажата кнопка ?
|
||
je button ; если да - на button
|
||
|
||
jmp still ; если другое событие - в начало цикла
|
||
|
||
|
||
;---------------------------------------------------------------------
|
||
|
||
|
||
key: ; нажата клавиша на клавиатуре
|
||
mcall 2 ; функция 2 - считать код символа (в ah)
|
||
|
||
mov [Music+1], ah ; записать код символа как код ноты
|
||
|
||
; функция 55-55: системный динамик ("PlayNote")
|
||
; esi - адрес мелодии
|
||
|
||
; mov eax,55
|
||
; mov ebx,eax
|
||
; mov esi,Music
|
||
; int 0x40
|
||
|
||
; или коротко:
|
||
mcall 55, eax, , , Music
|
||
|
||
jmp still ; вернуться к началу цикла
|
||
|
||
;---------------------------------------------------------------------
|
||
|
||
button:
|
||
mcall 17 ; 17 - получить идентификатор нажатой кнопки
|
||
|
||
cmp ah, 1 ; если НЕ нажата кнопка с номером 1,
|
||
jne still ; вернуться
|
||
|
||
.exit:
|
||
mcall -1 ; иначе конец программы
|
||
|
||
|
||
;---------------------------------------------------------------------
|
||
;--- ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ----------------------------------
|
||
;---------------------------------------------------------------------
|
||
|
||
draw_window:
|
||
|
||
mcall 12, 1 ; функция 12: сообщить ОС о начале отрисовки
|
||
|
||
mcall 48, 3, sc,sizeof.system_colors
|
||
|
||
; далее: сначала длинный вариант (закомментированный)
|
||
; затем короткий аналог с использованием макросов
|
||
|
||
; mov eax,0 ; функция 0: определить окно
|
||
; mov ebx,200*65536+300 ; [x старт] *65536 + [x размер]
|
||
; mov ecx,200*65536+150 ; [y старт] *65536 + [y размер]
|
||
; mov edx, [sc.work] ; цвет фона
|
||
; or edx, 0x33000000 ; и тип окна 3
|
||
; mov edi,header ; ЗАГОЛОВОК ОКНА
|
||
; int 0x40
|
||
|
||
mov edx, [sc.work] ; цвет фона
|
||
or edx, 0x33000000 ; и тип окна 3
|
||
mcall 0, <200,300>, <200,150>, , ,title
|
||
|
||
; вывод текстовой строки
|
||
mov ecx, [sc.work_text] ; цвет фона
|
||
or ecx, 0x90000000 ; и тип строки
|
||
mcall 4, <10, 20>, , message
|
||
|
||
|
||
mcall 12, 2 ; функция 12.2, закончили рисовать
|
||
|
||
ret ; выходим из процедуры
|
||
|
||
|
||
;---------------------------------------------------------------------
|
||
;--- ДАННЫЕ ПРОГРАММЫ ----------------------------------------------
|
||
;---------------------------------------------------------------------
|
||
|
||
; Вот такая вот короткая "мелодия".
|
||
; Второй байт изменяется нажатием клавишы
|
||
|
||
Music:
|
||
db 0x90, 0x30, 0
|
||
|
||
sc system_colors
|
||
|
||
message db 'Нажмите любую клавишу...',0
|
||
title db 'Пример программы',0
|
||
|
||
;---------------------------------------------------------------------
|
||
|
||
I_END: ; метка конца программы
|
||
rb 4096 ; память для стека
|
||
align 16
|
||
STACKTOP: ; метка вершины стека (при заполнении стек
|
||
; растет в сторону уменьшения адресов, потому
|
||
; память для него в коде программы встречается
|
||
; раньше чем его вершина)
|
||
MEM: ; метка указывающая на конец программы плюс
|
||
; размер используемой ею оперативной памяти
|
||
; Адрес метки MEM всегда должен быть больше чем адрес метки I_END.
|
||
; Метка STACKTOP должна располагается после метки I_END и перед меткой
|
||
; MEM. STACKTOP может находится и перед I_END, но это не правильно.
|
||
; Имена меток могут быть с любыми названиями, главное соблюдать
|
||
; правильный порядок их расположения. |