kolibrios-fun/programs/system/setup/trunk/setup.asm

887 lines
19 KiB
NASM
Raw Normal View History

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; 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,'<27><> '
cmp eax,1
je exitsub
mov ebx,'<27><><EFBFBD> '
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 '<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ENGLISH - + <20><EFBFBD><E0A8AC><EFBFBD><EFBFBD><EFBFBD>'
db '<27><><EFBFBD><E1AAAB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : ENGLISH - + <20><EFBFBD><E0A8AC><EFBFBD><EFBFBD><EFBFBD>'
db '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> LBA : OFF - + <20><EFBFBD><E0A8AC><EFBFBD><EFBFBD><EFBFBD>'
db '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> PCI : OFF - + <20><EFBFBD><E0A8AC><EFBFBD><EFBFBD><EFBFBD>'
db '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : 1 - + <20><EFBFBD><E0A8AC><EFBFBD><EFBFBD><EFBFBD>'
db '<27><><EFBFBD><EFBFBD><EFBFBD> <20>᪮७<E1AAAE><E0A5AD> <20><><EFBFBD><EFBFBD> : 0x00a - + <20><EFBFBD><E0A8AC><EFBFBD><EFBFBD><EFBFBD>'
db '<27><EFBFBD><EBAAAB><EFBFBD><EFBFBD><EFBFBD> SPEAKER : OFF - + <20><EFBFBD><E0A8AC><EFBFBD><EFBFBD><EFBFBD>'
db '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><EFBFBD><E0A8AC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> '
db '<27><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD> <20><><EFBFBD> '
;-------------------------------------------------------------------------------
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<65><70>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:
;-------------------------------------------------------------------------------