Super Typer/ru

De KolibriOS wiki
Aller à la navigation Aller à la recherche

Super Typer -- программа для KolibriOS, написанная Ксениусом. Является примером программирования, более интересным, чем Hello World, но тем не менее достаточно простым для понимания.

Исходный код версии от 16.04.2007:

; Super Typer 1.0 beta предоставит вам потрясающие
; возможности по выводу на экран строки, набираемой вами.
; Copyleft (c) Xenius, 2007
; Вы можете свободно распространять, изменять и использовать
; данную программу на условиях GNU GPL (см www.gnu.org).
; Часть программы основана на bye.asm из статьи
; "Прикладное программирование для Kolibri OS. Вводный курс.", написанной Johnny_B

use32 ; используюся 32-х разрядные команды
; Заголовок, используется Kolibri OS для запуска программы 
  db 'MENUET01'   ; 1. идентификатор исполняемого файла (8 байт)
  dd 0x01	  ; 2. версия формата заголовка исполняемого файла
  dd START	  ; 3. адрес, на который система передаёт управление
  dd I_END	  ; 4. размер приложения
  dd I_END+0x1000 ; 5. объём необходимой приложению памяти
  dd I_END+0x1000 ; 6. вершина стека в диапазоне памяти, указанном выше
  dd 0x0	  ; 7. указатель на строку с параметрами.
  dd 0x0	  ; 8. указатель на строку, в которую записан путь запуска

START:			     ; адрес начала программы    
	call	draw_window  ; вызываем функцию рисования окна
	xor	esi,esi      ; инициализируем счетчик символов
; затем переходим в цикл ожидания событий
event_wait:
	mov	eax,10	     ; функция 10: ожидание событие,
	int	0x40	     ; его тип возвращён в eax
	cmp	eax,1	     ; запрос на перерисовку?
	je	redraw	  
	cmp	eax,2	     ; нажата клавиша?
	je	key
	cmp	eax,3	     ; нажата кнопка в окне программы?
	je	button
	jmp	event_wait   ; возвращаемся к началу цикла ожидания событий
; после того, как событие идентифицировано, его надо обработать
redraw:
	call	draw_window  ; вызываем функцию draw_window и
	jmp	event_wait   ; возвращаемся назад к циклу ожидания
key:
	mov	eax,2	     ; считываем код нажатой клавиши. Возвращен в ah.
	int	0x40
	mov	[I_END+esi],ah	; запишем этот код в конец строки
	inc	esi		; увеличим счетчик символов
	cmp	esi,255 	; проверка переполнения строки
	jg	owerflow
	call	typing		; выводим эту строку
	jmp	event_wait
 owerflow:			; при переполнении строки
	xor	esi,esi 	; очистить ее
	jmp	redraw		; и перерисовать окно
button:
	mov	eax,17	     ; считываем идентификатор нажатой кнопки
	int	0x40	     ; возвращен ah.
; смотрим, какая кнопка была нажата и соответствующим образом реагируем.
	cmp	ah,1	     ; кнопка с id=1("закрыть")?
	jne	noclose
  clouse:
	mov	eax,-1	     ; функция -1: завершить программу
	int	0x40
  noclose:
; здесь проверяем остальные кнопки
	jmp	event_wait   ; и, конечно, возвращаемся к циклу ожидания :)


draw_window:			      ; функция отрисовки окна
	mov	eax,12
	mov	ebx,1		      ; начало перерисовки
	int	0x40
				      ; ОКНО
	xor	eax,eax 	      ; функция 0: определить и вывести окно
	mov	ebx,100*65536+300     ; [x начальный] *65536 + [x размер]
	mov	ecx,100*65536+120     ; [y начальный] *65536 + [y размер]
	mov	edx,0x13ffffff	      ; цвет рабочей области RRGGBB и стиль окна
	mov	edi,text	      ; текст в заголовке
	int	0x40

	call	typing		      ; набранную строчку тоже надо перерисовать

	mov	eax,12
	mov	ebx,2		      ; перерисовка окна окончена
	int	0x40
	ret			      ; конец функции
typing: 			      ; функция прорисовки набираемой строки
	mov	eax,4		      ; четвертая функция рисует строку
	mov	ebx,6*65536+30	      ; координаты начала строки
	mov	ecx,0x00000000	      ; черный моноширинный шрифт
	mov	edx,I_END	      ; указатель на начало строки
	int	0x40		      ; вызов прерывания Kolibri OS
	ret			      ; возврат к точке вызова
; ДАННЫЕ ПРОГРАММЫ
text db 'Type something:',0
I_END:	 ; Указатель на конец файла и начало набираемой строки