;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                               ;;
;;          DEVICE SETUP         ;;
;;                               ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; version:      1.16
; last update:  12/04/2014
; changed by:   Yurii Shevtsov, aka gtament
; changes:      Fixed junk draw at the bottom of window
;---------------------------------------------------------------------
; version:      1.15
; last update:  20/04/2012
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
; changes:      Add the flag of speaker mute.
;               Correcting setup.dat
;---------------------------------------------------------------------
; version:      1.14
; last update:  20/03/2012
; changed by:   Marat Zakiyanov aka Mario79, aka Mario
; changes:      optimisations and code refactoring
;---------------------------------------------------------------------
; Authors: Ville       - original version
;          A. Ivushkin - autostart (w launcher)
;          M. Lisovin  - added many feauters (apply all, save all, set time...)
;          I. Poddubny - fixed russian keymap
;14/08/06  Mario79 - added regulation of mouse features
;-------------------------------------------------------------------------------
format binary as ""

	use32
	org 0x0

	db 'MENUET01'	; 8 byte identifier
	dd 0x01 	; header version
	dd START	; pointer to program start
	dd IM_END	; size of image
	dd I_END	; reguired amount of memory
	dd stack_area	; stack pointer (esp)
	dd boot_param	; boot parameters
	dd 0x0		; path
;-------------------------------------------------------------------------------
include '../../../macros.inc'
;-------------------------------------------------------------------------------
LLL equ (56+3)
BBB equ 25
;-------------------------------------------------------------------------------
apply_all:
	call	_pci_acc    ;12
	call	_syslang    ;5
	call	_keyboard    ;2
	call	_mouse_speed
	call	_mouse_delay
	call	_speaker_mute
	ret
;-------------------------------------------------------------------------------
apply_all_and_exit:
	mcall	70,read_fileinfo
	call	apply_all
	jmp	close
;-------------------------------------------------------------------------------
set_language_and_exit:
	mcall	26,2,9
	cmp	eax,1
	je	russian

	xor	eax,eax
;--------------------------------------
set_lang_now:
	mov	[keyboard],eax
	call	_keyboard
	jmp	close
;--------------------------------------
russian:
	mov	eax,3
	jmp	set_lang_now
;-------------------------------------------------------------------------------
set_syslanguage_and_exit:
	mcall	26,5
	cmp	eax,6
	jne	temp
	xor	eax,eax
;--------------------------------------
temp:
	inc	eax
	mov	[syslang],eax
	call	_syslang
	jmp	close
;-------------------------------------------------------------------------------
get_setup_values:
	mcall	26,2,9
	dec	eax
	mov	[keyboard],eax

	mcall	26,5
	mov	[syslang],eax

	mcall	26,11
	mov	[lba_read],eax

	mcall	26,12
	mov	[pci_acc],eax

	mcall	18,19,0
	mov	[mouse_speed],eax

	mcall	18,19,2
	mov	[mouse_delay],eax

	mcall	18,8,1
	mov	[speaker_mute],eax
	ret
;-------------------------------------------------------------------------------
START:
	mov	eax,boot_param
	cmp	[eax],dword 'SLAN'
	je	set_syslanguage_and_exit

	cmp	[eax],dword 'LANG'
	je	set_language_and_exit

	cmp	[eax],dword 'BOOT'
	je	apply_all_and_exit

	call	get_setup_values
	call	loadtxt
	call	draw_infotext
;-------------------------------------------------------------------------------
red:
	call	draw_window
;-------------------------------------------------------------------------------
still:
sysevent:
	mcall	23,8	      ; wait here for event with timeout
	cmp	eax,1
	jz	red

	cmp	eax,2
	jz	key

	cmp	eax,3
	jz	button

	jmp	still
;-------------------------------------------------------------------------------
key:
	mcall	2
	jmp	still
;-------------------------------------------------------------------------------
button:
	mcall	17
	cmp	ah,99
	jne	nosaveall
	mcall	70,save_fileinfo
	jmp	still
;--------------------------------------
nosaveall:
	cmp	ah,100
	jne	no_apply_all
	call	apply_all
	jmp	still
;--------------------------------------
no_apply_all:
	cmp	ah,1	; CLOSE APPLICATION
	jne	no_close
;--------------------------------------
close:
	or	eax,-1
	mcall
;--------------------------------------
no_close:
	cmp	ah,4	; SET KEYBOARD
	jnz	nokm
	mov	eax,[keyboard]
	test	eax,eax
	je	downuplbl
	dec	eax
	jmp	nodownup
;--------------------------------------
downuplbl:
	mov	eax,7
;--------------------------------------
nodownup:
	mov	[keyboard],eax
	call	draw_infotext
;--------------------------------------
nokm:
	cmp	ah,5
	jnz	nokp
	mov	eax,[keyboard]
	cmp	eax,7
	je	updownlbl
	inc	eax
	jmp	noupdown
;--------------------------------------
updownlbl:
	xor	eax,eax
;--------------------------------------
noupdown:
	mov	[keyboard],eax
	call	draw_infotext
;--------------------------------------
nokp:
	cmp	ah,92	; SET LBA READ
	jne	no_lba_d
;--------------------------------------
slbal:
	btc	[lba_read],0
	call	draw_infotext
	jmp	still
;--------------------------------------
no_lba_d:
	cmp	ah,93
	jne	no_lba_i
	jmp	slbal
;--------------------------------------
no_lba_i:
	cmp	ah,91
	jne	no_set_lba_read
	call	_lba_read
	jmp	still
;--------------------------------------
no_set_lba_read:
	cmp	ah,102	; SET PCI ACCESS
	jne	no_pci_d
;--------------------------------------
pcip:
	btc	[pci_acc],0
	call	draw_infotext
	jmp	still
;--------------------------------------
no_pci_d:
	cmp	ah,103
	jne	no_pci_i
	jmp	pcip
;--------------------------------------
no_pci_i:
	cmp	ah,101
	jne	no_set_pci_acc
	call	_pci_acc
	jmp	still
;--------------------------------------
no_set_pci_acc:
	cmp	ah,42	; SET SYSTEM LANGUAGE BASE
	jnz	nosysm
	mov	eax,[syslang]
	dec	eax
	jz	still
	mov	[syslang],eax
	call	draw_infotext
;--------------------------------------
nosysm:
	cmp	ah,43
	jnz	nosysp
	mov	eax,[syslang]
	cmp	eax,6
	je	nosysp
	inc	eax
	mov	[syslang],eax
	call	draw_infotext
;--------------------------------------
nosysp:
	cmp	ah,41
	jnz	nosyss
	call	_syslang
	call	cleantxt
	call	loadtxt
	call	draw_window
;--------------------------------------
nosyss:
	cmp	ah,132	; SET MOUSE SPEED
	jnz	.nominus
	mov	eax,[mouse_speed]
	sub	eax,2
	cmp	eax,9
	jb	@f
	mov	eax,8
;--------------------------------------
@@:
	inc	eax
	mov	[mouse_speed],eax
	call	draw_infotext
;--------------------------------------
.nominus:
	cmp	ah,133
	jnz	.noplus
	mov	eax,[mouse_speed]
	cmp	eax,9
	jb	@f
	mov	eax,0
;--------------------------------------
@@:
	inc	eax
	mov	[mouse_speed],eax
	call	draw_infotext
;--------------------------------------
.noplus:
	cmp	ah,131
	jnz	.noapply
	call	_mouse_speed
;--------------------------------------
.noapply:
mousedelay:
	cmp	ah,142	      ; SET MOUSE DELAY
	jnz	.nominus
	mov	eax,[mouse_delay]
	sub	eax,2
	cmp	eax,0xfff
	jb	@f
	mov	eax,0xffe
;--------------------------------------
@@:
	inc	eax
	mov	[mouse_delay],eax
	call	draw_infotext
;--------------------------------------
.nominus:
	cmp	ah,143
	jnz	.noplus
	mov	eax,[mouse_delay]
	cmp	eax,0xfff
	jb	@f
	mov	eax,0
;--------------------------------------
@@:
	inc	eax
	mov	[mouse_delay],eax
	call	draw_infotext
;--------------------------------------
.noplus:
	cmp	ah,141
	jnz	speakermute
	call	_mouse_delay
;--------------------------------------
speakermute:
	cmp	ah,152	; SET SPEAKER
	jne	no_speaker_d
;--------------------------------------
speaker_p:
	btc	[speaker_mute],0
	call	draw_infotext
	jmp	still
;--------------------------------------
no_speaker_d:
	cmp	ah,153
	jne	no_speaker_i
	jmp	speaker_p
;--------------------------------------
no_speaker_i:
	cmp	ah,151
	jne	.noapply
	call	_speaker_mute
	jmp	still
;--------------------------------------
.noapply:
	cmp	ah,3	      ; SET KEYMAP
	jne	still
	call	_keyboard
	jmp	still
;-------------------------------------------------------------------------------
_keyboard:
	cmp	[keyboard],0	; english
	jnz	nosetkeyle

	mcall	21,2,1,en_keymap

	inc	ecx
	mcall	21,,,en_keymap_shift

	mcall	21,,9,1
	call	alt_gen
;--------------------------------------
nosetkeyle:
	cmp	[keyboard],1	; finnish
	jnz	nosetkeylfi

	mcall	21,2,1,fi_keymap

	inc	ecx
	mcall	21,,,fi_keymap_shift

	mcall	21,,9,2
	call	alt_gen
;--------------------------------------
nosetkeylfi:
	cmp  [keyboard],2	; german
	jnz  nosetkeylge

	mcall	21,2,1,ge_keymap

	inc	ecx
	mcall	21,,,ge_keymap_shift

	mcall	21,,9,3
	call	alt_gen
;--------------------------------------
nosetkeylge:
	cmp	[keyboard],3	; russian
	jnz	nosetkeylru

	mcall	21,2,1,ru_keymap

	inc	ecx
	mcall	21,,,ru_keymap_shift

	mcall	21,,9,4
	call	alt_gen
;--------------------------------------
nosetkeylru:
	cmp	[keyboard],4	;french
	jnz	nosetkeylfr

	mcall	21,2,1,fr_keymap

	inc	ecx
	mcall	21,,,fr_keymap_shift

	inc  ecx
	mcall	21,,,fr_keymap_alt_gr

	mcall	21,,9,5
;--------------------------------------
nosetkeylfr:
	cmp	[keyboard],5	; estonian
	jnz	nosetkeylet

	mcall	21,2,1,et_keymap

	inc	ecx
	mcall	21,,,et_keymap_shift

	mcall	21,,9,6
	call	alt_gen
;--------------------------------------
nosetkeylet:
	cmp	[keyboard],6	;belgian
	jnz	nosetkeylit

	mcall	21,2,1,be_keymap

	inc	ecx
	mcall	21,,,be_keymap_shift

	inc  ecx
	mcall	21,,,be_keymap_alt_gr

	mcall	21,,9,7
;--------------------------------------
nosetkeylit:
	cmp	[keyboard],7	;italian
	jnz	nosetkeylbe

	mcall	21,2,1,it_keymap

	inc	ecx
	mcall	21,,,it_keymap_shift

	inc	ecx
	mcall	21,,,it_keymap_alt_gr

	mcall	21,,9,8
;--------------------------------------

nosetkeylbe:
	ret
;-------------------------------------------------------------------------------
alt_gen:
	mcall	21,,3,alt_general
	ret
;-------------------------------------------------------------------------------
draw_buttons:
	pusha
	shl  ecx,16
	add  ecx,12
	mcall	8,<(350-57),(46+BBB)>

	inc	edx
	mcall	,<(350-85),9>

	inc	edx
	mcall	,<(350-73),9>

	popa
	ret
;-------------------------------------------------------------------------------
; ********************************************
; ******* WINDOW DEFINITIONS AND DRAW  *******
; ********************************************
draw_window:
	pusha
	mcall	12,1

	xor	eax,eax       ; DRAW WINDOW
	xor	esi,esi
	mcall	,<40,(355+BBB)>,<40,(12*16)>,0xB4111199,,title

	mcall	9,procinfo,-1

	mov	eax,[ebx+70] ;status of window
	test	eax,100b
	jne	.end

	mcall	8,<(350-85),100>,<(5+16*8),12>,100,0x005588dd	; APPLY ALL

	add	ecx,16*65536	      ; SAVE ALL
	dec	edx
	mcall

	mov	esi,0x5580c0

	mov	edx,41
	mov	ecx,5+0*8
	call	draw_buttons

	mov	edx,3
	mov	ecx,5+2*8
	call	draw_buttons

	mov	edx,91
	mov	ecx,5+4*8
	call	draw_buttons

	mov	edx,101
	mov	ecx,5+6*8
	call	draw_buttons

	mov	edx,131
	mov	ecx,5+8*8
	call	draw_buttons

	mov	edx,141
	mov	ecx,5+10*8
	call	draw_buttons

	mov	edx,151
	mov	ecx,5+12*8
	call	draw_buttons

	call	draw_infotext
.end:
	mcall	12,2
	popa
	ret
;-------------------------------------------------------------------------------
draw_infotext:
	pusha
	mov	eax,[keyboard]	     ; KEYBOARD
	test	eax,eax
	jnz	noen
	mov	[text00+LLL*1+28],dword 'ENGL'
	mov	[text00+LLL*1+32],dword 'ISH '
;--------------------------------------
noen:
	cmp	eax,1
	jnz	nofi
	mov	[text00+LLL*1+28],dword 'FINN'
	mov	[text00+LLL*1+32],dword 'ISH '
;--------------------------------------
nofi:
	cmp	eax,2
	jnz	noge
	mov	[text00+LLL*1+28],dword 'GERM'
	mov	[text00+LLL*1+32],dword 'AN  '
;--------------------------------------
noge:
	cmp	eax,3
	jnz	nogr
	mov	[text00+LLL*1+28],dword 'RUSS'
	mov	[text00+LLL*1+32],dword 'IAN '
;--------------------------------------
nogr:
	cmp	eax,4
	jnz	nofr
	mov	[text00+LLL*1+28],dword 'FREN'
	mov	[text00+LLL*1+32],dword 'CH  '
;--------------------------------------
nofr:
	cmp	eax,5
	jnz	noet
	mov	[text00+LLL*1+28],dword 'EEST'
	mov	[text00+LLL*1+32],dword 'I   '
;--------------------------------------
noet:
	cmp	eax,6
	jnz	nobe
	mov	[text00+LLL*1+28],dword 'BELG'
	mov	[text00+LLL*1+32],dword 'IAN '
;--------------------------------------
nobe:
	cmp	eax,7
	jnz	noit
	mov	[text00+LLL*1+28],dword 'ITAL'
	mov	[text00+LLL*1+32],dword 'IAN'
;--------------------------------------
noit:
	mov	eax,[syslang]		  ; SYSTEM LANGUAGE
	dec	eax
	test	eax,eax
	jnz	noen5
	mov	[text00+LLL*0+28],dword 'ENGL'
	mov	[text00+LLL*0+32],dword 'ISH '
;--------------------------------------
noen5:
	cmp	eax,1
	jnz	nofi5
	mov	[text00+LLL*0+28],dword 'FINN'
	mov	[text00+LLL*0+32],dword 'ISH '
;--------------------------------------
nofi5:
	cmp	eax,2
	jnz	noge5
	mov	[text00+LLL*0+28],dword 'GERM'
	mov	[text00+LLL*0+32],dword 'AN  '
;--------------------------------------
noge5:
	cmp	eax,3
	jnz	nogr5
	mov	[text00+LLL*0+28],dword 'RUSS'
	mov	[text00+LLL*0+32],dword 'IAN '
;--------------------------------------
nogr5:
	cmp	eax,4
	jne	nofr5
	mov	[text00+LLL*0+28],dword 'FREN'
	mov	[text00+LLL*0+32],dword 'CH  '
;--------------------------------------
nofr5:
	cmp	eax,5
	jne	noet5
	mov	[text00+LLL*0+28],dword 'EEST'
	mov	[text00+LLL*0+32],dword 'I   '
;--------------------------------------
noet5:
	mov	eax,[lba_read]
	call	onoff				; LBA READ
	mov	[text00+LLL*2+28],ebx

	mov	eax,[pci_acc]
	call	onoff				; PCI ACCESS
	mov	[text00+LLL*3+28],ebx

	mov	eax,[speaker_mute]
	call	onoff				; SPEAKER
	mov	[text00+LLL*6+28],ebx

	mov	eax,[mouse_speed]		; MOUSE SPEED
	add	al,48
	mov	[text00+LLL*4+28],al

	mov	eax,[mouse_delay]
	mov	esi,text00+LLL*5+32
	call	hexconvert			; MOUSE DELAY
	call	text_out

	popa
	ret
;-------------------------------------------------------------------------------
text_out:
	mcall	13,<165,85>,<0,(14*8)>,0x80111199	;0x80111199-19

	mov	edx,text00
	mov	ebx,3*65536+7
	mov	eax,4
	mov	ecx,0xffffff
	mov	esi,LLL
	mov	ebp,text1_strings
;--------------------------------------
newline:
	mcall
	add	ebx,8+8
	add	edx,esi
	dec	ebp
	jnz	newline

	mov	ebp,text2_strings
	add	ebx,8+8
;--------------------------------------
@@:
	mcall
	add	ebx,8+8
	add	edx,esi
	dec	ebp
	jnz	@b
	ret
;-------------------------------------------------------------------------------
hexconvert:	     ;converting dec to hex in ascii
	xor	ebx,ebx
	mov	bl,al
	and	bl,15
	add	ebx,hex
	mov	cl,[ebx]
	mov	[esi],cl
	shr	eax,4
	xor	ebx,ebx
	mov	bl,al
	and	bl,15
	add	ebx,hex
	mov	cl,[ebx]
	dec	esi
	mov	[esi],cl
	shr	eax,4
	xor	ebx,ebx
	mov	bl,al
	and	bl,15
	add	ebx,hex
	mov	cl,[ebx]
	dec	esi
	mov	[esi],cl
	ret
;-------------------------------------------------------------------------------
onoff:
	cmp	[syslang],4
	jne	norus1
	mov	ebx,'��  '
	cmp	eax,1
	je	exitsub
	mov	ebx,'��� '
	ret
norus1:
	cmp	[syslang],6
	jne	noet1
	mov	ebx,'SEES'
	cmp	eax,1
	je	exitsub
	mov	ebx,'V�L.'
	ret
;--------------------------------------
noet1:
	mov	ebx,'ON  '
	cmp	eax,1
	je	exitsub
	mov	ebx,'OFF '
;--------------------------------------
exitsub:
	ret
;-------------------------------------------------------------------------------
_lba_read:
	mcall	21,11,[lba_read]
	ret
;-------------------------------------------------------------------------------
_pci_acc:
	mcall	21,12,[pci_acc]
	ret
;-------------------------------------------------------------------------------
_syslang:
	mcall	21,5,[syslang]
	ret
;-------------------------------------------------------------------------------
_mouse_speed:
	mcall	18,19,1,[mouse_speed]
	ret
;-------------------------------------------------------------------------------
_mouse_delay:
	mcall	18,19,3,[mouse_delay]
	ret
;-------------------------------------------------------------------------------
_speaker_mute:
	mcall	18,8,1
	cmp	[speaker_mute],eax
	je	@f
	inc	ecx
	mcall	18
;--------------------------------------
@@:
	ret
;-------------------------------------------------------------------------------
loadtxt:
	mov	edi,text00
	mov	ecx,LLL*(text1_strings + text2_strings)/4+1
	cmp	[syslang],4
	jne	loadet

	mov	esi,textrus
	jmp	sload
loadet:
	mov	edi,text00
	mov	ecx,LLL*(text1_strings + text2_strings)/4+1
	cmp	[syslang],6
	jne	norus
		mov	esi,textet
	jmp	sload
;--------------------------------------
norus:
	mov	esi,texteng
;--------------------------------------
sload:
	rep	movsd
	ret
;-------------------------------------------------------------------------------
cleantxt:
	xor	eax,eax
	mov	ecx,LLL*(text1_strings + text2_strings)/4
	cld
	mov	edi,text00
	rep	stosd
	mov	[text00+1711],byte 'x'
	ret
;-------------------------------------------------------------------------------
; DATA AREA
count:		db 0x0
blinkpar:	dd 0x0
time:		dw 0x0
date:		dd 0x0
;-------------------------------------------------------------------------------
textrus:
	db '��� ��⥬�              : ENGLISH         - +   �ਬ�����'
	db '��᪫���� ����������      : ENGLISH         - +   �ਬ�����'
	db '������� LBA              : OFF             - +   �ਬ�����'
	db '����� � 設� PCI         : OFF             - +   �ਬ�����'
	db '������� ����� ���     : 1               - +   �ਬ�����'
	db '����প� �᪮७�� ���   : 0x00a           - +   �ਬ�����'
	db '�몫���� SPEAKER         : OFF             - +   �ਬ�����'

	db '��������:                                    �ਬ����� �� '
	db '�� �������� ��������� ���������              ���࠭��� �� '
;-------------------------------------------------------------------------------
texteng:
	db 'System language           : ENGLISH         - +     Apply  '
	db 'Keyboard layout           : ENGLISH         - +     Apply  '
	db 'LBA read enabled          : OFF             - +     Apply  '
	db 'PCI access for appl.      : OFF             - +     Apply  '
	db 'Mouse pointer speed       : 1               - +     Apply  '
	db 'Mouse pointer delay       : 0x00a           - +     Apply  '
	db 'SPEAKER disabled          : OFF             - +     Apply  '
text1_strings = 7

	db 'NOTE:                                           Apply all  '
	db 'SAVE YOUR SETTINGS BEFORE QUITING KOLIBRI       Save all   '
textet:
	db 'S�steemi keel             : ENGLISH         - +    Kinnita '
	db 'Klaviatuuri paigutus      : ENGLISH         - +    Kinnita '
	db 'LBA lugemine lubatud      : V�L.            - +    Kinnita '
	db 'PCI juurdep��s programm.  : V�L.            - +    Kinnita '
	db 'Hiire kursori kiirus      : 1               - +    Kinnita '
	db 'Hiire kursori viide       : 0x00a           - +    Kinnita '
	db 'SPEAKER disabled          : V�L.            - +    Kinnita '
	db 'M�RKUS:                                        Kinnita k�ik'
	db 'SALVESTA SEADED ENNE KOLIBRIST V�LJUMIST      Salvesta k�ik'
text2_strings = 2
;-------------------------------------------------------------------------------
title	db 'System setup',0

hex	db '0123456789ABCDEF'
;-------------------------------------------------------------------------------
include 'keymaps.inc'
;-------------------------------------------------------------------------------
read_fileinfo:
	dd 0
	dd 0
	dd 0
	dd 28
	dd keyboard
	db 0
	dd file_name
;-------------------------------------------------------------------------------
save_fileinfo:
	dd 2
	dd 0
	dd 0
	dd 28
	dd keyboard
file_name:	db '/SYS/SETTINGS/SETUP.DAT',0
;-------------------------------------------------------------------------------
keyboard	dd 0x0
syslang 	dd 0x4	; 4 - rus
lba_read	dd 0x1
pci_acc 	dd 0x1
mouse_speed	dd 0x2
mouse_delay	dd 0xa
speaker_mute	dd 0	; 0 - enable, 1 - disable
;-----------------------------------------------------------------------------
IM_END:
;-----------------------------------------------------------------------------
align 4
text00:
	rb LLL*(text1_strings + text2_strings)+4
;-----------------------------------------------------------------------------
align 4
boot_param:
procinfo:
	rb 1024
;-----------------------------------------------------------------------------
align 4
	rb 0x1000
stack_area:
;-----------------------------------------------------------------------------
I_END:
;-------------------------------------------------------------------------------