programs in "programs\media" that use deleted system functions and whose rewriting is not rational have been moved to "programs\other\outdated"
git-svn-id: svn://kolibrios.org@9972 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
7f7718f532
commit
67038a8fc9
|
@ -1,983 +0,0 @@
|
|||
;
|
||||
; Modified from original icon editor
|
||||
;
|
||||
; Compile with FASM for Menuet
|
||||
;
|
||||
use32
|
||||
org 0x0
|
||||
db 'MENUET01' ; 8 byte id
|
||||
dd 0x01 ; header version
|
||||
dd START ; start of code
|
||||
dd I_END ; size of image
|
||||
dd 0x100000 ; memory for app
|
||||
dd 0x7fff0 ; esp
|
||||
dd 0x0 , 0x0 ; I_Param , I_Icon
|
||||
|
||||
include 'lang.inc'
|
||||
include '..\..\..\macros.inc'
|
||||
|
||||
window_x_size equ 346
|
||||
window_y_size equ 312
|
||||
|
||||
START: ; start of execution
|
||||
|
||||
call draw_window ; at first, draw the window
|
||||
call get_screen_size ; get screen x and y size
|
||||
|
||||
check_mouse:
|
||||
|
||||
call draw_mouse ; are we editing the icon
|
||||
call check_colour ; are we selecting a colour
|
||||
|
||||
still:
|
||||
|
||||
mov eax,23 ; wait here for event
|
||||
mov ebx,1 ; for 1ms
|
||||
mcall
|
||||
|
||||
cmp eax,1 ; redraw request ?
|
||||
je red
|
||||
cmp eax,2 ; key in buffer ?
|
||||
je key
|
||||
cmp eax,3 ; button in buffer ?
|
||||
je button
|
||||
|
||||
jmp check_mouse ; start loop again
|
||||
|
||||
red: ; redraw
|
||||
call draw_window ; draw our window
|
||||
jmp check_mouse ; start the loop again
|
||||
key:
|
||||
|
||||
mov eax,2 ; get a key
|
||||
mcall ; do it
|
||||
shr eax,8 ; move it to al
|
||||
cmp byte [editstate],0 ; are we in edit mode
|
||||
je check_mouse ; if not start loop again
|
||||
cmp al,8 ; is it a backspace
|
||||
jne no_bksp ; if no jump over backspace code
|
||||
cmp byte [editpos],0 ; is it the first character
|
||||
je no_del_last ; if yes jump over backspace code
|
||||
dec byte [editpos] ; decrement our position
|
||||
xor ebx,ebx ; clear pointer
|
||||
mov bl,byte [editpos] ; get our position
|
||||
add ebx,icon ; add our offset
|
||||
mov byte [ebx],0 ; delete character
|
||||
no_del_last:
|
||||
call draw_filename ; update filename
|
||||
jmp check_mouse ; start loop again
|
||||
no_bksp:
|
||||
cmp al,13 ; is it the enter key
|
||||
jne no_enter ; no then jump over enter code
|
||||
mov byte [editstate],0 ; get out of edit mode
|
||||
call draw_filename ; update filename
|
||||
jmp check_mouse ; start loop again
|
||||
no_enter:
|
||||
cmp al,31 ; are we below character 31
|
||||
jbe no_lit ; then must be illegal
|
||||
cmp al,97 ; are we below character 97
|
||||
jb capital ; then must be ok
|
||||
sub eax,32 ; else subtract 32 from it to make it legal
|
||||
capital:
|
||||
xor ebx,ebx ; clear our pointer
|
||||
mov bl,byte [editpos] ; get our position
|
||||
add ebx,icon ; add our offset
|
||||
mov byte [ebx],al ; move our character into buffer
|
||||
inc byte [editpos] ; increment our edit position
|
||||
cmp byte [editpos],12 ; are we at our last position
|
||||
jne no_null_state ; no then jump over last position code
|
||||
mov byte [editstate],0 ; get out of edit mode
|
||||
no_null_state:
|
||||
call draw_filename ; update filename
|
||||
no_lit:
|
||||
jmp check_mouse ; start loop again
|
||||
|
||||
button: ; button
|
||||
mov eax,17 ; get id
|
||||
mcall
|
||||
|
||||
cmp ah,1 ; button id=1 ?
|
||||
jne button_3
|
||||
mov eax,-1 ; close this program
|
||||
mcall
|
||||
button_3:
|
||||
cmp ah,3 ; was it button 3 - FILENAME
|
||||
jne button_4 ; no then try button 4
|
||||
cld ;
|
||||
mov byte [editstate],1 ; enter edit mode
|
||||
mov edi,icon ; point to our buffer
|
||||
mov eax,0x20202020 ; file reg with 4 spaces
|
||||
mov ecx,3 ; going to write it 3 times
|
||||
rep stosd ; repeat giving 12 spaces
|
||||
mov byte [editpos],0 ; zero our edit position
|
||||
call draw_filename ; update filename
|
||||
jmp check_mouse ; start loop again
|
||||
button_4:
|
||||
cmp ah,4 ; was it button 4 - LOAD
|
||||
jne button_5 ; no then try button 5
|
||||
mov byte [editstate],0 ; dont want to be in edit mode
|
||||
call draw_filename ; update filename
|
||||
call load_file ; load the file
|
||||
call draw_icon ; update icon screen
|
||||
call draw_graph ; update edit screen
|
||||
jmp check_mouse ; start loop again
|
||||
button_5:
|
||||
cmp ah,5 ; was it button 5 - SAVE
|
||||
jne button_6 ; no then try button 6
|
||||
mov byte [editstate],0 ; dont want to be in edit mode
|
||||
call draw_filename ; update filename
|
||||
call save_file ; save the file
|
||||
jmp check_mouse ; start loop again
|
||||
button_6:
|
||||
cmp ah,6 ; was it button 6 - CLEAR ICON
|
||||
jne button_7 ; no then try button 7
|
||||
mov byte [editstate],0 ; dont want to be in edit mode
|
||||
call draw_filename ; update filename
|
||||
call clear_graph_icon ; clear the icon and edit screens
|
||||
jmp check_mouse
|
||||
|
||||
button_7:
|
||||
cmp ah,7 ; was it button 7 - FLIP ICON
|
||||
jne button_8 ; no then try button 8
|
||||
call flip_icon ; flip
|
||||
jmp check_mouse
|
||||
|
||||
button_8:
|
||||
cmp ah,8 ; was it button 8 - MIRROR ICON
|
||||
jne button_9 ; no then try button 9
|
||||
call flip_diag ; flip L/R and U/D
|
||||
call flip_icon ; cheated now have to flip it
|
||||
jmp check_mouse
|
||||
|
||||
button_9:
|
||||
cmp ah,9 ; was it button 9 - FLIP L/R and U/D
|
||||
jne button_10 ; no then try button 10
|
||||
call flip_diag ; flip L/R and U/D
|
||||
call draw_icon ; update icon
|
||||
call draw_graph ; update graph
|
||||
jmp check_mouse
|
||||
|
||||
button_10:
|
||||
cmp ah,10 ; was it button 9 - SET AS BGR
|
||||
jne check_mouse ; no then exit
|
||||
call set_background ; set as background
|
||||
|
||||
jmp check_mouse ; start loop again
|
||||
|
||||
; *********************************************
|
||||
; ******* WINDOW DEFINITIONS AND DRAW ********
|
||||
; *********************************************
|
||||
draw_window:
|
||||
|
||||
mov eax,12 ; function 12:tell os about windowdraw
|
||||
mov ebx,1 ; 1, start of draw
|
||||
mcall
|
||||
; DRAW WINDOW
|
||||
mov eax,0 ; function 0 : define and draw window
|
||||
mov ebx,100*65536+window_x_size ; [x start] *65536 + [x size]
|
||||
mov ecx,100*65536+window_y_size ; [y start] *65536 + [y size]
|
||||
mov edx,0x14ffffff ; color of work area 0x00RRGGBB
|
||||
mov edi,title ; WINDOW LABEL
|
||||
mcall
|
||||
|
||||
mov eax,13 ; function 13 : draw bar
|
||||
mov ebx,5*65536+window_x_size-9 ; [x start] *65536 + [x size]
|
||||
mov ecx,(window_y_size-20)*65536+16 ; [y start] *65536 + [y size]
|
||||
mov edx,0x7799bb ; colour 0x00RRGGBB
|
||||
mcall
|
||||
; DEFINE BUTTON 3 : FILENAME
|
||||
mov eax,8 ; function 8 : define button
|
||||
mov ebx,5*65536+62 ; [x start] *65536 + [x size]
|
||||
mov ecx,(window_y_size-19)*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,3 ; button id number
|
||||
mov esi,0x7799bb ; button color 0x00RRGGBB
|
||||
mcall
|
||||
; BUTTON 3 TEXT
|
||||
mov eax,4 ; function 4 : write text to window
|
||||
mov ebx,13*65536+window_y_size-15 ; [x start] *65536 + [y start]
|
||||
mov ecx,0xddeeff ; text color 0x00RRGGBB
|
||||
mov edx,button_text_3 ; pointer to text beginning
|
||||
mov esi,8 ; text length
|
||||
mcall
|
||||
|
||||
call draw_filename ; update filename
|
||||
|
||||
; DEFINE BUTTON 4 : LOAD
|
||||
mov eax,8 ; function 8 : define button
|
||||
mov ebx,(window_x_size-87)*65536+38 ; [x start] *65536 + [x size]
|
||||
mov ecx,(window_y_size-19)*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,4 ; button id number
|
||||
mov esi,0x7799bb ; button color 0x00RRGGBB
|
||||
mcall
|
||||
; DEFINE BUTTON 5 : SAVE
|
||||
mov ebx,(window_x_size-43)*65536+38 ; [x start] *65536 + [x size]
|
||||
mov edx,5 ; button id number
|
||||
mcall
|
||||
; DEFINE BUTTON 6 : CLEAR ICON
|
||||
mov ebx,268*65536+72 ; [x start] *65536 + [x size]
|
||||
mov ecx,65*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,6 ; button id number
|
||||
mcall
|
||||
; DEFINE BUTTON 7 : FLIP VERTICAL
|
||||
mov ecx,85*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,7 ; button id number
|
||||
mcall
|
||||
; DEFINE BUTTON 8 : FLIP HORIZONTAL
|
||||
mov ecx,105*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,8 ; button id number
|
||||
mcall
|
||||
; DEFINE BUTTON 9 : SET AS BACKGROUND
|
||||
mov ecx,125*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,9 ; button id number
|
||||
mcall
|
||||
; DEFINE BUTTON 10 : SET AS BACKGROUND
|
||||
mov ecx,145*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,10 ; button id number
|
||||
mcall
|
||||
; BUTTON 4 TEXT
|
||||
mov eax,4 ; function 4 : write text to window
|
||||
mov ebx,267*65536+window_y_size-15 ; [x start] *65536 + [y start]
|
||||
mov ecx,0xddeeff ; text color 0x00RRGGBB
|
||||
mov edx,button_text_4 ; pointer to text beginning
|
||||
mov esi,4 ; text length
|
||||
mcall
|
||||
; BUTTON 5 TEXT
|
||||
mov ebx,311*65536+window_y_size-15 ; [x start] *65536 + [y start]
|
||||
mov edx,button_text_5 ; pointer to text beginning
|
||||
mcall
|
||||
; BUTTON 6 TEXT
|
||||
mov ebx,275*65536+69 ; [x start] *65536 + [y start]
|
||||
mov edx,button_text_6 ; pointer to text beginning
|
||||
mov esi,10 ; text length
|
||||
mcall
|
||||
; BUTTON 7 TEXT
|
||||
mov ebx,275*65536+89 ; [x start] *65536 + [y start]
|
||||
mov edx,button_text_7 ; pointer to text beginning
|
||||
mcall
|
||||
; BUTTON 8 TEXT
|
||||
mov ebx,275*65536+109 ; [x start] *65536 + [y start]
|
||||
mov edx,button_text_8 ; pointer to text beginning
|
||||
mcall
|
||||
; BUTTON 9 TEXT
|
||||
mov ebx,275*65536+129 ; [x start] *65536 + [y start]
|
||||
mov edx,button_text_9 ; pointer to text beginning
|
||||
mcall
|
||||
; BUTTON 10 TEXT
|
||||
mov ebx,275*65536+149 ; [x start] *65536 + [y start]
|
||||
mov edx,button_text_10 ; pointer to text beginning
|
||||
mcall
|
||||
; DRAW GRAPH BACKGROUND
|
||||
mov eax,13 ; function 13 : draw bar
|
||||
mov ebx,6*65536+257 ; [x start] *65536 + [x size]
|
||||
mov ecx,26*65536+257 ; [y start] *65536 + [y size]
|
||||
mov edx,0x7799bb ; colour 0x00RRGGBB
|
||||
mcall
|
||||
; DRAW ICON BACKGROUND
|
||||
mov ebx,268*65536+34 ; [x start] *65536 + [x size]
|
||||
mov ecx,26*65536+34 ; [y start] *65536 + [y size]
|
||||
mcall
|
||||
; DRAW PALETTE BACKGROUND
|
||||
mov ebx,268*65536+34 ; [x start] *65536 + [x size]
|
||||
mov ecx,217*65536+33 ; [y start] *65536 + [y size]
|
||||
mcall
|
||||
; DRAW PALETTE BACKGROUND
|
||||
mov ebx,268*65536+33 ; [x start] *65536 + [x size]
|
||||
mov ecx,250*65536+33 ; [y start] *65536 + [y size]
|
||||
mcall
|
||||
; DRAW PALETTE BACKGROUND
|
||||
mov ebx,301*65536+33 ; [x start] *65536 + [x size]
|
||||
mov ecx,249*65536+34 ; [y start] *65536 + [y size]
|
||||
mcall
|
||||
; DRAW GREYSCALE BACKGROUND
|
||||
mov ebx,307*65536+34 ; [x start] *65536 + [x size]
|
||||
mov ecx,210*65536+34 ; [y start] *65536 + [y size]
|
||||
mcall
|
||||
; DRAW SELECTED COLOUR BACKGROUND
|
||||
mov ebx,268*65536+73 ; [x start] *65536 + [x size]
|
||||
mov ecx,171*65536+34 ; [y start] *65536 + [y size]
|
||||
mcall
|
||||
; DRAW WHITE TO START
|
||||
mov ebx,269*65536+71 ; [x start] *65536 + [x size]
|
||||
mov ecx,172*65536+32 ; [y start] *65536 + [y size]
|
||||
mov edx,0xffffff ; colour 0x00RRGGBB
|
||||
mcall
|
||||
; DRAW PALETTE RED + GREEN SECTION
|
||||
xor edi,edi ; clear column loop count
|
||||
next_r_g_outer:
|
||||
xor esi,esi ; clear line loop count
|
||||
next_r_g_inner:
|
||||
mov eax,1 ; function 1 : putpixel
|
||||
mov ebx,edi ; get column count
|
||||
shr ebx,3 ; divide by 8
|
||||
add ebx,269 ; add our x offset
|
||||
mov ecx,esi ; get our line count
|
||||
shr ecx,3 ; divide by 8
|
||||
add ecx,218 ; add our y offset
|
||||
mov edx,255 ; maximum red
|
||||
sub edx,edi ; minus column count
|
||||
shl edx,8 ; into position 0x0000RR00
|
||||
add edx,255 ; maximum green
|
||||
sub edx,esi ; minus line count
|
||||
shl edx,8 ; into position 0x00RRGG00
|
||||
mcall
|
||||
add esi,5 ; colour in steps of 5 to keep small
|
||||
cmp esi,255 ; have we done a line
|
||||
jne next_r_g_inner ; nop then do next pixel
|
||||
add edi,5 ; colour in steps of 5 to keep small
|
||||
cmp edi,255 ; have we done all columns
|
||||
jne next_r_g_outer ; no then start the next one
|
||||
|
||||
; DRAW PALETTE GREEN + BLUE SECTION
|
||||
mov edi,0 ; as above
|
||||
next_g_b_outer:
|
||||
mov esi,0
|
||||
next_g_b_inner:
|
||||
mov eax,1
|
||||
mov ebx,edi
|
||||
shr ebx,3
|
||||
add ebx,269
|
||||
mov ecx,esi
|
||||
shr ecx,3
|
||||
add ecx,250
|
||||
mov edx,255
|
||||
sub edx,edi
|
||||
shl edx,16
|
||||
add edx,esi
|
||||
mcall
|
||||
add esi,5
|
||||
cmp esi,255
|
||||
jne next_g_b_inner
|
||||
add edi,5
|
||||
cmp edi,255
|
||||
jne next_g_b_outer
|
||||
|
||||
; DRAW PALETTE BLUE + RED SECTION
|
||||
mov edi,0 ; as above
|
||||
next_b_r_outer:
|
||||
mov esi,0
|
||||
next_b_r_inner:
|
||||
mov eax,1
|
||||
mov ebx,edi
|
||||
shr ebx,3
|
||||
add ebx,301
|
||||
mov ecx,esi
|
||||
shr ecx,3
|
||||
add ecx,250
|
||||
mov edx,edi
|
||||
shl edx,8
|
||||
add edx,esi
|
||||
mcall
|
||||
add esi,5
|
||||
cmp esi,255
|
||||
jne next_b_r_inner
|
||||
add edi,5
|
||||
cmp edi,255
|
||||
jne next_b_r_outer
|
||||
|
||||
; DRAW GREYSCALE
|
||||
mov edi,0
|
||||
next_b_w_outer:
|
||||
mov esi,0
|
||||
next_b_w_inner:
|
||||
mov eax,1
|
||||
mov ebx,edi
|
||||
shr ebx,3
|
||||
add ebx,308
|
||||
mov ecx,esi
|
||||
shr ecx,3
|
||||
add ecx,211
|
||||
mov edx,esi
|
||||
shl edx,8
|
||||
add edx,esi
|
||||
shl edx,8
|
||||
add edx,esi
|
||||
mcall
|
||||
add esi,5
|
||||
cmp esi,255
|
||||
jne next_b_w_inner
|
||||
add edi,5
|
||||
cmp edi,255
|
||||
jne next_b_w_outer
|
||||
|
||||
cmp [first_run],0 ; is it the first window draw
|
||||
jne dont_load ; no then dont reload the file
|
||||
call load_file ; load initial file
|
||||
mov [first_run],1 ; first window draw done
|
||||
dont_load:
|
||||
call draw_icon ; draw icon area
|
||||
call draw_graph ; draw edit area
|
||||
|
||||
mov eax,12 ; function 12:tell os about windowdraw
|
||||
mov ebx,2 ; 2, end of draw
|
||||
mcall
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* SET BACKGROUND ********
|
||||
; *********************************************
|
||||
set_background:
|
||||
|
||||
mov ecx,image+3600 ; point to our decode buffer
|
||||
mov edx,image+54+32*32*3-96 ; point to last line of bmp
|
||||
|
||||
mov edi,0 ; zero line count
|
||||
decode_line:
|
||||
mov esi,0 ; zero column count
|
||||
decode_column:
|
||||
mov ebx,[edx] ; get our data
|
||||
mov [ecx],ebx ; store our data
|
||||
add ecx,4 ; add 4 bytes to pointer as using double word
|
||||
add edx,4 ; add 4 bytes to pointer
|
||||
inc esi ; increment column count
|
||||
cmp esi,24 ; have we done all columns
|
||||
jne decode_column ; no then do some more
|
||||
sub edx,192 ; move back 2 lines of bmp data
|
||||
inc edi ; increment line count
|
||||
cmp edi,33 ; have we done all lines
|
||||
jne decode_line ; no then do another one
|
||||
|
||||
mov eax,15 ; background
|
||||
mov ebx,1 ; set background size
|
||||
mov ecx,32 ; x size
|
||||
mov edx,32 ; y size
|
||||
mcall ; do it
|
||||
mov ebx,4 ; type of background draw
|
||||
mov ecx,1 ; tile
|
||||
mcall ; do it
|
||||
mov ebx,5 ; blockmove image to os bgr memory
|
||||
mov ecx,image+3600 ; point to image
|
||||
mov edx,0 ; start of bgr memory
|
||||
mov esi,32*32*3 ; byte count
|
||||
mcall ; do it
|
||||
mov ebx,3 ; draw background
|
||||
mcall ; do it
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* GET SCREEN X and Y SIZE ********
|
||||
; *********************************************
|
||||
get_screen_size:
|
||||
|
||||
mov eax,14 ; function 14 : get screen max
|
||||
mcall ; returns eax : 0xXXXXYYYY
|
||||
push eax ; save reg
|
||||
and eax,0x0000ffff ; split out y size
|
||||
add eax,1 ; add 1 to remove zero base
|
||||
mov [y_size],eax ; store for later
|
||||
pop eax ; restore reg
|
||||
shr eax,16 ; move x size down the reg
|
||||
add eax,1 ; add 1 to remove zero base
|
||||
mov [x_size],eax ; store for later
|
||||
|
||||
ret
|
||||
|
||||
; *********************************************
|
||||
; ******* LOAD FILE ********
|
||||
; *********************************************
|
||||
load_file:
|
||||
|
||||
mov eax,6 ; function 6 : load file
|
||||
mov ebx,icon ; point to the name
|
||||
mov ecx,0 ; reserved
|
||||
mov edx,200000 ; reserved
|
||||
mov esi,image ; point to image buffer
|
||||
mcall ; do it
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* SAVE FILE ********
|
||||
; *********************************************
|
||||
save_file:
|
||||
|
||||
mov eax,33 ; function 33 : save file
|
||||
mov ebx,icon ; point to name
|
||||
mov ecx,image ; point to our data
|
||||
mov edx,54+32*32*3 ; how much data to transfer
|
||||
xor esi,esi ; 0 - create a new file
|
||||
mcall ; do it
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* DRAW FILENAME TO SCREEN ********
|
||||
; *********************************************
|
||||
draw_filename:
|
||||
; DRAW COLOUR BACKGROUND
|
||||
pusha ; save all registers on stack
|
||||
mov eax,13 ; function 13 : draw bar
|
||||
mov ebx,73*65536+81 ; [x start] *65536 + [x size]
|
||||
mov ecx,(window_y_size-19)*65536+15 ; [y start] *65536 + [y size]
|
||||
mov edx,0x557799 ; colour 0x00RRGGBB
|
||||
mcall
|
||||
|
||||
mov eax,4 ; function 4 : write text to window
|
||||
mov ebx,78*65536+(window_y_size-15) ; [y start] *65536 + [y size]
|
||||
xor ecx,ecx ; colour 0x00RRGGBB = black
|
||||
mov edx,icon ; point to text
|
||||
mov esi,12 ; number of characters to write
|
||||
cmp byte [editstate],1 ; are we in edit mode
|
||||
jne no_active_1 ; no then jump over change colour
|
||||
mov ecx,0x00112299 ; else change colour
|
||||
no_active_1:
|
||||
mcall ; do it
|
||||
popa ; return all registers to original
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* DRAW ICON FROM LOADED FILE ********
|
||||
; *********************************************
|
||||
draw_icon:
|
||||
|
||||
mov ecx,27 ; y start position
|
||||
mov eax,image+51+32*32*3 ; point to our bmp data
|
||||
mov edi,0 ; line count
|
||||
line:
|
||||
mov esi,0 ; column count
|
||||
mov ebx,269+31 ; x start position
|
||||
pixel:
|
||||
mov edx,[eax] ; colour 0x00RRGGBB from image data
|
||||
push eax ; save our position
|
||||
mov eax,1 ; function 1 : put pixel
|
||||
mcall ; do it
|
||||
pop eax ; restore our position
|
||||
sub eax,3 ; point to next pixel colour
|
||||
dec ebx ; move our x position
|
||||
inc esi ; increment our column count
|
||||
cmp esi,32 ; have we done all columns
|
||||
jne pixel ; no then do next pixel
|
||||
inc ecx ; move our y position
|
||||
inc edi ; increment line count
|
||||
cmp edi,32 ; have we done all lines
|
||||
jne line ; no then do next line
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* DRAW GRAPH FROM LOADED FILE *******
|
||||
; *********************************************
|
||||
draw_graph:
|
||||
|
||||
mov edi,0 ; line count
|
||||
mov eax,image+51+32*32*3 ; point to our bmp data
|
||||
next_lin:
|
||||
mov ecx,edi ; use our line count for position
|
||||
shl ecx,3 ; multiply by eight
|
||||
add ecx,27 ; add y start position
|
||||
shl ecx,16 ; move into top eight bytes [y start]
|
||||
add ecx,7 ; add box height [y size]
|
||||
mov esi,32 ; column count
|
||||
next_bo:
|
||||
mov ebx,esi ; use our column count for position
|
||||
shl ebx,3 ; multiply by eight
|
||||
add ebx,-1 ; add a correction
|
||||
shl ebx,16 ; and move into top eight bytes [x start]
|
||||
add ebx,7 ; add box width [x size]
|
||||
mov edx,[eax] ; point to bmp data
|
||||
push eax ; save our position
|
||||
mov eax,13 ; function 13 : draw bar
|
||||
mcall ; do it
|
||||
pop eax ; restore our position
|
||||
sub eax,3 ; point to next pixel colour
|
||||
dec esi ; increment column count
|
||||
cmp esi,0 ; have we done all columns
|
||||
jne next_bo ; no then do the next column
|
||||
inc edi ; increment line count
|
||||
cmp edi,32 ; have we done all lines
|
||||
jne next_lin ; no then do the next line
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* CLEAR GRAPH and ICON AREA ********
|
||||
; *********************************************
|
||||
clear_graph_icon:
|
||||
|
||||
; CLEAR IMAGE DATA
|
||||
mov edi,image+54 ; point to our data
|
||||
mov eax,0x00000000 ; data to write
|
||||
mov ecx,(32*32*3)/4 ; how much data
|
||||
rep stosd ; repeat until all data transfered
|
||||
call draw_icon ; draw a blank icon
|
||||
call draw_graph ; draw a blank graph
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* FLIP ICON TOP to BOTTOM ********
|
||||
; *********************************************
|
||||
flip_icon:
|
||||
|
||||
mov ecx,image+54 ; point at first line
|
||||
mov edx,image+54+32*32*3+96 ; point 1 line past end
|
||||
|
||||
mov edi,0 ; zero line count
|
||||
lines:
|
||||
mov esi,0 ; zero column count
|
||||
sub edx,192 ; move back 2 lines
|
||||
columns:
|
||||
mov eax,[ecx] ; get bytes
|
||||
mov ebx,[edx] ; get bytes
|
||||
mov [ecx],ebx ; swap bytes
|
||||
mov [edx],eax ; swap bytes
|
||||
add ecx,4 ; move pointer
|
||||
add edx,4 ; move pointer
|
||||
inc esi ; increment column count
|
||||
cmp esi,24 ; have we done all columns
|
||||
jne columns ; no then do next column
|
||||
inc edi ; increment line count
|
||||
cmp edi,16 ; have we done all lines
|
||||
jne lines ; no then do next line
|
||||
call draw_icon ; update icon
|
||||
call draw_graph ; update graph
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* FLIP ICON DIAGONAL ********
|
||||
; *********************************************
|
||||
flip_diag:
|
||||
|
||||
mov ecx,image+54 ; point line 1 first bytes
|
||||
mov edx,image+3600 ; point to buffer
|
||||
xor esi,esi ; zero byte count
|
||||
|
||||
pusha ; save all registers
|
||||
copy_out:
|
||||
mov eax,[ecx] ; get bytes
|
||||
mov [edx],eax ; copy bytes
|
||||
add ecx,4 ; move pointer
|
||||
add edx,4 ; move pointer
|
||||
inc esi ; increment byte count
|
||||
cmp esi,24*32 ; have we done all bytes
|
||||
jne copy_out ; no then do the next
|
||||
popa ; restore all registers
|
||||
|
||||
mov edx,image+3600+32*32*3-3 ; point to last bytes
|
||||
copy_in:
|
||||
mov eax,[edx] ; get bytes
|
||||
mov [ecx],eax ; copy to image first bytes
|
||||
add ecx,3 ; move pointer 3 bytes
|
||||
sub edx,3 ; move pointer 3 bytes
|
||||
inc esi ; increment byte count
|
||||
cmp esi,32*32 ; have we done all bytes
|
||||
jne copy_in ; no then do next
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* DRAW MOUSE ON GRAPH / ICON ********
|
||||
; *********************************************
|
||||
draw_mouse:
|
||||
|
||||
mov eax,37 ; function 37
|
||||
mov ebx,2 ; sub function 2 : check for mouse button
|
||||
mcall ; do it
|
||||
cmp eax,0 ; was a button pressed
|
||||
je exit_mouse ; no then jump to exit
|
||||
cmp eax,1 ; left hand button
|
||||
je colour_mouse ; we are using selected colour
|
||||
mov [draw_colour],0x000000 ; else draw with black
|
||||
jmp blank ; jmp over colour select
|
||||
colour_mouse:
|
||||
mov eax,[sel_colour] ; get our selected colour
|
||||
mov [draw_colour],eax ; save our selected colour
|
||||
blank:
|
||||
mov eax,37 ; function 37
|
||||
mov ebx,1 ; sub function 1 : get mouse position
|
||||
mcall ; do it
|
||||
push eax ; save our x/y position for later
|
||||
and eax,0x0000ffff ; y is in lower bytes
|
||||
add eax,1 ; add 1 because we are zero based
|
||||
mov [my_pos],eax ; save y position
|
||||
pop eax ; restore our x/y position
|
||||
shr eax,16 ; shift x into lower bytes
|
||||
add eax,1 ; add 1 because we are zero based
|
||||
mov [mx_pos],eax ; save x position
|
||||
cmp [mx_pos],7 ; check we are within x/y limits
|
||||
jle exit_mouse
|
||||
cmp [mx_pos],263
|
||||
jge exit_mouse
|
||||
cmp [my_pos],27
|
||||
jle exit_mouse
|
||||
cmp [my_pos],283
|
||||
jge exit_mouse
|
||||
mov eax,[mx_pos] ; calculate nearest square and save
|
||||
sub eax,7 ; subtract 7 graph zero offset
|
||||
shr eax,3 ; divide by 8 (box size) loose remainder
|
||||
mov [icon_x],eax ; save for use later in icon
|
||||
shl eax,3 ; multiply by 8 to get box position
|
||||
add eax,7 ; add 7 graph zero offset
|
||||
mov [gx_pos],eax ; save graph x position
|
||||
mov eax,[my_pos] ; repeat for y
|
||||
sub eax,27 ;
|
||||
shr eax,3 ;
|
||||
mov [icon_y],eax ;
|
||||
shl eax,3 ;
|
||||
add eax,27 ;
|
||||
mov [gy_pos],eax ;
|
||||
mov eax,13 ; function 13 : draw bar
|
||||
mov ebx,[gx_pos] ; load graph x position
|
||||
shl ebx,16 ; shift into high bytes
|
||||
add ebx,7 ; add box size
|
||||
mov ecx,[gy_pos] ; repeat for y
|
||||
shl ecx,16 ;
|
||||
add ecx,7 ;
|
||||
mov edx,[draw_colour] ; give it a colour
|
||||
mcall ; do it
|
||||
mov eax,1 ; function 1 : put pixel
|
||||
mov ebx,[icon_x] ; icon x from above
|
||||
add ebx,269 ; add icon x offset
|
||||
mov ecx,[icon_y] ; icon y from above
|
||||
add ecx,27 ; add icon y offset
|
||||
mov edx,[draw_colour] ; give it a colour
|
||||
mcall ; do it
|
||||
mov ecx,image+54 ; point to our data
|
||||
mov ebx,31 ; 32 lines in image zero based
|
||||
sub ebx,[icon_y] ; get the correct line
|
||||
mov eax,96 ; 96 or 3 bytes per colour * 32 columns
|
||||
mul ebx ; multiply by 96 result in eax
|
||||
add ecx,eax ; add to our position
|
||||
mov ebx,[icon_x] ; get the correct column
|
||||
mov eax,3 ; 3 bytes per colour
|
||||
mul ebx ; multiply by 3 result in eax
|
||||
add ecx,eax ; add to our position
|
||||
mov ebx,[draw_colour] ; get our colour
|
||||
mov [ecx],bl ; move blue into image data
|
||||
mov [ecx+1],bh ; move green into image data
|
||||
shr ebx,16 ; shift red down
|
||||
mov [ecx+2],bl ; move red into image data
|
||||
exit_mouse:
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* GET COLOUR TO DRAW WITH ********
|
||||
; *********************************************
|
||||
check_colour:
|
||||
|
||||
mov eax,37 ; function 37
|
||||
mov ebx,2 ; sub function 2 : check for mouse button
|
||||
mcall ; do it
|
||||
cmp eax,0 ; was a button pressed
|
||||
je exit_draw ; no then jump to exit
|
||||
mov eax,37 ; function 37
|
||||
mov ebx,1 ; sub function 1 : get mouse position
|
||||
mcall ; do it
|
||||
push eax ; save our x/y position for later
|
||||
and eax,0x0000ffff ; y is in lower bytes
|
||||
add eax,1 ; add 1 because we are zero based
|
||||
mov [my_pos],eax ; save y position
|
||||
pop eax ; restore our x/y position
|
||||
shr eax,16 ; shift x into lower bytes
|
||||
add eax,1 ; add 1 because we are zero based
|
||||
mov [mx_pos],eax ; save x position
|
||||
cmp [mx_pos],270 ; check we are within x/y limits
|
||||
jl check_rb
|
||||
cmp [mx_pos],301
|
||||
jg check_rb
|
||||
cmp [my_pos],219
|
||||
jl check_rb
|
||||
cmp [my_pos],250
|
||||
jg check_rb
|
||||
|
||||
call decode_mouse
|
||||
|
||||
mov edi,0
|
||||
next_sel_rg_outer:
|
||||
mov esi,0
|
||||
next_sel_rg_inner:
|
||||
mov eax,1
|
||||
mov ebx,edi
|
||||
shr ebx,3
|
||||
add ebx,308
|
||||
mov ecx,esi
|
||||
shr ecx,3
|
||||
add ecx,211
|
||||
mov edx,[sel_colour]
|
||||
add edx,esi
|
||||
mcall
|
||||
add esi,5
|
||||
cmp esi,255
|
||||
jne next_sel_rg_inner
|
||||
add edi,5
|
||||
cmp edi,255
|
||||
jne next_sel_rg_outer
|
||||
|
||||
|
||||
check_rb:
|
||||
|
||||
cmp [mx_pos],270 ; check we are within x/y limits
|
||||
jl check_bg
|
||||
cmp [mx_pos],301
|
||||
jg check_bg
|
||||
cmp [my_pos],251
|
||||
jle check_bg
|
||||
cmp [my_pos],282
|
||||
jg check_bg
|
||||
|
||||
call decode_mouse
|
||||
|
||||
mov edi,0
|
||||
next_sel_rb_outer:
|
||||
mov esi,0
|
||||
next_sel_rb_inner:
|
||||
mov ebx,edi
|
||||
shr ebx,3
|
||||
add ebx,308
|
||||
mov ecx,esi
|
||||
shr ecx,3
|
||||
add ecx,211
|
||||
mov edx,[sel_colour]
|
||||
mov eax,esi
|
||||
shl eax,8
|
||||
add edx,eax
|
||||
mov eax,1
|
||||
mcall
|
||||
add esi,5
|
||||
cmp esi,255
|
||||
jne next_sel_rb_inner
|
||||
add edi,5
|
||||
cmp edi,255
|
||||
jne next_sel_rb_outer
|
||||
|
||||
|
||||
check_bg:
|
||||
|
||||
cmp [mx_pos],301 ; check we are within x/y limits
|
||||
jl get_colour
|
||||
cmp [mx_pos],333
|
||||
jg get_colour
|
||||
cmp [my_pos],251
|
||||
jl get_colour
|
||||
cmp [my_pos],282
|
||||
jg get_colour
|
||||
|
||||
call decode_mouse
|
||||
|
||||
mov edi,0
|
||||
next_sel_bg_outer:
|
||||
mov esi,0
|
||||
next_sel_bg_inner:
|
||||
mov ebx,edi
|
||||
shr ebx,3
|
||||
add ebx,308
|
||||
mov ecx,esi
|
||||
shr ecx,3
|
||||
add ecx,211
|
||||
mov edx,[sel_colour]
|
||||
mov eax,esi
|
||||
shl eax,16
|
||||
add edx,eax
|
||||
mov eax,1
|
||||
mcall
|
||||
add esi,5
|
||||
cmp esi,255
|
||||
jne next_sel_bg_inner
|
||||
add edi,5
|
||||
cmp edi,255
|
||||
jne next_sel_bg_outer
|
||||
|
||||
get_colour:
|
||||
|
||||
cmp [mx_pos],309 ; check we are within x/y limits
|
||||
jl exit_draw
|
||||
cmp [mx_pos],340
|
||||
jg exit_draw
|
||||
cmp [my_pos],212
|
||||
jl exit_draw
|
||||
cmp [my_pos],243
|
||||
jg exit_draw
|
||||
|
||||
call decode_mouse
|
||||
|
||||
mov eax,13
|
||||
mov ebx,269*65536+71
|
||||
mov ecx,172*65536+32
|
||||
mov edx,[sel_colour]
|
||||
mcall
|
||||
|
||||
mov eax,[sel_colour]
|
||||
mov [draw_colour],eax
|
||||
|
||||
mov eax,47
|
||||
xor ebx,ebx
|
||||
mov ebx,6
|
||||
shl ebx,16
|
||||
mov bh,1
|
||||
mov ecx,[sel_colour]
|
||||
mov edx,273*65536+176
|
||||
mov esi,0x000000
|
||||
mcall
|
||||
|
||||
exit_draw:
|
||||
|
||||
ret
|
||||
|
||||
; *********************************************
|
||||
; ******* DECODE MOUSE POSITION GET PIX *****
|
||||
; *********************************************
|
||||
|
||||
decode_mouse:
|
||||
|
||||
mov eax,37
|
||||
xor ebx,ebx
|
||||
mcall
|
||||
mov ebx,eax
|
||||
mov ecx,eax
|
||||
and ebx,0xffff0000
|
||||
shr ebx,16
|
||||
and ecx,0x0000ffff
|
||||
mov eax,[x_size]
|
||||
imul ecx,eax
|
||||
add ebx,ecx
|
||||
mov eax,35
|
||||
dec ebx
|
||||
mcall
|
||||
|
||||
mov [sel_colour],eax
|
||||
|
||||
ret
|
||||
|
||||
; *********************************************
|
||||
; ******* DATA AREA *****
|
||||
; *********************************************
|
||||
|
||||
mx_pos dd 0x0
|
||||
my_pos dd 0x0
|
||||
|
||||
gx_pos dd 0x0
|
||||
gy_pos dd 0x0
|
||||
|
||||
icon_x dd 0x0
|
||||
icon_y dd 0x0
|
||||
|
||||
x_size dd 0x0
|
||||
y_size dd 0x0
|
||||
|
||||
sel_colour dd 0x00ffffff
|
||||
draw_colour dd 0x00ffffff
|
||||
|
||||
button_text_3 db 'FILENAME'
|
||||
button_text_4 db 'LOAD'
|
||||
button_text_5 db 'SAVE'
|
||||
button_text_6 db 'CLEAR ICON'
|
||||
button_text_7 db 'FLIP VERT '
|
||||
button_text_8 db 'FLIP HORIZ'
|
||||
button_text_9 db 'FLIP DIAG '
|
||||
button_text_10 db 'SET AS BGR'
|
||||
|
||||
title db 'ICON EDITOR',0
|
||||
|
||||
icon: db 'WRITE.BMP '
|
||||
|
||||
editpos db 0
|
||||
editstate db 0
|
||||
|
||||
first_run db 0
|
||||
|
||||
image:
|
||||
|
||||
I_END:
|
|
@ -4,7 +4,7 @@
|
|||
; ;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
include "..\..\..\macros.inc"
|
||||
include "..\..\..\..\macros.inc"
|
||||
include "lang.inc"
|
||||
|
||||
FALSE equ 0
|
||||
|
@ -755,10 +755,10 @@ draw_window:
|
|||
mcall
|
||||
; WINDOW TITLE
|
||||
mcall
|
||||
mov eax,71
|
||||
mov ebx,1
|
||||
mov ecx,labelt
|
||||
int 40h
|
||||
mov eax,71
|
||||
mov ebx,1
|
||||
mov ecx,labelt
|
||||
int 40h
|
||||
|
||||
mov eax,13 ;bar
|
||||
mov ebx,8 shl 16 + 204
|
|
@ -0,0 +1,983 @@
|
|||
;
|
||||
; Modified from original icon editor
|
||||
;
|
||||
; Compile with FASM for Menuet
|
||||
;
|
||||
use32
|
||||
org 0x0
|
||||
db 'MENUET01' ; 8 byte id
|
||||
dd 0x01 ; header version
|
||||
dd START ; start of code
|
||||
dd I_END ; size of image
|
||||
dd 0x100000 ; memory for app
|
||||
dd 0x7fff0 ; esp
|
||||
dd 0x0 , 0x0 ; I_Param , I_Icon
|
||||
|
||||
include 'lang.inc'
|
||||
include '..\..\..\..\macros.inc'
|
||||
|
||||
window_x_size equ 346
|
||||
window_y_size equ 312
|
||||
|
||||
START: ; start of execution
|
||||
|
||||
call draw_window ; at first, draw the window
|
||||
call get_screen_size ; get screen x and y size
|
||||
|
||||
check_mouse:
|
||||
|
||||
call draw_mouse ; are we editing the icon
|
||||
call check_colour ; are we selecting a colour
|
||||
|
||||
still:
|
||||
|
||||
mov eax,23 ; wait here for event
|
||||
mov ebx,1 ; for 1ms
|
||||
mcall
|
||||
|
||||
cmp eax,1 ; redraw request ?
|
||||
je red
|
||||
cmp eax,2 ; key in buffer ?
|
||||
je key
|
||||
cmp eax,3 ; button in buffer ?
|
||||
je button
|
||||
|
||||
jmp check_mouse ; start loop again
|
||||
|
||||
red: ; redraw
|
||||
call draw_window ; draw our window
|
||||
jmp check_mouse ; start the loop again
|
||||
key:
|
||||
|
||||
mov eax,2 ; get a key
|
||||
mcall ; do it
|
||||
shr eax,8 ; move it to al
|
||||
cmp byte [editstate],0 ; are we in edit mode
|
||||
je check_mouse ; if not start loop again
|
||||
cmp al,8 ; is it a backspace
|
||||
jne no_bksp ; if no jump over backspace code
|
||||
cmp byte [editpos],0 ; is it the first character
|
||||
je no_del_last ; if yes jump over backspace code
|
||||
dec byte [editpos] ; decrement our position
|
||||
xor ebx,ebx ; clear pointer
|
||||
mov bl,byte [editpos] ; get our position
|
||||
add ebx,icon ; add our offset
|
||||
mov byte [ebx],0 ; delete character
|
||||
no_del_last:
|
||||
call draw_filename ; update filename
|
||||
jmp check_mouse ; start loop again
|
||||
no_bksp:
|
||||
cmp al,13 ; is it the enter key
|
||||
jne no_enter ; no then jump over enter code
|
||||
mov byte [editstate],0 ; get out of edit mode
|
||||
call draw_filename ; update filename
|
||||
jmp check_mouse ; start loop again
|
||||
no_enter:
|
||||
cmp al,31 ; are we below character 31
|
||||
jbe no_lit ; then must be illegal
|
||||
cmp al,97 ; are we below character 97
|
||||
jb capital ; then must be ok
|
||||
sub eax,32 ; else subtract 32 from it to make it legal
|
||||
capital:
|
||||
xor ebx,ebx ; clear our pointer
|
||||
mov bl,byte [editpos] ; get our position
|
||||
add ebx,icon ; add our offset
|
||||
mov byte [ebx],al ; move our character into buffer
|
||||
inc byte [editpos] ; increment our edit position
|
||||
cmp byte [editpos],12 ; are we at our last position
|
||||
jne no_null_state ; no then jump over last position code
|
||||
mov byte [editstate],0 ; get out of edit mode
|
||||
no_null_state:
|
||||
call draw_filename ; update filename
|
||||
no_lit:
|
||||
jmp check_mouse ; start loop again
|
||||
|
||||
button: ; button
|
||||
mov eax,17 ; get id
|
||||
mcall
|
||||
|
||||
cmp ah,1 ; button id=1 ?
|
||||
jne button_3
|
||||
mov eax,-1 ; close this program
|
||||
mcall
|
||||
button_3:
|
||||
cmp ah,3 ; was it button 3 - FILENAME
|
||||
jne button_4 ; no then try button 4
|
||||
cld ;
|
||||
mov byte [editstate],1 ; enter edit mode
|
||||
mov edi,icon ; point to our buffer
|
||||
mov eax,0x20202020 ; file reg with 4 spaces
|
||||
mov ecx,3 ; going to write it 3 times
|
||||
rep stosd ; repeat giving 12 spaces
|
||||
mov byte [editpos],0 ; zero our edit position
|
||||
call draw_filename ; update filename
|
||||
jmp check_mouse ; start loop again
|
||||
button_4:
|
||||
cmp ah,4 ; was it button 4 - LOAD
|
||||
jne button_5 ; no then try button 5
|
||||
mov byte [editstate],0 ; dont want to be in edit mode
|
||||
call draw_filename ; update filename
|
||||
call load_file ; load the file
|
||||
call draw_icon ; update icon screen
|
||||
call draw_graph ; update edit screen
|
||||
jmp check_mouse ; start loop again
|
||||
button_5:
|
||||
cmp ah,5 ; was it button 5 - SAVE
|
||||
jne button_6 ; no then try button 6
|
||||
mov byte [editstate],0 ; dont want to be in edit mode
|
||||
call draw_filename ; update filename
|
||||
call save_file ; save the file
|
||||
jmp check_mouse ; start loop again
|
||||
button_6:
|
||||
cmp ah,6 ; was it button 6 - CLEAR ICON
|
||||
jne button_7 ; no then try button 7
|
||||
mov byte [editstate],0 ; dont want to be in edit mode
|
||||
call draw_filename ; update filename
|
||||
call clear_graph_icon ; clear the icon and edit screens
|
||||
jmp check_mouse
|
||||
|
||||
button_7:
|
||||
cmp ah,7 ; was it button 7 - FLIP ICON
|
||||
jne button_8 ; no then try button 8
|
||||
call flip_icon ; flip
|
||||
jmp check_mouse
|
||||
|
||||
button_8:
|
||||
cmp ah,8 ; was it button 8 - MIRROR ICON
|
||||
jne button_9 ; no then try button 9
|
||||
call flip_diag ; flip L/R and U/D
|
||||
call flip_icon ; cheated now have to flip it
|
||||
jmp check_mouse
|
||||
|
||||
button_9:
|
||||
cmp ah,9 ; was it button 9 - FLIP L/R and U/D
|
||||
jne button_10 ; no then try button 10
|
||||
call flip_diag ; flip L/R and U/D
|
||||
call draw_icon ; update icon
|
||||
call draw_graph ; update graph
|
||||
jmp check_mouse
|
||||
|
||||
button_10:
|
||||
cmp ah,10 ; was it button 9 - SET AS BGR
|
||||
jne check_mouse ; no then exit
|
||||
call set_background ; set as background
|
||||
|
||||
jmp check_mouse ; start loop again
|
||||
|
||||
; *********************************************
|
||||
; ******* WINDOW DEFINITIONS AND DRAW ********
|
||||
; *********************************************
|
||||
draw_window:
|
||||
|
||||
mov eax,12 ; function 12:tell os about windowdraw
|
||||
mov ebx,1 ; 1, start of draw
|
||||
mcall
|
||||
; DRAW WINDOW
|
||||
mov eax,0 ; function 0 : define and draw window
|
||||
mov ebx,100*65536+window_x_size ; [x start] *65536 + [x size]
|
||||
mov ecx,100*65536+window_y_size ; [y start] *65536 + [y size]
|
||||
mov edx,0x14ffffff ; color of work area 0x00RRGGBB
|
||||
mov edi,title ; WINDOW LABEL
|
||||
mcall
|
||||
|
||||
mov eax,13 ; function 13 : draw bar
|
||||
mov ebx,5*65536+window_x_size-9 ; [x start] *65536 + [x size]
|
||||
mov ecx,(window_y_size-20)*65536+16 ; [y start] *65536 + [y size]
|
||||
mov edx,0x7799bb ; colour 0x00RRGGBB
|
||||
mcall
|
||||
; DEFINE BUTTON 3 : FILENAME
|
||||
mov eax,8 ; function 8 : define button
|
||||
mov ebx,5*65536+62 ; [x start] *65536 + [x size]
|
||||
mov ecx,(window_y_size-19)*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,3 ; button id number
|
||||
mov esi,0x7799bb ; button color 0x00RRGGBB
|
||||
mcall
|
||||
; BUTTON 3 TEXT
|
||||
mov eax,4 ; function 4 : write text to window
|
||||
mov ebx,13*65536+window_y_size-15 ; [x start] *65536 + [y start]
|
||||
mov ecx,0xddeeff ; text color 0x00RRGGBB
|
||||
mov edx,button_text_3 ; pointer to text beginning
|
||||
mov esi,8 ; text length
|
||||
mcall
|
||||
|
||||
call draw_filename ; update filename
|
||||
|
||||
; DEFINE BUTTON 4 : LOAD
|
||||
mov eax,8 ; function 8 : define button
|
||||
mov ebx,(window_x_size-87)*65536+38 ; [x start] *65536 + [x size]
|
||||
mov ecx,(window_y_size-19)*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,4 ; button id number
|
||||
mov esi,0x7799bb ; button color 0x00RRGGBB
|
||||
mcall
|
||||
; DEFINE BUTTON 5 : SAVE
|
||||
mov ebx,(window_x_size-43)*65536+38 ; [x start] *65536 + [x size]
|
||||
mov edx,5 ; button id number
|
||||
mcall
|
||||
; DEFINE BUTTON 6 : CLEAR ICON
|
||||
mov ebx,268*65536+72 ; [x start] *65536 + [x size]
|
||||
mov ecx,65*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,6 ; button id number
|
||||
mcall
|
||||
; DEFINE BUTTON 7 : FLIP VERTICAL
|
||||
mov ecx,85*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,7 ; button id number
|
||||
mcall
|
||||
; DEFINE BUTTON 8 : FLIP HORIZONTAL
|
||||
mov ecx,105*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,8 ; button id number
|
||||
mcall
|
||||
; DEFINE BUTTON 9 : SET AS BACKGROUND
|
||||
mov ecx,125*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,9 ; button id number
|
||||
mcall
|
||||
; DEFINE BUTTON 10 : SET AS BACKGROUND
|
||||
mov ecx,145*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,10 ; button id number
|
||||
mcall
|
||||
; BUTTON 4 TEXT
|
||||
mov eax,4 ; function 4 : write text to window
|
||||
mov ebx,267*65536+window_y_size-15 ; [x start] *65536 + [y start]
|
||||
mov ecx,0xddeeff ; text color 0x00RRGGBB
|
||||
mov edx,button_text_4 ; pointer to text beginning
|
||||
mov esi,4 ; text length
|
||||
mcall
|
||||
; BUTTON 5 TEXT
|
||||
mov ebx,311*65536+window_y_size-15 ; [x start] *65536 + [y start]
|
||||
mov edx,button_text_5 ; pointer to text beginning
|
||||
mcall
|
||||
; BUTTON 6 TEXT
|
||||
mov ebx,275*65536+69 ; [x start] *65536 + [y start]
|
||||
mov edx,button_text_6 ; pointer to text beginning
|
||||
mov esi,10 ; text length
|
||||
mcall
|
||||
; BUTTON 7 TEXT
|
||||
mov ebx,275*65536+89 ; [x start] *65536 + [y start]
|
||||
mov edx,button_text_7 ; pointer to text beginning
|
||||
mcall
|
||||
; BUTTON 8 TEXT
|
||||
mov ebx,275*65536+109 ; [x start] *65536 + [y start]
|
||||
mov edx,button_text_8 ; pointer to text beginning
|
||||
mcall
|
||||
; BUTTON 9 TEXT
|
||||
mov ebx,275*65536+129 ; [x start] *65536 + [y start]
|
||||
mov edx,button_text_9 ; pointer to text beginning
|
||||
mcall
|
||||
; BUTTON 10 TEXT
|
||||
mov ebx,275*65536+149 ; [x start] *65536 + [y start]
|
||||
mov edx,button_text_10 ; pointer to text beginning
|
||||
mcall
|
||||
; DRAW GRAPH BACKGROUND
|
||||
mov eax,13 ; function 13 : draw bar
|
||||
mov ebx,6*65536+257 ; [x start] *65536 + [x size]
|
||||
mov ecx,26*65536+257 ; [y start] *65536 + [y size]
|
||||
mov edx,0x7799bb ; colour 0x00RRGGBB
|
||||
mcall
|
||||
; DRAW ICON BACKGROUND
|
||||
mov ebx,268*65536+34 ; [x start] *65536 + [x size]
|
||||
mov ecx,26*65536+34 ; [y start] *65536 + [y size]
|
||||
mcall
|
||||
; DRAW PALETTE BACKGROUND
|
||||
mov ebx,268*65536+34 ; [x start] *65536 + [x size]
|
||||
mov ecx,217*65536+33 ; [y start] *65536 + [y size]
|
||||
mcall
|
||||
; DRAW PALETTE BACKGROUND
|
||||
mov ebx,268*65536+33 ; [x start] *65536 + [x size]
|
||||
mov ecx,250*65536+33 ; [y start] *65536 + [y size]
|
||||
mcall
|
||||
; DRAW PALETTE BACKGROUND
|
||||
mov ebx,301*65536+33 ; [x start] *65536 + [x size]
|
||||
mov ecx,249*65536+34 ; [y start] *65536 + [y size]
|
||||
mcall
|
||||
; DRAW GREYSCALE BACKGROUND
|
||||
mov ebx,307*65536+34 ; [x start] *65536 + [x size]
|
||||
mov ecx,210*65536+34 ; [y start] *65536 + [y size]
|
||||
mcall
|
||||
; DRAW SELECTED COLOUR BACKGROUND
|
||||
mov ebx,268*65536+73 ; [x start] *65536 + [x size]
|
||||
mov ecx,171*65536+34 ; [y start] *65536 + [y size]
|
||||
mcall
|
||||
; DRAW WHITE TO START
|
||||
mov ebx,269*65536+71 ; [x start] *65536 + [x size]
|
||||
mov ecx,172*65536+32 ; [y start] *65536 + [y size]
|
||||
mov edx,0xffffff ; colour 0x00RRGGBB
|
||||
mcall
|
||||
; DRAW PALETTE RED + GREEN SECTION
|
||||
xor edi,edi ; clear column loop count
|
||||
next_r_g_outer:
|
||||
xor esi,esi ; clear line loop count
|
||||
next_r_g_inner:
|
||||
mov eax,1 ; function 1 : putpixel
|
||||
mov ebx,edi ; get column count
|
||||
shr ebx,3 ; divide by 8
|
||||
add ebx,269 ; add our x offset
|
||||
mov ecx,esi ; get our line count
|
||||
shr ecx,3 ; divide by 8
|
||||
add ecx,218 ; add our y offset
|
||||
mov edx,255 ; maximum red
|
||||
sub edx,edi ; minus column count
|
||||
shl edx,8 ; into position 0x0000RR00
|
||||
add edx,255 ; maximum green
|
||||
sub edx,esi ; minus line count
|
||||
shl edx,8 ; into position 0x00RRGG00
|
||||
mcall
|
||||
add esi,5 ; colour in steps of 5 to keep small
|
||||
cmp esi,255 ; have we done a line
|
||||
jne next_r_g_inner ; nop then do next pixel
|
||||
add edi,5 ; colour in steps of 5 to keep small
|
||||
cmp edi,255 ; have we done all columns
|
||||
jne next_r_g_outer ; no then start the next one
|
||||
|
||||
; DRAW PALETTE GREEN + BLUE SECTION
|
||||
mov edi,0 ; as above
|
||||
next_g_b_outer:
|
||||
mov esi,0
|
||||
next_g_b_inner:
|
||||
mov eax,1
|
||||
mov ebx,edi
|
||||
shr ebx,3
|
||||
add ebx,269
|
||||
mov ecx,esi
|
||||
shr ecx,3
|
||||
add ecx,250
|
||||
mov edx,255
|
||||
sub edx,edi
|
||||
shl edx,16
|
||||
add edx,esi
|
||||
mcall
|
||||
add esi,5
|
||||
cmp esi,255
|
||||
jne next_g_b_inner
|
||||
add edi,5
|
||||
cmp edi,255
|
||||
jne next_g_b_outer
|
||||
|
||||
; DRAW PALETTE BLUE + RED SECTION
|
||||
mov edi,0 ; as above
|
||||
next_b_r_outer:
|
||||
mov esi,0
|
||||
next_b_r_inner:
|
||||
mov eax,1
|
||||
mov ebx,edi
|
||||
shr ebx,3
|
||||
add ebx,301
|
||||
mov ecx,esi
|
||||
shr ecx,3
|
||||
add ecx,250
|
||||
mov edx,edi
|
||||
shl edx,8
|
||||
add edx,esi
|
||||
mcall
|
||||
add esi,5
|
||||
cmp esi,255
|
||||
jne next_b_r_inner
|
||||
add edi,5
|
||||
cmp edi,255
|
||||
jne next_b_r_outer
|
||||
|
||||
; DRAW GREYSCALE
|
||||
mov edi,0
|
||||
next_b_w_outer:
|
||||
mov esi,0
|
||||
next_b_w_inner:
|
||||
mov eax,1
|
||||
mov ebx,edi
|
||||
shr ebx,3
|
||||
add ebx,308
|
||||
mov ecx,esi
|
||||
shr ecx,3
|
||||
add ecx,211
|
||||
mov edx,esi
|
||||
shl edx,8
|
||||
add edx,esi
|
||||
shl edx,8
|
||||
add edx,esi
|
||||
mcall
|
||||
add esi,5
|
||||
cmp esi,255
|
||||
jne next_b_w_inner
|
||||
add edi,5
|
||||
cmp edi,255
|
||||
jne next_b_w_outer
|
||||
|
||||
cmp [first_run],0 ; is it the first window draw
|
||||
jne dont_load ; no then dont reload the file
|
||||
call load_file ; load initial file
|
||||
mov [first_run],1 ; first window draw done
|
||||
dont_load:
|
||||
call draw_icon ; draw icon area
|
||||
call draw_graph ; draw edit area
|
||||
|
||||
mov eax,12 ; function 12:tell os about windowdraw
|
||||
mov ebx,2 ; 2, end of draw
|
||||
mcall
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* SET BACKGROUND ********
|
||||
; *********************************************
|
||||
set_background:
|
||||
|
||||
mov ecx,image+3600 ; point to our decode buffer
|
||||
mov edx,image+54+32*32*3-96 ; point to last line of bmp
|
||||
|
||||
mov edi,0 ; zero line count
|
||||
decode_line:
|
||||
mov esi,0 ; zero column count
|
||||
decode_column:
|
||||
mov ebx,[edx] ; get our data
|
||||
mov [ecx],ebx ; store our data
|
||||
add ecx,4 ; add 4 bytes to pointer as using double word
|
||||
add edx,4 ; add 4 bytes to pointer
|
||||
inc esi ; increment column count
|
||||
cmp esi,24 ; have we done all columns
|
||||
jne decode_column ; no then do some more
|
||||
sub edx,192 ; move back 2 lines of bmp data
|
||||
inc edi ; increment line count
|
||||
cmp edi,33 ; have we done all lines
|
||||
jne decode_line ; no then do another one
|
||||
|
||||
mov eax,15 ; background
|
||||
mov ebx,1 ; set background size
|
||||
mov ecx,32 ; x size
|
||||
mov edx,32 ; y size
|
||||
mcall ; do it
|
||||
mov ebx,4 ; type of background draw
|
||||
mov ecx,1 ; tile
|
||||
mcall ; do it
|
||||
mov ebx,5 ; blockmove image to os bgr memory
|
||||
mov ecx,image+3600 ; point to image
|
||||
mov edx,0 ; start of bgr memory
|
||||
mov esi,32*32*3 ; byte count
|
||||
mcall ; do it
|
||||
mov ebx,3 ; draw background
|
||||
mcall ; do it
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* GET SCREEN X and Y SIZE ********
|
||||
; *********************************************
|
||||
get_screen_size:
|
||||
|
||||
mov eax,14 ; function 14 : get screen max
|
||||
mcall ; returns eax : 0xXXXXYYYY
|
||||
push eax ; save reg
|
||||
and eax,0x0000ffff ; split out y size
|
||||
add eax,1 ; add 1 to remove zero base
|
||||
mov [y_size],eax ; store for later
|
||||
pop eax ; restore reg
|
||||
shr eax,16 ; move x size down the reg
|
||||
add eax,1 ; add 1 to remove zero base
|
||||
mov [x_size],eax ; store for later
|
||||
|
||||
ret
|
||||
|
||||
; *********************************************
|
||||
; ******* LOAD FILE ********
|
||||
; *********************************************
|
||||
load_file:
|
||||
|
||||
mov eax,6 ; function 6 : load file
|
||||
mov ebx,icon ; point to the name
|
||||
mov ecx,0 ; reserved
|
||||
mov edx,200000 ; reserved
|
||||
mov esi,image ; point to image buffer
|
||||
mcall ; do it
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* SAVE FILE ********
|
||||
; *********************************************
|
||||
save_file:
|
||||
|
||||
mov eax,33 ; function 33 : save file
|
||||
mov ebx,icon ; point to name
|
||||
mov ecx,image ; point to our data
|
||||
mov edx,54+32*32*3 ; how much data to transfer
|
||||
xor esi,esi ; 0 - create a new file
|
||||
mcall ; do it
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* DRAW FILENAME TO SCREEN ********
|
||||
; *********************************************
|
||||
draw_filename:
|
||||
; DRAW COLOUR BACKGROUND
|
||||
pusha ; save all registers on stack
|
||||
mov eax,13 ; function 13 : draw bar
|
||||
mov ebx,73*65536+81 ; [x start] *65536 + [x size]
|
||||
mov ecx,(window_y_size-19)*65536+15 ; [y start] *65536 + [y size]
|
||||
mov edx,0x557799 ; colour 0x00RRGGBB
|
||||
mcall
|
||||
|
||||
mov eax,4 ; function 4 : write text to window
|
||||
mov ebx,78*65536+(window_y_size-15) ; [y start] *65536 + [y size]
|
||||
xor ecx,ecx ; colour 0x00RRGGBB = black
|
||||
mov edx,icon ; point to text
|
||||
mov esi,12 ; number of characters to write
|
||||
cmp byte [editstate],1 ; are we in edit mode
|
||||
jne no_active_1 ; no then jump over change colour
|
||||
mov ecx,0x00112299 ; else change colour
|
||||
no_active_1:
|
||||
mcall ; do it
|
||||
popa ; return all registers to original
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* DRAW ICON FROM LOADED FILE ********
|
||||
; *********************************************
|
||||
draw_icon:
|
||||
|
||||
mov ecx,27 ; y start position
|
||||
mov eax,image+51+32*32*3 ; point to our bmp data
|
||||
mov edi,0 ; line count
|
||||
line:
|
||||
mov esi,0 ; column count
|
||||
mov ebx,269+31 ; x start position
|
||||
pixel:
|
||||
mov edx,[eax] ; colour 0x00RRGGBB from image data
|
||||
push eax ; save our position
|
||||
mov eax,1 ; function 1 : put pixel
|
||||
mcall ; do it
|
||||
pop eax ; restore our position
|
||||
sub eax,3 ; point to next pixel colour
|
||||
dec ebx ; move our x position
|
||||
inc esi ; increment our column count
|
||||
cmp esi,32 ; have we done all columns
|
||||
jne pixel ; no then do next pixel
|
||||
inc ecx ; move our y position
|
||||
inc edi ; increment line count
|
||||
cmp edi,32 ; have we done all lines
|
||||
jne line ; no then do next line
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* DRAW GRAPH FROM LOADED FILE *******
|
||||
; *********************************************
|
||||
draw_graph:
|
||||
|
||||
mov edi,0 ; line count
|
||||
mov eax,image+51+32*32*3 ; point to our bmp data
|
||||
next_lin:
|
||||
mov ecx,edi ; use our line count for position
|
||||
shl ecx,3 ; multiply by eight
|
||||
add ecx,27 ; add y start position
|
||||
shl ecx,16 ; move into top eight bytes [y start]
|
||||
add ecx,7 ; add box height [y size]
|
||||
mov esi,32 ; column count
|
||||
next_bo:
|
||||
mov ebx,esi ; use our column count for position
|
||||
shl ebx,3 ; multiply by eight
|
||||
add ebx,-1 ; add a correction
|
||||
shl ebx,16 ; and move into top eight bytes [x start]
|
||||
add ebx,7 ; add box width [x size]
|
||||
mov edx,[eax] ; point to bmp data
|
||||
push eax ; save our position
|
||||
mov eax,13 ; function 13 : draw bar
|
||||
mcall ; do it
|
||||
pop eax ; restore our position
|
||||
sub eax,3 ; point to next pixel colour
|
||||
dec esi ; increment column count
|
||||
cmp esi,0 ; have we done all columns
|
||||
jne next_bo ; no then do the next column
|
||||
inc edi ; increment line count
|
||||
cmp edi,32 ; have we done all lines
|
||||
jne next_lin ; no then do the next line
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* CLEAR GRAPH and ICON AREA ********
|
||||
; *********************************************
|
||||
clear_graph_icon:
|
||||
|
||||
; CLEAR IMAGE DATA
|
||||
mov edi,image+54 ; point to our data
|
||||
mov eax,0x00000000 ; data to write
|
||||
mov ecx,(32*32*3)/4 ; how much data
|
||||
rep stosd ; repeat until all data transfered
|
||||
call draw_icon ; draw a blank icon
|
||||
call draw_graph ; draw a blank graph
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* FLIP ICON TOP to BOTTOM ********
|
||||
; *********************************************
|
||||
flip_icon:
|
||||
|
||||
mov ecx,image+54 ; point at first line
|
||||
mov edx,image+54+32*32*3+96 ; point 1 line past end
|
||||
|
||||
mov edi,0 ; zero line count
|
||||
lines:
|
||||
mov esi,0 ; zero column count
|
||||
sub edx,192 ; move back 2 lines
|
||||
columns:
|
||||
mov eax,[ecx] ; get bytes
|
||||
mov ebx,[edx] ; get bytes
|
||||
mov [ecx],ebx ; swap bytes
|
||||
mov [edx],eax ; swap bytes
|
||||
add ecx,4 ; move pointer
|
||||
add edx,4 ; move pointer
|
||||
inc esi ; increment column count
|
||||
cmp esi,24 ; have we done all columns
|
||||
jne columns ; no then do next column
|
||||
inc edi ; increment line count
|
||||
cmp edi,16 ; have we done all lines
|
||||
jne lines ; no then do next line
|
||||
call draw_icon ; update icon
|
||||
call draw_graph ; update graph
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* FLIP ICON DIAGONAL ********
|
||||
; *********************************************
|
||||
flip_diag:
|
||||
|
||||
mov ecx,image+54 ; point line 1 first bytes
|
||||
mov edx,image+3600 ; point to buffer
|
||||
xor esi,esi ; zero byte count
|
||||
|
||||
pusha ; save all registers
|
||||
copy_out:
|
||||
mov eax,[ecx] ; get bytes
|
||||
mov [edx],eax ; copy bytes
|
||||
add ecx,4 ; move pointer
|
||||
add edx,4 ; move pointer
|
||||
inc esi ; increment byte count
|
||||
cmp esi,24*32 ; have we done all bytes
|
||||
jne copy_out ; no then do the next
|
||||
popa ; restore all registers
|
||||
|
||||
mov edx,image+3600+32*32*3-3 ; point to last bytes
|
||||
copy_in:
|
||||
mov eax,[edx] ; get bytes
|
||||
mov [ecx],eax ; copy to image first bytes
|
||||
add ecx,3 ; move pointer 3 bytes
|
||||
sub edx,3 ; move pointer 3 bytes
|
||||
inc esi ; increment byte count
|
||||
cmp esi,32*32 ; have we done all bytes
|
||||
jne copy_in ; no then do next
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* DRAW MOUSE ON GRAPH / ICON ********
|
||||
; *********************************************
|
||||
draw_mouse:
|
||||
|
||||
mov eax,37 ; function 37
|
||||
mov ebx,2 ; sub function 2 : check for mouse button
|
||||
mcall ; do it
|
||||
cmp eax,0 ; was a button pressed
|
||||
je exit_mouse ; no then jump to exit
|
||||
cmp eax,1 ; left hand button
|
||||
je colour_mouse ; we are using selected colour
|
||||
mov [draw_colour],0x000000 ; else draw with black
|
||||
jmp blank ; jmp over colour select
|
||||
colour_mouse:
|
||||
mov eax,[sel_colour] ; get our selected colour
|
||||
mov [draw_colour],eax ; save our selected colour
|
||||
blank:
|
||||
mov eax,37 ; function 37
|
||||
mov ebx,1 ; sub function 1 : get mouse position
|
||||
mcall ; do it
|
||||
push eax ; save our x/y position for later
|
||||
and eax,0x0000ffff ; y is in lower bytes
|
||||
add eax,1 ; add 1 because we are zero based
|
||||
mov [my_pos],eax ; save y position
|
||||
pop eax ; restore our x/y position
|
||||
shr eax,16 ; shift x into lower bytes
|
||||
add eax,1 ; add 1 because we are zero based
|
||||
mov [mx_pos],eax ; save x position
|
||||
cmp [mx_pos],7 ; check we are within x/y limits
|
||||
jle exit_mouse
|
||||
cmp [mx_pos],263
|
||||
jge exit_mouse
|
||||
cmp [my_pos],27
|
||||
jle exit_mouse
|
||||
cmp [my_pos],283
|
||||
jge exit_mouse
|
||||
mov eax,[mx_pos] ; calculate nearest square and save
|
||||
sub eax,7 ; subtract 7 graph zero offset
|
||||
shr eax,3 ; divide by 8 (box size) loose remainder
|
||||
mov [icon_x],eax ; save for use later in icon
|
||||
shl eax,3 ; multiply by 8 to get box position
|
||||
add eax,7 ; add 7 graph zero offset
|
||||
mov [gx_pos],eax ; save graph x position
|
||||
mov eax,[my_pos] ; repeat for y
|
||||
sub eax,27 ;
|
||||
shr eax,3 ;
|
||||
mov [icon_y],eax ;
|
||||
shl eax,3 ;
|
||||
add eax,27 ;
|
||||
mov [gy_pos],eax ;
|
||||
mov eax,13 ; function 13 : draw bar
|
||||
mov ebx,[gx_pos] ; load graph x position
|
||||
shl ebx,16 ; shift into high bytes
|
||||
add ebx,7 ; add box size
|
||||
mov ecx,[gy_pos] ; repeat for y
|
||||
shl ecx,16 ;
|
||||
add ecx,7 ;
|
||||
mov edx,[draw_colour] ; give it a colour
|
||||
mcall ; do it
|
||||
mov eax,1 ; function 1 : put pixel
|
||||
mov ebx,[icon_x] ; icon x from above
|
||||
add ebx,269 ; add icon x offset
|
||||
mov ecx,[icon_y] ; icon y from above
|
||||
add ecx,27 ; add icon y offset
|
||||
mov edx,[draw_colour] ; give it a colour
|
||||
mcall ; do it
|
||||
mov ecx,image+54 ; point to our data
|
||||
mov ebx,31 ; 32 lines in image zero based
|
||||
sub ebx,[icon_y] ; get the correct line
|
||||
mov eax,96 ; 96 or 3 bytes per colour * 32 columns
|
||||
mul ebx ; multiply by 96 result in eax
|
||||
add ecx,eax ; add to our position
|
||||
mov ebx,[icon_x] ; get the correct column
|
||||
mov eax,3 ; 3 bytes per colour
|
||||
mul ebx ; multiply by 3 result in eax
|
||||
add ecx,eax ; add to our position
|
||||
mov ebx,[draw_colour] ; get our colour
|
||||
mov [ecx],bl ; move blue into image data
|
||||
mov [ecx+1],bh ; move green into image data
|
||||
shr ebx,16 ; shift red down
|
||||
mov [ecx+2],bl ; move red into image data
|
||||
exit_mouse:
|
||||
|
||||
ret ; return
|
||||
|
||||
; *********************************************
|
||||
; ******* GET COLOUR TO DRAW WITH ********
|
||||
; *********************************************
|
||||
check_colour:
|
||||
|
||||
mov eax,37 ; function 37
|
||||
mov ebx,2 ; sub function 2 : check for mouse button
|
||||
mcall ; do it
|
||||
cmp eax,0 ; was a button pressed
|
||||
je exit_draw ; no then jump to exit
|
||||
mov eax,37 ; function 37
|
||||
mov ebx,1 ; sub function 1 : get mouse position
|
||||
mcall ; do it
|
||||
push eax ; save our x/y position for later
|
||||
and eax,0x0000ffff ; y is in lower bytes
|
||||
add eax,1 ; add 1 because we are zero based
|
||||
mov [my_pos],eax ; save y position
|
||||
pop eax ; restore our x/y position
|
||||
shr eax,16 ; shift x into lower bytes
|
||||
add eax,1 ; add 1 because we are zero based
|
||||
mov [mx_pos],eax ; save x position
|
||||
cmp [mx_pos],270 ; check we are within x/y limits
|
||||
jl check_rb
|
||||
cmp [mx_pos],301
|
||||
jg check_rb
|
||||
cmp [my_pos],219
|
||||
jl check_rb
|
||||
cmp [my_pos],250
|
||||
jg check_rb
|
||||
|
||||
call decode_mouse
|
||||
|
||||
mov edi,0
|
||||
next_sel_rg_outer:
|
||||
mov esi,0
|
||||
next_sel_rg_inner:
|
||||
mov eax,1
|
||||
mov ebx,edi
|
||||
shr ebx,3
|
||||
add ebx,308
|
||||
mov ecx,esi
|
||||
shr ecx,3
|
||||
add ecx,211
|
||||
mov edx,[sel_colour]
|
||||
add edx,esi
|
||||
mcall
|
||||
add esi,5
|
||||
cmp esi,255
|
||||
jne next_sel_rg_inner
|
||||
add edi,5
|
||||
cmp edi,255
|
||||
jne next_sel_rg_outer
|
||||
|
||||
|
||||
check_rb:
|
||||
|
||||
cmp [mx_pos],270 ; check we are within x/y limits
|
||||
jl check_bg
|
||||
cmp [mx_pos],301
|
||||
jg check_bg
|
||||
cmp [my_pos],251
|
||||
jle check_bg
|
||||
cmp [my_pos],282
|
||||
jg check_bg
|
||||
|
||||
call decode_mouse
|
||||
|
||||
mov edi,0
|
||||
next_sel_rb_outer:
|
||||
mov esi,0
|
||||
next_sel_rb_inner:
|
||||
mov ebx,edi
|
||||
shr ebx,3
|
||||
add ebx,308
|
||||
mov ecx,esi
|
||||
shr ecx,3
|
||||
add ecx,211
|
||||
mov edx,[sel_colour]
|
||||
mov eax,esi
|
||||
shl eax,8
|
||||
add edx,eax
|
||||
mov eax,1
|
||||
mcall
|
||||
add esi,5
|
||||
cmp esi,255
|
||||
jne next_sel_rb_inner
|
||||
add edi,5
|
||||
cmp edi,255
|
||||
jne next_sel_rb_outer
|
||||
|
||||
|
||||
check_bg:
|
||||
|
||||
cmp [mx_pos],301 ; check we are within x/y limits
|
||||
jl get_colour
|
||||
cmp [mx_pos],333
|
||||
jg get_colour
|
||||
cmp [my_pos],251
|
||||
jl get_colour
|
||||
cmp [my_pos],282
|
||||
jg get_colour
|
||||
|
||||
call decode_mouse
|
||||
|
||||
mov edi,0
|
||||
next_sel_bg_outer:
|
||||
mov esi,0
|
||||
next_sel_bg_inner:
|
||||
mov ebx,edi
|
||||
shr ebx,3
|
||||
add ebx,308
|
||||
mov ecx,esi
|
||||
shr ecx,3
|
||||
add ecx,211
|
||||
mov edx,[sel_colour]
|
||||
mov eax,esi
|
||||
shl eax,16
|
||||
add edx,eax
|
||||
mov eax,1
|
||||
mcall
|
||||
add esi,5
|
||||
cmp esi,255
|
||||
jne next_sel_bg_inner
|
||||
add edi,5
|
||||
cmp edi,255
|
||||
jne next_sel_bg_outer
|
||||
|
||||
get_colour:
|
||||
|
||||
cmp [mx_pos],309 ; check we are within x/y limits
|
||||
jl exit_draw
|
||||
cmp [mx_pos],340
|
||||
jg exit_draw
|
||||
cmp [my_pos],212
|
||||
jl exit_draw
|
||||
cmp [my_pos],243
|
||||
jg exit_draw
|
||||
|
||||
call decode_mouse
|
||||
|
||||
mov eax,13
|
||||
mov ebx,269*65536+71
|
||||
mov ecx,172*65536+32
|
||||
mov edx,[sel_colour]
|
||||
mcall
|
||||
|
||||
mov eax,[sel_colour]
|
||||
mov [draw_colour],eax
|
||||
|
||||
mov eax,47
|
||||
xor ebx,ebx
|
||||
mov ebx,6
|
||||
shl ebx,16
|
||||
mov bh,1
|
||||
mov ecx,[sel_colour]
|
||||
mov edx,273*65536+176
|
||||
mov esi,0x000000
|
||||
mcall
|
||||
|
||||
exit_draw:
|
||||
|
||||
ret
|
||||
|
||||
; *********************************************
|
||||
; ******* DECODE MOUSE POSITION GET PIX *****
|
||||
; *********************************************
|
||||
|
||||
decode_mouse:
|
||||
|
||||
mov eax,37
|
||||
xor ebx,ebx
|
||||
mcall
|
||||
mov ebx,eax
|
||||
mov ecx,eax
|
||||
and ebx,0xffff0000
|
||||
shr ebx,16
|
||||
and ecx,0x0000ffff
|
||||
mov eax,[x_size]
|
||||
imul ecx,eax
|
||||
add ebx,ecx
|
||||
mov eax,35
|
||||
dec ebx
|
||||
mcall
|
||||
|
||||
mov [sel_colour],eax
|
||||
|
||||
ret
|
||||
|
||||
; *********************************************
|
||||
; ******* DATA AREA *****
|
||||
; *********************************************
|
||||
|
||||
mx_pos dd 0x0
|
||||
my_pos dd 0x0
|
||||
|
||||
gx_pos dd 0x0
|
||||
gy_pos dd 0x0
|
||||
|
||||
icon_x dd 0x0
|
||||
icon_y dd 0x0
|
||||
|
||||
x_size dd 0x0
|
||||
y_size dd 0x0
|
||||
|
||||
sel_colour dd 0x00ffffff
|
||||
draw_colour dd 0x00ffffff
|
||||
|
||||
button_text_3 db 'FILENAME'
|
||||
button_text_4 db 'LOAD'
|
||||
button_text_5 db 'SAVE'
|
||||
button_text_6 db 'CLEAR ICON'
|
||||
button_text_7 db 'FLIP VERT '
|
||||
button_text_8 db 'FLIP HORIZ'
|
||||
button_text_9 db 'FLIP DIAG '
|
||||
button_text_10 db 'SET AS BGR'
|
||||
|
||||
title db 'ICON EDITOR',0
|
||||
|
||||
icon: db 'WRITE.BMP '
|
||||
|
||||
editpos db 0
|
||||
editstate db 0
|
||||
|
||||
first_run db 0
|
||||
|
||||
image:
|
||||
|
||||
I_END:
|
|
@ -6,18 +6,18 @@
|
|||
;
|
||||
|
||||
include 'lang.inc'
|
||||
include '..\..\..\macros.inc'
|
||||
include '..\..\..\..\macros.inc'
|
||||
|
||||
|
||||
use32
|
||||
org 0x0
|
||||
db 'MENUET01' ; header
|
||||
dd 0x01 ; header version
|
||||
dd START ; entry point
|
||||
dd I_END ; image size
|
||||
dd 0x1000 ; required memory
|
||||
dd 0x1000 ; esp
|
||||
dd 0x0 , 0x0 ; I_Param , I_Path
|
||||
org 0x0
|
||||
db 'MENUET01' ; header
|
||||
dd 0x01 ; header version
|
||||
dd START ; entry point
|
||||
dd I_END ; image size
|
||||
dd 0x1000 ; required memory
|
||||
dd 0x1000 ; esp
|
||||
dd 0x0 , 0x0 ; I_Param , I_Path
|
||||
|
||||
|
||||
|
|
@ -5,7 +5,7 @@
|
|||
;
|
||||
|
||||
include 'lang.inc'
|
||||
include '..\..\..\macros.inc'
|
||||
include '..\..\..\..\macros.inc'
|
||||
|
||||
use32
|
||||
|
Loading…
Reference in New Issue