forked from KolibriOS/kolibrios
428 lines
10 KiB
NASM
428 lines
10 KiB
NASM
|
; project name: SYSTREE FILE COPIER
|
|||
|
; version: 1.1b
|
|||
|
; last update: 18/07/2004
|
|||
|
; compiler: FASM 1.52
|
|||
|
; written by: Ivan Poddubny
|
|||
|
; e-mail: ivan-yar@bk.ru
|
|||
|
; copying-policy: GPL
|
|||
|
|
|||
|
; History:
|
|||
|
; 18/07/2004 strings using "lsz" macro + french language (not 100%!)
|
|||
|
; 04/06/2004 Bugfix for memory - thanks to Ville
|
|||
|
; ...
|
|||
|
|
|||
|
use32
|
|||
|
org 0x0
|
|||
|
|
|||
|
db 'MENUET01' ; 8 byte id
|
|||
|
dd 0x01 ; header version
|
|||
|
dd START ; start of code
|
|||
|
dd I_END ; size of image
|
|||
|
dd 0x20201 ; memory for app
|
|||
|
dd 0x10000 ; esp
|
|||
|
dd 0x0 , 0x0 ; I_Param , I_Icon
|
|||
|
|
|||
|
include 'lang.inc'
|
|||
|
include 'macros.inc' ; very useful stuff for MeOS
|
|||
|
STRLEN = 48 ; maximal length of filename
|
|||
|
|
|||
|
|
|||
|
START: ; start of execution
|
|||
|
|
|||
|
red:
|
|||
|
call draw_window ; at first, draw the window
|
|||
|
|
|||
|
still: ; main cycle of application begins here
|
|||
|
|
|||
|
mov eax,10 ; wait here for event
|
|||
|
int 0x40
|
|||
|
|
|||
|
dec eax ; redraw request ?
|
|||
|
jz red
|
|||
|
dec eax ; key in buffer ?
|
|||
|
jz key
|
|||
|
dec eax ; button in buffer ?
|
|||
|
jz button
|
|||
|
|
|||
|
jmp still
|
|||
|
|
|||
|
key: ; key event handler
|
|||
|
mov eax,2 ; just read it and ignore
|
|||
|
int 0x40
|
|||
|
jmp still ; return to main loop
|
|||
|
|
|||
|
button: ; button
|
|||
|
mov eax,17 ; get id
|
|||
|
int 0x40
|
|||
|
|
|||
|
cmp ah,1 ; button id=1 ? (close_btn)
|
|||
|
jz close
|
|||
|
|
|||
|
cmp ah,2 ; copy ?
|
|||
|
je copy_file
|
|||
|
|
|||
|
; read_string:
|
|||
|
|
|||
|
cmp ah,5 ; user pressed dest button ?
|
|||
|
jz dstbtn
|
|||
|
cmp ah,4 ; user pressed src button ?
|
|||
|
jnz still
|
|||
|
|
|||
|
srcbtn:
|
|||
|
mov [addr],dword source
|
|||
|
mov [ya],dword 36
|
|||
|
jmp rk
|
|||
|
dstbtn:
|
|||
|
mov [addr],dword destination
|
|||
|
mov [ya],dword 36+16
|
|||
|
|
|||
|
rk:
|
|||
|
mov edi,[addr] ; load the address of the string
|
|||
|
mov al,0 ; the symbol we will search for
|
|||
|
mov ecx,STRLEN+1 ; length of the string (+1)
|
|||
|
cld ; search forward
|
|||
|
repne scasb ; do search now
|
|||
|
inc ecx ; we've found a zero or ecx became 0
|
|||
|
mov eax,STRLEN+1
|
|||
|
sub eax,ecx ; eax = address of <0> character
|
|||
|
mov [temp],eax ; position
|
|||
|
|
|||
|
call print_text
|
|||
|
|
|||
|
mov edi,[addr] ; address of string
|
|||
|
add edi,[temp] ; cursor position
|
|||
|
|
|||
|
.waitev:
|
|||
|
mov eax,10
|
|||
|
int 0x40
|
|||
|
cmp eax,2
|
|||
|
jnz still
|
|||
|
; mov eax,2
|
|||
|
int 0x40
|
|||
|
shr eax,8
|
|||
|
cmp eax,8
|
|||
|
jnz .nobs ; BACKSPACE
|
|||
|
cmp edi,[addr]
|
|||
|
jz .waitev
|
|||
|
dec edi
|
|||
|
mov [edi],byte 0
|
|||
|
call print_text
|
|||
|
jmp .waitev
|
|||
|
.nobs:
|
|||
|
cmp eax,13 ; ENTER
|
|||
|
je still
|
|||
|
cmp eax,192
|
|||
|
jne .noclear
|
|||
|
xor al,al
|
|||
|
mov edi,[addr]
|
|||
|
mov ecx,STRLEN
|
|||
|
rep stosb
|
|||
|
mov edi,[addr]
|
|||
|
call print_text
|
|||
|
jmp .waitev
|
|||
|
|
|||
|
.noclear:
|
|||
|
mov [edi],al
|
|||
|
|
|||
|
call print_text
|
|||
|
|
|||
|
inc edi
|
|||
|
mov esi,[addr]
|
|||
|
add esi,STRLEN
|
|||
|
cmp esi,edi
|
|||
|
jnz .waitev
|
|||
|
|
|||
|
jmp still
|
|||
|
|
|||
|
|
|||
|
close:
|
|||
|
or eax,-1 ; close program
|
|||
|
int 0x40
|
|||
|
|
|||
|
|
|||
|
;====================================================
|
|||
|
; copy_file
|
|||
|
; This piece of code copies src file to dst file,
|
|||
|
; then it pass the control to copy_error routine,
|
|||
|
; which returns to the main cycle of the app.
|
|||
|
; It's NOT a function! It's reached by direct jump
|
|||
|
; from the button handler.
|
|||
|
;====================================================
|
|||
|
copy_file:
|
|||
|
; at first we must get the size of the source file
|
|||
|
mov [source_info.blocks],1 ; load only 512 bytes
|
|||
|
mov eax,58
|
|||
|
mov ebx,source_info
|
|||
|
int 0x40
|
|||
|
|
|||
|
; now eax contains error code
|
|||
|
; and ebx contains file size in bytes
|
|||
|
test eax,eax ; check if eax is equal to zero (success)
|
|||
|
je .ok_getsize ; eax = 0 => continue
|
|||
|
cmp eax,6
|
|||
|
jna @f
|
|||
|
mov eax,7 ; if error code is above 6, it will be 7
|
|||
|
@@:
|
|||
|
cmp eax,5 ; file might be copied successfully altrough
|
|||
|
; the system reports an error 5
|
|||
|
jne copy_error ; print error code now
|
|||
|
.ok_getsize:
|
|||
|
|
|||
|
; allocate memory
|
|||
|
push ebx ; save file size
|
|||
|
mov ecx,ebx
|
|||
|
add ecx,0x20000 ; size of memory needed = 0x20000+filesize
|
|||
|
mov eax,64 ; func 64
|
|||
|
mov ebx,1 ; resize application memory
|
|||
|
int 0x40
|
|||
|
pop ebx ; restore filesize
|
|||
|
|
|||
|
; check if alloc function failed
|
|||
|
test eax,eax ; non-zero value means error
|
|||
|
je .ok_memory
|
|||
|
mov eax,5 ; error 5 - out of memory
|
|||
|
jmp copy_error ; print error code now
|
|||
|
.ok_memory:
|
|||
|
|
|||
|
; save number of blocks to source_info
|
|||
|
shr ebx,9 ; divide by 512
|
|||
|
inc ebx ; blocks++
|
|||
|
mov [source_info.blocks],ebx
|
|||
|
; read the source file
|
|||
|
mov eax,58
|
|||
|
mov ebx,source_info
|
|||
|
int 0x40
|
|||
|
|
|||
|
; ebx = file size
|
|||
|
; save loaded file
|
|||
|
mov [dest_info.bytes2write],ebx ; file size in bytes
|
|||
|
mov eax,58
|
|||
|
mov ebx,dest_info
|
|||
|
int 0x40
|
|||
|
|
|||
|
; check if 58 function failed
|
|||
|
test eax,eax
|
|||
|
je .ok_write
|
|||
|
add eax,7 ; error number += 7
|
|||
|
cmp eax,6+7
|
|||
|
jna copy_error
|
|||
|
mov eax,7+7
|
|||
|
jmp copy_error
|
|||
|
.ok_write:
|
|||
|
|
|||
|
; return to the initial amount of memory
|
|||
|
mov eax,64
|
|||
|
mov ebx,1
|
|||
|
mov ecx,0x20201
|
|||
|
int 0x40
|
|||
|
|
|||
|
xor eax,eax ; eax = message number (0-OK)
|
|||
|
|
|||
|
|
|||
|
; print message now
|
|||
|
copy_error:
|
|||
|
mov edi,eax
|
|||
|
mov eax,4
|
|||
|
mov ebx,20*65536+83
|
|||
|
mov ecx,0x10ff0000
|
|||
|
mov edx,[errors+edi*8]
|
|||
|
mov esi,[errors+edi*8+4]
|
|||
|
int 0x40
|
|||
|
jmp still
|
|||
|
|
|||
|
|
|||
|
; print strings (source & destination)
|
|||
|
print_text:
|
|||
|
mov eax,13
|
|||
|
mov ebx,107*65536+STRLEN*6
|
|||
|
mov ecx,[ya]
|
|||
|
shl ecx,16
|
|||
|
add ecx,9
|
|||
|
mov edx,0xf2f2f2
|
|||
|
int 0x40
|
|||
|
|
|||
|
mov eax,4
|
|||
|
mov ebx,109*65536
|
|||
|
add ebx,[ya]
|
|||
|
xor ecx,ecx
|
|||
|
mov edx,[addr]
|
|||
|
mov esi,STRLEN
|
|||
|
int 0x40
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
; DRAW WINDOW
|
|||
|
xor eax, eax ; function 0 : define and draw window
|
|||
|
mov ebx, 160*65536+415 ; [x start] *65536 + [x size]
|
|||
|
mov ecx, 160*65536+100 ; [y start] *65536 + [y size]
|
|||
|
mov edx, 0x03DDDDDD ; color of work area RRGGBB
|
|||
|
int 0x40
|
|||
|
|
|||
|
; WINDOW LABEL
|
|||
|
mov eax, 4 ; function 4 : write text to window
|
|||
|
mov ebx, 8*65536+8 ; [x start] *65536 + [y start]
|
|||
|
mov ecx, 0x10ffffff ; color of text RRGGBB
|
|||
|
mov edx, header ; pointer to text beginning
|
|||
|
mov esi, header.size ; text length
|
|||
|
int 0x40
|
|||
|
|
|||
|
mov eax, 8 ; COPY BUTTON
|
|||
|
mov ebx, 20*65536+375
|
|||
|
mov ecx, 63*65536+16
|
|||
|
mov edx, 2
|
|||
|
mov esi, 0xCCCCCC
|
|||
|
int 0x40
|
|||
|
|
|||
|
mov ebx, 105*65536+290
|
|||
|
mov ecx, 33*65536+12
|
|||
|
mov edx, 4
|
|||
|
mov esi, 0xEBEBEB
|
|||
|
int 0x40
|
|||
|
|
|||
|
mov ebx, 105*65536+290
|
|||
|
mov ecx, 49*65536+12
|
|||
|
mov edx, 5
|
|||
|
mov esi, 0xEBEBEB
|
|||
|
int 0x40
|
|||
|
|
|||
|
mov esi, source
|
|||
|
mov edi, text+14
|
|||
|
mov ecx, STRLEN
|
|||
|
rep movsb
|
|||
|
|
|||
|
mov esi, destination
|
|||
|
mov edi, text+STRLEN+59-45+14
|
|||
|
mov ecx, STRLEN
|
|||
|
rep movsb
|
|||
|
|
|||
|
mov ebx, 25*65536+36 ; print filenames
|
|||
|
xor ecx, ecx
|
|||
|
mov edx, text
|
|||
|
mov esi, STRLEN+59-45
|
|||
|
newline:
|
|||
|
mov eax, 4
|
|||
|
int 0x40
|
|||
|
add ebx, 16
|
|||
|
add edx, STRLEN+59-45
|
|||
|
cmp [edx], byte 'x'
|
|||
|
jnz newline
|
|||
|
|
|||
|
mov eax, 12 ; function 12:tell os about windowdraw
|
|||
|
mov ebx, 2 ; 2, end of draw
|
|||
|
int 0x40
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
|
|||
|
; DATA AREA
|
|||
|
align 4
|
|||
|
source_info: ; SOURCE FILEINFO
|
|||
|
.mode dd 0 ; read file
|
|||
|
.start_block dd 0x0 ; block to read
|
|||
|
.blocks dd 0x700 ; num of blocks
|
|||
|
.address dd 0x20000
|
|||
|
.workarea dd 0x10000
|
|||
|
source db '/HD/1/KERNEL/KERNEL.MNT',0
|
|||
|
times (STRLEN-23) db 0
|
|||
|
|
|||
|
dest_info: ; DESTINATION FILEINFO
|
|||
|
.mode dd 1 ; write
|
|||
|
.notused dd 0x0 ; not used
|
|||
|
.bytes2write dd 0 ; bytes to write
|
|||
|
.address dd 0x20000
|
|||
|
.workarea dd 0x10000
|
|||
|
destination db '/RD/1/KERNEL.MNT',0
|
|||
|
times (STRLEN-16) db 0
|
|||
|
|
|||
|
align 4
|
|||
|
addr dd 0x0
|
|||
|
ya dd 0x0
|
|||
|
temp dd 0
|
|||
|
|
|||
|
|
|||
|
lsz text,\
|
|||
|
ru, ' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: | <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><E1ABA0><EFBFBD> ',\
|
|||
|
ru, ' <20><><EFBFBD><EFBFBD>: | <20><><EFBFBD><EFBFBD>㡭<EFBFBD><E3A1AD> <20><><EFBFBD><EFBFBD>, ivan-yar@bk.ru ',\
|
|||
|
ru, ' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ',\
|
|||
|
ru, 'x',\ ; <- END MARKER, DONT DELETE
|
|||
|
\
|
|||
|
en, 'SOURCE: | Russia, Yaroslavl ',\
|
|||
|
en, 'DESTINATION: | Poddubny Ivan, ivan-yar@bk.ru ',\
|
|||
|
en, ' COPY SOURCE -> DESTINATION ',\
|
|||
|
en, 'x',\ ; <- END MARKER, DONT DELETE
|
|||
|
\
|
|||
|
fr, 'SOURCE: | ',\
|
|||
|
fr, 'DESTINATION: | ',\
|
|||
|
fr, ' COPIER ',\
|
|||
|
fr, 'x'
|
|||
|
|
|||
|
|
|||
|
lsz header,\
|
|||
|
ru, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>',\
|
|||
|
en, 'SYSTREE FILE COPIER',\
|
|||
|
fr, 'COPIER LE FICHIER'
|
|||
|
|
|||
|
|
|||
|
; This macro is used to define a string table in format <pointer;length>
|
|||
|
macro strtbl name,[string]
|
|||
|
{
|
|||
|
common
|
|||
|
label name dword
|
|||
|
forward
|
|||
|
local str,size
|
|||
|
dd str,size
|
|||
|
forward
|
|||
|
str db string
|
|||
|
size = $ - str
|
|||
|
}
|
|||
|
|
|||
|
if lang eq ru
|
|||
|
strtbl errors,\
|
|||
|
"䠩<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ᯥ譮",\
|
|||
|
"(<EFBFBD>⥭<EFBFBD><EFBFBD>) <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>",\
|
|||
|
"(<EFBFBD>⥭<EFBFBD><EFBFBD>) 䠩<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>⥬<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ন<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",\
|
|||
|
"(<EFBFBD>⥭<EFBFBD><EFBFBD>) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⭠<EFBFBD> 䠩<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>⥬<EFBFBD>",\
|
|||
|
"(<EFBFBD>⥭<EFBFBD><EFBFBD>) <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ࠧ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>",\
|
|||
|
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>筮 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",\
|
|||
|
"(<EFBFBD>⥭<EFBFBD><EFBFBD>) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 䠩<EFBFBD><EFBFBD>",\
|
|||
|
"(<EFBFBD>⥭<EFBFBD><EFBFBD>) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⭠<EFBFBD> <EFBFBD>訡<EFBFBD><EFBFBD>",\
|
|||
|
"(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ࠧ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>",\
|
|||
|
"(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) 䠩<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>⥬<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ন<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",\
|
|||
|
"(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⭠<EFBFBD> 䠩<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>⥬<EFBFBD>",\
|
|||
|
"(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ࠧ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>",\
|
|||
|
"?",\
|
|||
|
"(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) 䠩<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",\
|
|||
|
"(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⭠<EFBFBD> <EFBFBD>訡<EFBFBD><EFBFBD>"
|
|||
|
else
|
|||
|
strtbl errors,\
|
|||
|
"Success!",\
|
|||
|
"(read) no hd base or partition defined",\
|
|||
|
"(read) unsupported file system",\
|
|||
|
"(read) unknown file system",\
|
|||
|
"(read) hd partition not defined",\
|
|||
|
"out of memory",\
|
|||
|
"(read) end of file",\
|
|||
|
"(read) unknown error",\
|
|||
|
"(write) no hd base or partition defined",\
|
|||
|
"(write) unsupported file system",\
|
|||
|
"(write) unknown file system",\
|
|||
|
"(write) hd partition not defined",\
|
|||
|
"?",\
|
|||
|
"(write) end of file",\
|
|||
|
"(write) unknown error"
|
|||
|
end if
|
|||
|
|
|||
|
I_END:
|