forked from KolibriOS/kolibrios
461 lines
12 KiB
NASM
461 lines
12 KiB
NASM
; project name: SYSTREE FILE COPIER
|
||
; version: 1.2
|
||
; Mario79 23/10/06
|
||
;
|
||
; 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:
|
||
; 23/10/06 application use function 70
|
||
; 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 0x10000 ; 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
|
||
mcall
|
||
|
||
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
|
||
mcall
|
||
jmp still ; return to main loop
|
||
|
||
button: ; button
|
||
mov eax,17 ; get id
|
||
mcall
|
||
|
||
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_info.name ;source
|
||
mov [ya],dword 36
|
||
jmp rk
|
||
dstbtn:
|
||
mov [addr],dword dest_info.name ;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
|
||
mcall
|
||
cmp eax,2
|
||
jnz still
|
||
; mov eax,2
|
||
mcall
|
||
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
|
||
mcall
|
||
|
||
|
||
;====================================================
|
||
; 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
|
||
mcall 70, get_param_info
|
||
|
||
; now eax contains error code
|
||
test eax,eax ; check if eax is equal to zero (success)
|
||
jne copy_error ; print error code now
|
||
|
||
; allocate memory
|
||
mov ecx,[param_info+32] ;ebx
|
||
add ecx,0x10000 ; size of memory needed = 0x10000+filesize
|
||
mov eax,64 ; func 64
|
||
mov ebx,1 ; resize application memory
|
||
mcall
|
||
|
||
; 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 size to source_info
|
||
mov ebx,[param_info+32]
|
||
mov [source_info.size],ebx ; read the source file
|
||
mcall 70,source_info
|
||
|
||
; now eax contains error code
|
||
test eax,eax ; check if eax is equal to zero (success)
|
||
jne copy_error ; print error code now
|
||
|
||
; file size in bytes
|
||
mov [dest_info.size],ebx
|
||
|
||
; save loaded file
|
||
mcall 70,dest_info
|
||
|
||
; now eax contains error code
|
||
test eax,eax
|
||
jne copy_error
|
||
|
||
; return to the initial amount of memory
|
||
mov eax,64
|
||
mov ebx,1
|
||
mov ecx,0x10000
|
||
mcall
|
||
|
||
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]
|
||
mcall
|
||
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
|
||
mcall
|
||
|
||
mov eax,4
|
||
mov ebx,109*65536
|
||
add ebx,[ya]
|
||
xor ecx,ecx
|
||
mov edx,[addr]
|
||
mov esi,STRLEN
|
||
mcall
|
||
|
||
ret
|
||
|
||
|
||
; *********************************************
|
||
; ******* 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
|
||
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, 0x14DDDDDD ; color of work area RRGGBB
|
||
mov edi, title ; WINDOW LABEL
|
||
mcall
|
||
|
||
mov eax, 8 ; COPY BUTTON
|
||
mov ebx, 20*65536+375
|
||
mov ecx, 63*65536+16
|
||
mov edx, 2
|
||
mov esi, 0xCCCCCC
|
||
mcall
|
||
|
||
mov ebx, 105*65536+290
|
||
mov ecx, 33*65536+12
|
||
mov edx, 4
|
||
mov esi, 0xEBEBEB
|
||
mcall
|
||
|
||
mov ebx, 105*65536+290
|
||
mov ecx, 49*65536+12
|
||
mov edx, 5
|
||
mov esi, 0xEBEBEB
|
||
mcall
|
||
|
||
mov esi, source_info.name ;source
|
||
mov edi, text+14
|
||
mov ecx, STRLEN
|
||
rep movsb
|
||
|
||
mov esi, dest_info.name ;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
|
||
mcall
|
||
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
|
||
mcall
|
||
|
||
ret
|
||
|
||
|
||
; DATA AREA
|
||
get_param_info:
|
||
.subfunction dd 5 ; 5 - get parameters of file
|
||
.start dd 0 ; rezerved
|
||
.size_high dd 0 ; rezerved
|
||
.size dd 0 ; rezerved
|
||
.return dd param_info
|
||
.name:
|
||
db 0
|
||
dd source_info.name
|
||
|
||
source_info: ; SOURCE FILEINFO
|
||
.subfunction dd 0 ; 0=READ
|
||
.start dd 0
|
||
.size_high dd 0
|
||
.size dd 0
|
||
.return dd 0x10000
|
||
.name:
|
||
db '/hd0/1/kernel/kernel.mnt',0 ; ASCIIZ dir & filename
|
||
times (STRLEN-24) db 0
|
||
|
||
dest_info: ; DESTINATION FILEINFO
|
||
.subfunction dd 2 ; 0=WRITE
|
||
.start dd 0
|
||
.size_high dd 0
|
||
.size dd 0
|
||
.return dd 0x10000
|
||
.name:
|
||
db '/sys/kernel.mnt',0 ; ASCIIZ dir & filename
|
||
times (STRLEN-16) db 0
|
||
|
||
param_info:
|
||
rb 40
|
||
|
||
|
||
;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 '/SYS/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
|
||
\
|
||
de, 'QUELLE: | Russia, Yaroslavl ',\
|
||
de, 'ZIEL: | Poddubny Ivan, ivan-yar@bk.ru ',\
|
||
de, ' KOPIERE QUELLE -> ZIEL ',\
|
||
de, 'x',\ ; <- END MARKER, DONT DELETE
|
||
\
|
||
fr, 'SOURCE: | ',\
|
||
fr, 'DESTINATION: | ',\
|
||
fr, ' COPIER ',\
|
||
fr, 'x'
|
||
|
||
|
||
lsz title,\
|
||
ru, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>',\
|
||
en, 'SYSTREE FILE COPIER',\
|
||
de, 'SYSTREE DATEIKOPIERER',\
|
||
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_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 if lang eq en_US
|
||
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"
|
||
else
|
||
strtbl errors,\
|
||
"Erfolgreich!",\
|
||
"(lesen) Keine Festplatte oder Partition definiert",\
|
||
"(lesen) Dateisystem nicht unterstuetzt",\
|
||
"(lesen) Unbekanntes Dateisystem",\
|
||
"(lesen) Keine Partition definiert",\
|
||
"Zu wenig Speicher",\
|
||
"(lesen) Dateiende erreicht",\
|
||
"(lesen) Unbekanner Fehler",\
|
||
"(schreiben) Keine Festplatte oder Partition definiert",\
|
||
"(schreiben) Dateisystem nicht unterstuetzt",\
|
||
"(schreiben) Unbekanntes Dateisystem",\
|
||
"(schreiben) Keine Partition definiert",\
|
||
"?",\
|
||
"(schreiben) Dateiende erreicht",\
|
||
"(schreiben) Unbekanner Fehler"
|
||
end if
|
||
|
||
I_END:
|