Files
kolibrios/programs/develop/examples/example/rus/example.asm
T
ace-dent 0cd3b0c5b1 programs/develop: Post-SVN tidy (part 1) (#419)
- 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>
2026-04-11 10:25:59 +00:00

168 lines
5.9 KiB
FASM
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; Простой пример программы для 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, но это не правильно.
; Имена меток могут быть с любыми названиями, главное соблюдать
; правильный порядок их расположения.