forked from KolibriOS/kolibrios
* COPY2 rewritten to function 70 by Mario79.
* Updated english documentation. git-svn-id: svn://kolibrios.org@193 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
be5ccc0bc1
commit
1668ac9032
@ -379,7 +379,7 @@ Remarks:
|
||||
to subfunction 4 of function 18).
|
||||
* Beginning from slot 2, the normal applications are placed.
|
||||
* The normal applications are placed in memory at the address
|
||||
0x10000000 (kernel constand 'std_application_base_address').
|
||||
0x60400000 (kernel constant 'std_application_base_address').
|
||||
There is no intersection, as each process has its own page table.
|
||||
* At creation of the thread it is assigned the slot
|
||||
in the system table and identifier (Process/Thread IDentifier =
|
||||
@ -874,8 +874,8 @@ Structure of the buffer:
|
||||
db a,b,c,d for version a.b.c.d
|
||||
db UID_xxx: one of UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2
|
||||
db 'name',0 - ASCIIZ-string with the name
|
||||
For Kolibri 0.6.0.0 kernel:
|
||||
db 0,6,0,0
|
||||
For Kolibri 0.5.8.1 kernel:
|
||||
db 0,5,8,1
|
||||
db 2
|
||||
db 'Kolibri',0
|
||||
|
||||
@ -1000,6 +1000,30 @@ Remarks:
|
||||
and check that the value of position is inside the limits of the
|
||||
screen.
|
||||
|
||||
======================================================================
|
||||
======== Function 18, subfunction 20 - get information on RAM. =======
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 18 - function number
|
||||
* ebx = 20 - subfunction number
|
||||
* ecx = pointer to the buffer for information (36 bytes)
|
||||
Returned value:
|
||||
* eax = total size of existing RAM in pages
|
||||
or -1 if error has occured
|
||||
* buffer pointed to by ecx contains the following information:
|
||||
* +0: dword: total size of existing RAM in pages
|
||||
* +4: dword: size of free RAM in pages
|
||||
* +8: dword: number of page faults (exceptions #PF)
|
||||
in applications
|
||||
* +12: dword: size of kernel heap in bytes
|
||||
* +16: dword: free in kernel heap in bytes
|
||||
* +20: dword: total number of memory blocks in kernel heap
|
||||
* +24: dword: number of free memory blocks in kernel heap
|
||||
* +28: dword: size of maximum free block in kernel heap
|
||||
(reserved)
|
||||
* +32: dword: size of maximum allocated block in kernel heap
|
||||
(reserved)
|
||||
|
||||
======================================================================
|
||||
==================== Function 20 - MIDI interface. ===================
|
||||
======================================================================
|
||||
@ -2874,7 +2898,6 @@ Examples:
|
||||
Existing subfunctions:
|
||||
* subfunction 0 - read file/folder
|
||||
* subfunction 1 - rewrite file
|
||||
* subfunction 2 - delete file/folder
|
||||
* subfunction 4 - make folder
|
||||
* subfunction 5 - rename/move file/folder
|
||||
* subfunction 8 - LBA-read from device
|
||||
@ -2965,30 +2988,6 @@ Returned value:
|
||||
Remarks:
|
||||
* This function is obsolete, use subfunction 2 of function 70.
|
||||
|
||||
======================================================================
|
||||
========== Function 58, subfunction 2 - delete file/folder. ==========
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 58 - function number
|
||||
* ebx = pointer to the information structure
|
||||
Format of the information structure:
|
||||
* +0: dword: 2 = subfunction number
|
||||
* +4: dword: ignored
|
||||
* +8: dword: ignored
|
||||
* +12 = +0xC: dword: ignored
|
||||
* +16 = +0x10: dword: pointer to buffer for system operations
|
||||
(4096 bytes)
|
||||
* +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
|
||||
given in the general description
|
||||
Returned value:
|
||||
* eax = 0 - success, otherwise file system error code
|
||||
* ebx destroyed
|
||||
Remarks:
|
||||
* By operations with a floppy one should not delete not empty
|
||||
folder. The code working with hard disk deletes not empty folders
|
||||
correctly (i.e. recursively with all files and nested folders).
|
||||
Function 58 does not support folders on ramdisk.
|
||||
|
||||
======================================================================
|
||||
============== Function 58, subfunction 4 - make folder. =============
|
||||
======================================================================
|
||||
@ -3458,8 +3457,11 @@ Returned value:
|
||||
* eax = 0 - success
|
||||
* eax = 1 - not enough memory
|
||||
Remarks:
|
||||
* At the moment this function is a sole resource for dynamic
|
||||
allocation/free of application memory.
|
||||
* There is another way to dynamically allocate/free memory -
|
||||
subfunctions 11, 12, 13 of function 68.
|
||||
* The function cannot be used together with 68.11, 68.12, 68.13.
|
||||
The function call will be ignored after creation of process heap
|
||||
with function 68.11.
|
||||
|
||||
======================================================================
|
||||
================== Function 66 - work with keyboard. =================
|
||||
@ -3666,87 +3668,133 @@ Returned value:
|
||||
kill the thread.
|
||||
|
||||
======================================================================
|
||||
======= Function 68, subfunction 5 - allocate physical memory. =======
|
||||
======= Function 68, subfunction 11 - initialize process heap. =======
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 68 - function number
|
||||
* ebx = 5 - subfunction number
|
||||
* ecx = size (in bytes)
|
||||
* ebx = 11 - subfunction number
|
||||
Returned value:
|
||||
* eax = physical address of allocated memory
|
||||
* eax = 0 - failed
|
||||
* otherwise size of created heap
|
||||
Remarks:
|
||||
* Normal applications must not use this function, it is intended
|
||||
for the case, when for some device it is required to place
|
||||
data to the known physical address. (In effect, this function
|
||||
was developed for AC97WAV.)
|
||||
* The number of blocks of physical memory is limited (by constant
|
||||
24, and this constant includes some blocks for kernel).
|
||||
* To free a memory allocated by such way use
|
||||
subfunction 6, to copy data there and back
|
||||
use subfunctions 7 and 8.
|
||||
* The function call initializes heap, from which one can in future
|
||||
allocate and free memory blocks with subfunctions 12 and 13.
|
||||
Heap size is equal to total amount of free application memory.
|
||||
* The second function call from the same process results in
|
||||
returning the size of the existing heap.
|
||||
* After creation of the heap calls to function 64 will be ignored.
|
||||
|
||||
======================================================================
|
||||
========= Function 68, subfunction 6 - free physical memory. =========
|
||||
======== Function 68, subfunction 12 - allocate memory block. ========
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 68 - function number
|
||||
* ebx = 6 - subfunction number
|
||||
* ecx = physical address of memory
|
||||
* ebx = 12 - subfunction number
|
||||
* ecx = required size in bytes
|
||||
Returned value:
|
||||
* function does not return value
|
||||
* eax = pointer to the allocated block
|
||||
Remarks:
|
||||
* Normal applications must not use this function, it is intended
|
||||
for the case, when for some device it is required to place
|
||||
data to the known physical address. (In effect, this function
|
||||
was developed for AC97WAV.)
|
||||
* The memory must be previously allocated by subfunction 5.
|
||||
* Before this call one must initialize process heap by call to
|
||||
subfunction 11.
|
||||
* The function allocates an integer number of pages (4 Kb) in such
|
||||
way that the real size of allocated block is more than or equal to
|
||||
requested size.
|
||||
|
||||
======================================================================
|
||||
===== Function 68, subfunction 7 - write data to physical memory. ====
|
||||
========== Function 68, subfunction 13 - free memory block. ==========
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 68 - function number
|
||||
* ebx = 7 - subfunction number
|
||||
* ecx = physical address
|
||||
* edx = pointer to the data (in the application)
|
||||
* esi = size of the data (in bytes)
|
||||
* ebx = 13 - subfunction number
|
||||
* ecx = pointer to the memory block
|
||||
Returned value:
|
||||
* function does not return value
|
||||
* eax = 1 - success
|
||||
* eax = 0 - failed
|
||||
Remarks:
|
||||
* Normal applications must not use this function, it is intended
|
||||
for the case, when for some device it is required to place
|
||||
data to the known physical address. (In effect, this function
|
||||
was developed for AC97WAV.)
|
||||
* The range of physical addresses should lie inside of previously
|
||||
allocated by subfunction 5 block of physical memory.
|
||||
* There is no check for correctness.
|
||||
* The memory block must have been allocated by subfunction 12.
|
||||
|
||||
======================================================================
|
||||
==== Function 68, subfunction 8 - read data from physical memory. ====
|
||||
======== Function 68, subfunction 14 - wait for driver notify. =======
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 68 - function number
|
||||
* ebx = 8 - subfunction number
|
||||
* ecx = physical address
|
||||
* edx = pointer to buffer for data (in application)
|
||||
* esi = size of data (in bytes)
|
||||
* ebx = 14 - subfunction number
|
||||
* ecx = pointer to the buffer for information (8 bytes)
|
||||
Returned value:
|
||||
* function does not return value
|
||||
* buffer pointed to by ecx contains the following information:
|
||||
* +0: dword: constant EV_INTR = 1
|
||||
* +4: dword: driver data
|
||||
Remarks:
|
||||
* Normal applications must not use this function, it is intended
|
||||
for the case, when for some device it is required to place
|
||||
data to the known physical address. (In effect, this function
|
||||
was developed for AC97WAV.)
|
||||
* The range of physical addresses should lie inside of previously
|
||||
allocated by subfunction 5 block of physical memory.
|
||||
* There is no check for correctness.
|
||||
* The current implementation at wait time uses "heavy" operations
|
||||
of task switch.
|
||||
|
||||
======================================================================
|
||||
====== Function 68, subfunction 15 - set FPU exception handler. ======
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 68 - function number
|
||||
* ebx = 15 - subfunction number
|
||||
* ecx = address of the new exception handler
|
||||
Returned value:
|
||||
* eax = address of the old exception handler (0, if it was not set)
|
||||
|
||||
======================================================================
|
||||
============= Function 68, subfunction 16 - load driver. =============
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 68 - function number
|
||||
* ebx = 16 - subfunction number
|
||||
* ecx = pointer to ASCIIZ-string with driver name
|
||||
Returned value:
|
||||
* eax = 0 - failed
|
||||
* otherwise eax = driver handle
|
||||
Remarks:
|
||||
* If the driver was not loaded yet, it is loaded;
|
||||
if the driver was loaded yet, nothing happens.
|
||||
* Driver name is case-sensitive.
|
||||
Maximum length of the name is 16 characters, including
|
||||
terminating null character, the rest is ignored.
|
||||
* The function can load only drivers which are registered in the
|
||||
system; the current implementation contains
|
||||
exactly 2 such drivers:
|
||||
* name SOUND, file /rd/1/unisound.obj
|
||||
* name INFINITY, file /rd/1/infinity.obj
|
||||
|
||||
======================================================================
|
||||
============ Function 68, subfunction 17 - driver control. ===========
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 68 - function number
|
||||
* ebx = 17 - subfunction number
|
||||
* ecx = pointer to the control structure:
|
||||
* +0: dword: handle of driver
|
||||
* +4: dword: code of driver function
|
||||
* +8: dword: pointer to input data
|
||||
* +12 = +0xC: dword: size of input data
|
||||
* +16 = +0x10: dword: pointer to output data
|
||||
* +20 = +0x14: dword: size of output data
|
||||
Returned value:
|
||||
* eax = determined by driver
|
||||
Remarks:
|
||||
* Function codes and the structure of input/output data
|
||||
are defined by driver.
|
||||
* Previously one must obtain driver handle by subfunction 16.
|
||||
|
||||
======================================================================
|
||||
====== Function 68, subfunction 18 - set SSE exception handler. ======
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 68 - function number
|
||||
* ebx = 15 - subfunction number
|
||||
* ecx = address of the new exception handler
|
||||
Returned value:
|
||||
* eax = address of the old exception handler (0, if it was not set)
|
||||
|
||||
======================================================================
|
||||
====================== Fucntion 69 - debugging. ======================
|
||||
======================================================================
|
||||
A process can load other process as debugged by set of corresponding
|
||||
bit by call to subfunction 16 of function 58
|
||||
or subfunction 7 of function 70.
|
||||
bit by call to subfunction 7 of function 70.
|
||||
A process can have only one debugger; one process can debug some
|
||||
others. The system notifies debugger on events occuring with
|
||||
debugged process. Messages are written to the buffer defined by
|
||||
@ -4041,6 +4089,7 @@ Available subfunctions:
|
||||
* subfunction 5 - get attributes of file/folder
|
||||
* subfunction 6 - set attributes of file/folder
|
||||
* subfunction 7 - start application
|
||||
* subfunction 8 - delete file/folder
|
||||
For CD-drives due to hardware limitations only subfunctions
|
||||
0,1,5 and 7 are available, other subfunctions return error
|
||||
with code 2.
|
||||
@ -4348,6 +4397,31 @@ Remarks:
|
||||
* If the process is started as debugged, it is created in
|
||||
the suspended state; to run use subfunction 5 of function 69.
|
||||
|
||||
======================================================================
|
||||
========== Function 70, subfunction 8 - delete file/folder. ==========
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 70 - function number
|
||||
* ebx = pointer to the information structure
|
||||
Format of the information structure:
|
||||
* +0: dword: 8 = subfunction number
|
||||
* +4: dword: 0 (reserved)
|
||||
* +8: dword: 0 (reserved)
|
||||
* +12 = +0xC: dword: 0 (reserved)
|
||||
* +16 = +0x10: dword: 0 (reserved)
|
||||
* +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
|
||||
given in the general description
|
||||
or
|
||||
* +20 = +0x14: db 0
|
||||
* +21 = +0x15: dd pointer to ASCIIZ-string with file name
|
||||
Returned value:
|
||||
* eax = 0 - success, otherwise file system error code
|
||||
* ebx destroyed
|
||||
Remarks:
|
||||
* The function is not supported for CD (returns error code 2).
|
||||
* The function can delete only empty folders (attempt to delete
|
||||
nonempty folder results in error with code 10, "access denied").
|
||||
|
||||
======================================================================
|
||||
========== Function 71, subfunction 1 - set window caption. ==========
|
||||
======================================================================
|
||||
|
@ -1,4 +1,7 @@
|
||||
; project name: SYSTREE FILE COPIER
|
||||
; version: 1.2
|
||||
; Mario79 23/10/06
|
||||
;
|
||||
; version: 1.1b
|
||||
; last update: 18/07/2004
|
||||
; compiler: FASM 1.52
|
||||
@ -7,6 +10,7 @@
|
||||
; 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
|
||||
; ...
|
||||
@ -18,7 +22,7 @@
|
||||
dd 0x01 ; header version
|
||||
dd START ; start of code
|
||||
dd I_END ; size of image
|
||||
dd 0x20201 ; memory for app
|
||||
dd 0x10000 ; memory for app
|
||||
dd 0x10000 ; esp
|
||||
dd 0x0 , 0x0 ; I_Param , I_Icon
|
||||
|
||||
@ -69,11 +73,11 @@ still: ; main cycle of application begins here
|
||||
jnz still
|
||||
|
||||
srcbtn:
|
||||
mov [addr],dword source
|
||||
mov [addr],dword source_info.name ;source
|
||||
mov [ya],dword 36
|
||||
jmp rk
|
||||
dstbtn:
|
||||
mov [addr],dword destination
|
||||
mov [addr],dword dest_info.name ;destination
|
||||
mov [ya],dword 36+16
|
||||
|
||||
rk:
|
||||
@ -150,32 +154,18 @@ still: ; main cycle of application begins here
|
||||
;====================================================
|
||||
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
|
||||
mcall 70, get_param_info
|
||||
|
||||
; 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 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
|
||||
int 0x40
|
||||
pop ebx ; restore filesize
|
||||
|
||||
; check if alloc function failed
|
||||
test eax,eax ; non-zero value means error
|
||||
@ -184,36 +174,29 @@ copy_file:
|
||||
jmp copy_error ; print error code now
|
||||
.ok_memory:
|
||||
|
||||
; save number of blocks to source_info
|
||||
add ebx,511
|
||||
shr ebx,9 ; round up to 512 boundary
|
||||
mov [source_info.blocks],ebx
|
||||
; read the source file
|
||||
mov eax,58
|
||||
mov ebx,source_info
|
||||
int 0x40
|
||||
; 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
|
||||
|
||||
; ebx = file size
|
||||
; save loaded file
|
||||
mov [dest_info.bytes2write],ebx ; file size in bytes
|
||||
mov eax,58
|
||||
mov ebx,dest_info
|
||||
int 0x40
|
||||
mcall 70,dest_info
|
||||
|
||||
; check if 58 function failed
|
||||
; now eax contains error code
|
||||
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:
|
||||
jne copy_error
|
||||
|
||||
; return to the initial amount of memory
|
||||
mov eax,64
|
||||
mov ebx,1
|
||||
mov ecx,0x20201
|
||||
mov ecx,0x10000
|
||||
int 0x40
|
||||
|
||||
xor eax,eax ; eax = message number (0-OK)
|
||||
@ -297,12 +280,12 @@ draw_window:
|
||||
mov esi, 0xEBEBEB
|
||||
int 0x40
|
||||
|
||||
mov esi, source
|
||||
mov esi, source_info.name ;source
|
||||
mov edi, text+14
|
||||
mov ecx, STRLEN
|
||||
rep movsb
|
||||
|
||||
mov esi, destination
|
||||
mov esi, dest_info.name ;destination
|
||||
mov edi, text+STRLEN+59-45+14
|
||||
mov ecx, STRLEN
|
||||
rep movsb
|
||||
@ -327,25 +310,59 @@ draw_window:
|
||||
|
||||
|
||||
; DATA AREA
|
||||
align 4
|
||||
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
|
||||
.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
|
||||
.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
|
||||
.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
|
||||
.subfunction dd 2 ; 0=WRITE
|
||||
.start dd 0
|
||||
.size_high dd 0
|
||||
.size dd 0
|
||||
.return dd 0x10000
|
||||
.name:
|
||||
db '/rd/1/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 '/RD/1/KERNEL.MNT',0
|
||||
; times (STRLEN-16) db 0
|
||||
|
||||
align 4
|
||||
addr dd 0x0
|
||||
ya dd 0x0
|
||||
|
Loading…
Reference in New Issue
Block a user