Super Typer/ru

From KolibriOS wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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:	 ; Указатель на конец файла и начало набираемой строки