0,0 → 1,922 |
; |
; UNIFORM WINDOW COLOURS & SKIN |
; |
; Compile with FASM for Menuet |
; |
; < russian edition by Ivan Poddubny > |
; < skin selection by Mike Semenyako > |
; |
|
;****************************************************************************** |
use32 |
org 0 |
db 'MENUET01' ; identifier |
dd 1 ; header version |
dd START ; start address |
dd I_END ; file size |
dd 28000h ; memory |
dd 10000h ; stack pointer (0x10000+ - work area for os) |
dd 0;,0 ; parameters, reserved |
|
include 'lang.inc' |
include 'macros.inc' |
;****************************************************************************** |
|
|
struct SKIN_HEADER |
.ident dd ? |
.version dd ? |
.params dd ? |
.buttons dd ? |
.bitmaps dd ? |
ends |
|
struct SKIN_PARAMS |
.skin_height dd ? |
.margin.right dw ? |
.margin.left dw ? |
.margin.bottom dw ? |
.margin.top dw ? |
.colors.inner dd ? |
.colors.outer dd ? |
.colors.frame dd ? |
.colors_1.inner dd ? |
.colors_1.outer dd ? |
.colors_1.frame dd ? |
.dtp.size dd ? |
.dtp.data db 40 dup (?) |
ends |
|
struct SKIN_BUTTONS |
.type dd ? |
.pos: |
.left dw ? |
.top dw ? |
.size: |
.width dw ? |
.height dw ? |
ends |
|
struct SKIN_BITMAPS |
.kind dw ? |
.type dw ? |
.data dd ? |
ends |
|
|
START: ; start of execution |
|
mov eax,48 ; get current colors |
mov ebx,3 |
mov ecx,color_table |
mov edx,4*10 |
int 0x40 |
|
cld |
mov esi,default_skn |
mov edi,fname |
mov ecx,default_skn.size |
rep movsb |
mov [skin_info.fname],0 |
mov [skin_info.workarea],0x10000 |
call load_skin_file |
|
|
red: |
call draw_window ; at first, draw the window |
|
still: |
|
mov eax,23 ; wait here for event |
mov ebx,5 |
int 0x40 |
|
dec eax ; redraw request ? |
jz red |
dec eax ; key in buffer ? |
jz key |
dec eax ; button in buffer ? |
jz button |
|
call draw_cursor |
|
jmp still |
|
|
key: ; key |
mov eax,2 ; just read it and ignore |
int 0x40 |
jmp still |
|
button: ; button |
mov eax,17 ; get id |
int 0x40 |
|
cmp ah,11 ; read string |
jne no_string |
call read_string |
jmp still |
no_string: |
|
cmp ah,12 ; load file |
jne no_load |
call load_file |
call draw_window |
jmp still |
no_load: |
|
cmp ah,13 ; save file |
jne no_save |
call save_file |
jmp still |
no_save: |
|
cmp ah,14 ; set 3d buttons |
jne no_3d |
mov eax,48 |
mov ebx,1 |
mov ecx,1 |
int 0x40 |
mov eax,48 |
mov ebx,0 |
mov ecx,0 |
int 0x40 |
jmp still |
no_3d: |
|
cmp ah,15 ; set flat buttons |
jne no_flat |
mcall 48, 1, 0 |
mcall 48, 0, 0 |
jmp still |
no_flat: |
|
cmp ah,16 ; apply |
jne no_apply |
apply_direct: |
mov eax,48 |
mov ebx,2 |
mov ecx,color_table |
mov edx,10*4 |
int 0x40 |
mov eax,48 |
mov ebx,0 |
mov ecx,0 |
int 0x40 |
no_apply: |
|
cmp ah,17 ; load skin file |
jne no_load_skin |
call load_skin_file |
call draw_window |
jmp still |
no_load_skin: |
|
cmp ah,18 ; apply skin |
jne no_apply_skin |
cmp [skin_info.fname],0 |
je no_apply_skin |
mcall 48,8,skin_info |
call draw_window |
jmp still |
no_apply_skin: |
|
cmp ah,31 |
jb no_new_colour |
cmp ah,41 |
jg no_new_colour |
shr eax,8 |
sub eax,31 |
shl eax,2 |
add eax,color_table |
mov ebx,[color] |
mov [eax],ebx |
call draw_colours |
jmp still |
no_new_colour: |
|
cmp ah,1 ; terminate |
jnz noid1 |
mov eax,-1 |
int 0x40 |
noid1: |
|
jmp still |
|
|
draw_cursor: |
|
pusha |
mov eax,37 |
mov ebx,2 |
int 0x40 |
|
cmp eax,0 |
jne dc1 |
popa |
ret |
|
dc1: |
|
mov eax,37 |
mov ebx,1 |
int 0x40 |
|
mov ebx,eax |
shr ebx,16 |
mov ecx,eax |
and ecx,0xffff |
|
cmp ecx,32 |
jbe no_color |
cmp ebx,32 |
jbe no_color |
|
cmp ebx,266 ; CHANGE COLOR |
jb no_color |
cmp ebx,266+20*3 |
jg no_color |
|
cmp ecx,30+128 |
jge no_color |
cmp ecx,30 |
jb no_color |
|
sub ebx,266 |
mov eax,ebx |
cdq |
mov ebx,20 |
div ebx |
mov ebx,2 |
sub ebx,eax |
|
add ecx,-30 |
not ecx |
shl ecx,1 |
|
mov byte [ebx+color],cl |
call draw_color |
|
popa |
ret |
|
no_color: |
|
popa |
ret |
|
|
load_file: |
pushad |
|
mov [read_info.mode] ,0 |
mov [read_info.start_block],0 |
mov [read_info.blocks] ,1 |
mov [read_info.address] ,color_table |
mov [read_info.workarea] ,0x10000 |
mcall 58, read_info |
|
popad |
ret |
|
load_skin_file: |
pushad |
|
mov [read_info.mode] ,0 |
mov [read_info.start_block],0 |
mov [read_info.blocks] ,64 |
mov [read_info.address] ,0x20000 |
mov [read_info.workarea] ,0x10000 |
mcall 58, read_info |
|
cmp dword[0x20000+SKIN_HEADER.ident],'SKIN' |
jne @f |
|
mov esi,fname |
mov edi,skin_info.fname |
mov ecx,257 |
rep movsb |
|
mov esi,0x20000 |
mov edi,0x18000 |
mov ecx,0x8000/4 |
rep movsd |
|
mov ebp,0x18000 |
mov esi,[ebp+SKIN_HEADER.params] |
add esi,ebp |
lea esi,[esi+SKIN_PARAMS.dtp.data] |
mov edi,color_table |
mov ecx,10 |
rep movsd |
@@: |
|
popad |
ret |
|
|
save_file: |
pushad |
|
mov [write_info.mode] ,1 |
mov [write_info.bytes2write],10*4 |
mov [write_info.address] ,color_table |
mov [write_info.workarea] ,0x10000 |
mcall 58, write_info |
|
popad |
ret |
|
|
read_string: |
|
pusha |
|
mov edi,fname |
mov al,'_' |
mov ecx,87 |
cld |
rep stosb |
|
call print_text |
|
mov edi,fname |
|
f11: |
mov eax,10 |
int 0x40 |
cmp eax,2 |
jne read_done |
mov eax,2 |
int 0x40 |
shr eax,8 |
cmp eax,13 |
je read_done |
cmp eax,8 |
jne nobsl |
cmp edi,fname |
je f11 |
dec edi |
mov [edi],byte '_' |
call print_text |
jmp f11 |
nobsl: |
mov [edi],al |
|
call print_text |
|
inc edi |
cmp edi, fname+87 |
jne f11 |
|
read_done: |
|
mov ecx, fname |
add ecx, 88 |
sub ecx, edi |
mov eax, 0 |
cld |
rep stosb |
|
call print_text |
|
popa |
|
ret |
|
|
print_text: |
pushad |
|
mpack ebx,15,6*87+4 |
mpack ecx,(30+18*10+2),11 |
mcall 13,,,[w_work] |
|
mpack ebx,17,(30+18*10+4) |
mcall 4,,[w_work_text],fname,87 |
|
popad |
ret |
|
|
draw_color: |
|
pusha |
|
mov eax,13 |
mov ebx,266*65536+60 |
mov ecx,170*65536+30 |
mov edx,[color] |
int 0x40 |
|
; mov eax,13 |
mov ebx,266*65536+60 |
mov ecx,200*65536+10 |
mov edx,[w_work] |
int 0x40 |
|
mov eax,47 |
mov ebx,0+1*256+8*65536 |
mov ecx,[color] |
mov edx,272*65536+201 |
mov esi,[w_work_text] |
int 0x40 |
|
popa |
|
ret |
|
|
draw_colours: |
|
pusha |
|
mov esi,color_table |
|
mov ebx,225*65536+32 |
mov ecx,32*65536+12 |
newcol: |
mov eax,13 |
mov edx,[esi] |
int 0x40 |
add ecx,18*65536 |
add esi,4 |
cmp esi,color_table+4*9 |
jbe newcol |
|
popa |
|
ret |
|
|
draw_framerect: ; ebx,ecx |
push ebx ecx |
add bx,[esp+6] |
mov cx,[esp+2] |
dec ebx |
mcall 38 |
add cx,[esp] |
rol ecx,16 |
add cx,[esp] |
sub ecx,0x00010001 |
mcall |
mov ebx,[esp+4] |
mov ecx,[esp] |
mov bx,[esp+6] |
add cx,[esp+2] |
dec ecx |
mcall |
add bx,[esp+4] |
rol ebx,16 |
add bx,[esp+4] |
sub ebx,0x00010001 |
mcall |
add esp,8 |
ret |
|
find_bitmap: |
mov edi,[ebp+SKIN_HEADER.bitmaps] |
add edi,ebp |
xor ebx,ebx |
.lp1: cmp dword[edi],0 |
je .lp2 |
cmp dword[edi+0],eax |
jne @f |
mov ebx,[edi+SKIN_BITMAPS.data] |
add ebx,ebp |
mov ecx,[ebx-2] |
mov cx,[ebx+4] |
add ebx,8 |
.lp2: ret |
@@: add edi,8 |
jmp .lp1 |
|
draw_skin: |
mcall 13,<345,206>,<20,191>,0x00FFFFFF |
mov ebp,0x18000 |
mov edi,[ebp+SKIN_HEADER.params] |
add edi,ebp |
mpack ebx,345+45,150 |
mpack ecx,20+10,140 |
mov edx,[edi+SKIN_PARAMS.colors_1.outer] |
call draw_framerect |
mpack ebx,345+45+4,150-8 |
mpack ecx,20+10+4,140-8 |
mov edx,[edi+SKIN_PARAMS.colors_1.inner] |
call draw_framerect |
mcall 13,<345+45+1,148>,<20+10+1,3>,[edi+SKIN_PARAMS.colors_1.frame] |
add ecx,135*65536 |
mcall |
mcall ,<345+45+1,3>,<20+10+1,138> |
add ebx,145*65536 |
mcall |
mcall ,<345+45+5,140>,<20+10+5,130>,dword[edi+SKIN_PARAMS.dtp.data+system_colors.work] |
|
mov eax,0x00000001 ; left, inactive |
call find_bitmap |
mcall 7,,,<345+45,20+10> |
|
pushd [ebx-8] |
mov eax,0x00000003 ; base, inactive |
call find_bitmap |
pop edx |
mov esi,345+45+150-1 |
sub esi,edx |
shl edx,16 |
add edx,(345+45)*65536+20+10 |
mcall 7 |
@@: rol edx,16 |
add dx,[ebx-8] |
cmp dx,si |
ja @f |
rol edx,16 |
mcall 7 |
jmp @b |
@@: |
|
mov eax,0x00000002 ; oper, inactive |
call find_bitmap |
mov edx,ecx |
shr edx,16 |
neg edx |
shl edx,16 |
add edx,(345+45+150)*65536+20+10 |
mcall 7 |
|
mov ebp,0x18000 |
mov edi,[ebp+SKIN_HEADER.params] |
add edi,ebp |
mov eax,dword[edi+SKIN_PARAMS.margin.left-2] |
mov ax,word[edi+SKIN_PARAMS.skin_height] |
sub ax,[edi+SKIN_PARAMS.margin.bottom] |
shr ax,1 |
add ax,[edi+SKIN_PARAMS.margin.top] |
add ax,-4 |
push eax |
lea ebx,[eax+(345+45)*65536+20+10] |
mcall 4,,dword[edi+SKIN_PARAMS.dtp.data+system_colors.grab_text],test_text,test_text.size |
|
;--------------------------------------------------------- |
|
mov edi,[ebp+SKIN_HEADER.params] |
add edi,ebp |
mpack ebx,345+10,150 |
mpack ecx,20+40,140 |
mov edx,[edi+SKIN_PARAMS.colors.outer] |
call draw_framerect |
mpack ebx,345+10+4,150-8 |
mpack ecx,20+40+4,140-8 |
mov edx,[edi+SKIN_PARAMS.colors.inner] |
call draw_framerect |
mcall 13,<345+10+1,148>,<20+40+1,3>,[edi+SKIN_PARAMS.colors.frame] |
add ecx,135*65536 |
mcall |
mcall ,<345+10+1,3>,<20+40+1,138> |
add ebx,145*65536 |
mcall |
mcall ,<345+10+5,140>,<20+40+5,130>,dword[edi+SKIN_PARAMS.dtp.data+system_colors.work] |
|
mov eax,0x00010001 ; left, inactive |
call find_bitmap |
mcall 7,,,<345+10,20+40> |
|
pushd [ebx-8] |
mov eax,0x00010003 ; base, inactive |
call find_bitmap |
pop edx |
mov esi,345+10+150-1 |
sub esi,edx |
shl edx,16 |
add edx,(345+10)*65536+20+40 |
mcall 7 |
@@: rol edx,16 |
add dx,[ebx-8] |
cmp dx,si |
ja @f |
rol edx,16 |
mcall 7 |
jmp @b |
@@: |
|
mov eax,0x00010002 ; oper, inactive |
call find_bitmap |
mov edx,ecx |
shr edx,16 |
neg edx |
shl edx,16 |
add edx,(345+10+150)*65536+20+40 |
mcall 7 |
|
mov ebp,0x18000 |
mov edi,[ebp+SKIN_HEADER.params] |
add edi,ebp |
pop eax |
lea ebx,[eax+(345+10)*65536+20+40] |
mcall 4,,dword[edi+SKIN_PARAMS.dtp.data+system_colors.grab_text],test_text,test_text.size |
|
;---------------------------------------------------------------------- |
|
mov edi,[ebp+SKIN_HEADER.buttons] |
add edi,ebp |
.lp1: cmp dword[edi],0 |
je .lp2 |
mov ebx,dword[edi+SKIN_BUTTONS.left-2] |
mov bx,[edi+SKIN_BUTTONS.width] |
mov ecx,dword[edi+SKIN_BUTTONS.top-2] |
mov cx,[edi+SKIN_BUTTONS.height] |
add ebx,(345+10+150)*65536 |
add ecx,(20+40)*65536 |
dec ebx |
dec ecx |
mcall 8,,,0x40000000 |
add edi,12 |
jmp .lp1 |
.lp2: ret |
|
; ********************************************* |
; ******* WINDOW DEFINITIONS AND DRAW ******** |
; ********************************************* |
|
|
draw_window: |
|
mov eax,12 ; function 12:tell os about windowdraw |
mov ebx,1 ; 1, start of draw |
int 0x40 |
|
mov eax,48 |
mov ebx,3 |
mov ecx,app_colours |
mov edx,10*4 |
int 0x40 |
|
mov eax,14 |
int 0x40 |
|
sub eax,60*65536 |
mov ebx,eax |
mov bx,40 |
|
; DRAW WINDOW |
mov eax,0 ; function 0 : define and draw window |
mov ebx,110*65536+555 ; [x start] *65536 + [x size] |
mov ecx,50*65536+255 ; [y start] *65536 + [y size] |
mov edx,[w_work] ; color of work area RRGGBB,8->color |
or edx,0x02000000 |
mov esi,[w_grab] ; color of grab bar RRGGBB,8->color gl |
or esi,0x80000000 |
mov edi,[w_frame] ; color of frames RRGGBB |
int 0x40 |
|
; WINDOW LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,8*65536+7 ;8 ; [x start] *65536 + [y start] |
mov ecx,[w_grab_text] ; color of text RRGGBB |
if lang eq ru |
or ecx,0x10000000 |
end if |
mov edx,labelt ; pointer to text beginning |
mov esi,labelt.size ; text length |
int 0x40 |
; CLOSE BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(555-19)*65536+12 ; [x start] *65536 + [x size] |
mov ecx,4*65536+12 ; [y start] *65536 + [y size] |
mov edx,1 ; button id |
mov esi,[w_grab_button] ; button color RRGGBB |
int 0x40 |
|
if lang eq ru |
load_w = (5*2+6*9) |
save_w = (5*2+6*9) |
flat_w = (5*2+6*7) |
apply_w = (5*2+6*9) |
else |
load_w = (5*2+6*6) |
save_w = (5*2+6*6) |
flat_w = (5*2+6*4) |
apply_w = (5*2+6*7) |
end if |
|
; mov eax,8 ; FILENAME BUTTON |
mov ebx,5*65536+545 |
mov ecx,212*65536+10 |
mov edx,0x4000000B |
int 0x40 |
|
; mov eax,8 ; LOAD BUTTON |
mov ebx,15*65536+load_w |
mov ecx,(30+18*11)*65536+14 |
mov edx,12 |
mov esi,[w_work_button] |
int 0x40 |
|
; mov eax,8 ; SAVE BUTTON |
add ebx,(load_w+2)*65536-load_w+save_w |
inc edx |
int 0x40 |
|
; mov eax,8 ; 3D |
mov ebx,(340-t1.size*6-13)*65536+(5*2+6*4) |
inc edx |
int 0x40 |
; mov eax,8 ; FLAT |
add ebx,(5*2+6*4+2)*65536-(5*2+6*4)+flat_w |
inc edx |
int 0x40 |
|
; mov eax,8 ; APPLY BUTTON |
add ebx,(flat_w+6+2)*65536-flat_w+apply_w |
inc edx |
int 0x40 |
|
; mov eax,8 ; LOAD SKIN BUTTON |
mov ebx,(336+(555-335)/2-t2.size*6/2)*65536+load_w |
inc edx |
int 0x40 |
|
; mov eax,8 ; APPLY SKIN BUTTON |
add ebx,(load_w+6+2)*65536-load_w+apply_w |
inc edx |
int 0x40 |
|
mov eax, 4 |
mov ebx, (339-t1.size*6-12)*65536+(30+18*11+4) |
mov ecx, [w_work_button_text] |
mov edx, t1 |
mov esi, t1.size |
int 0x40 |
|
mov ebx,(336+(555-335)/2-t2.size*6/2)*65536+(30+18*11+4) |
mov edx,t2 |
mov esi,t2.size |
int 0x40 |
|
|
mov eax,38 ; R G B COLOR GLIDES |
mov ebx,266*65536+285 |
mov ecx,30*65536+30 |
mov edx,0xff0000 |
.newl: |
int 0x40 |
pusha |
add ebx,20*65536+20 |
shr edx,8 |
int 0x40 |
add ebx,20*65536+20 |
shr edx,8 |
int 0x40 |
popa |
sub edx,0x020000 |
add ecx,0x00010001 |
cmp ecx,158*65536+158 |
jnz .newl |
|
call draw_color |
|
mov edx,31 ; BUTTON ROW |
mov ebx,15*65536+200 |
mov ecx,30*65536+14 |
mov esi,[w_work_button] |
newb: |
mov eax,8 |
int 0x40 |
add ecx,18*65536 |
inc edx |
cmp edx,40 |
jbe newb |
|
mov ebx,15*65536+34 ; ROW OF TEXTS |
mov ecx,[w_work_button_text] |
mov edx,text |
mov esi,32 |
newline: |
mov eax,4 |
int 0x40 |
add ebx,18 |
add edx,32 |
cmp [edx],byte 'x' |
jne newline |
|
call draw_colours |
|
mcall 13,<5,546>,<212,11>,[w_work] |
mcall 13,<337,7>,<2,250>,[w_frame] |
shr edx,1 |
and edx,0x007F7F7F |
mcall 38,<336,336>,<20,250> |
add ebx,0x00080008 |
mcall |
sub ebx,0x00040004 |
mcall ,,<0,255> |
mcall ,<5,550>,<211,211> |
add ecx,0x000C000C |
mcall |
|
call print_text |
|
cmp dword[0x18000+SKIN_HEADER.ident],'SKIN' |
jne @f |
call draw_skin |
@@: |
|
mov eax,12 ; function 12:tell os about windowdraw |
mov ebx,2 ; 2, end of draw |
int 0x40 |
|
ret |
|
|
; DATA AREA |
|
lsz text,\ |
ru, ' ',\ |
ru, ' ',\ |
ru, '
',\ |
ru, '
',\ |
ru, '
',\ |
ru, ' ',\ |
ru, '
',\ |
ru, '
',\ |
ru, '
',\ |
ru, '
',\ |
ru, ' ',\ |
ru, ' ',\ |
ru, 'x',\ |
en, ' WINDOW FRAME ',\ |
en, ' WINDOW GRAB BAR ',\ |
en, ' WINDOW GRAB BUTTON ',\ |
en, ' WINDOW GRAB BUTTON TEXT ',\ |
en, ' WINDOW GRAB TITLE ',\ |
en, ' WINDOW WORK AREA ',\ |
en, ' WINDOW WORK AREA BUTTON ',\ |
en, ' WINDOW WORK AREA BUTTON TEXT ',\ |
en, ' WINDOW WORK AREA TEXT ',\ |
en, ' WINDOW WORK AREA GRAPH ',\ |
en, ' ',\ |
en, ' LOAD SAVE ',\ |
en, 'x' |
|
|
lsz t1,\ |
ru, ' 3D
',\ |
en, ' 3D FLAT APPLY ' |
|
lsz t2,\ |
ru, '
',\ |
en, ' LOAD APPLY ',\ |
|
lsz test_text,\ |
ru, ' £®«®¢®ª',\ |
en, 'Caption' |
|
lsz labelt,\ |
ru, '
',\ |
en, 'DESKTOP COLOURS - DEFINE COLOR AND CLICK ON TARGET' |
|
sz default_skn, '/RD/1/DEFAULT.SKN',0 |
|
color dd 0 |
|
I_END: |
|
read_info: |
.mode dd ? ; read |
.start_block dd ? ; first block |
.blocks dd ? ; 512 bytes |
.address dd ? |
.workarea dd ? |
fname rb 256+1 ; filename (+1 - for zero at the end) |
|
virtual at read_info |
write_info: |
.mode dd ? |
rd 1 |
.bytes2write dd ? |
.address dd ? |
.workarea dd ? |
end virtual |
|
skin_info: |
.mode dd ? |
.start_block dd ? |
.blocks dd ? |
.address dd ? |
.workarea dd ? |
.fname rb 256+1 |
|
app_colours: |
|
w_frame dd ? |
w_grab dd ? |
w_grab_button dd ? |
w_grab_button_text dd ? |
w_grab_text dd ? |
w_work dd ? |
w_work_button dd ? |
w_work_button_text dd ? |
w_work_text dd ? |
w_work_graph dd ? |
|
color_table: |
times 10 dd ? |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |