forked from KolibriOS/kolibrios
682 lines
10 KiB
NASM
682 lines
10 KiB
NASM
include "macros.inc"
|
|
;
|
|
; OS function implementation
|
|
; SmallC for KolibriOS
|
|
;
|
|
|
|
;B+ General definitions
|
|
|
|
;B+ File defs
|
|
;const
|
|
;param
|
|
BAD equ -1
|
|
files equ 100
|
|
save_buffer equ 0x20000 ;32
|
|
save_buffer_w equ 0x400000 ;32
|
|
save_file_name equ 0x20000
|
|
|
|
;system
|
|
EOF equ -1
|
|
|
|
;memory
|
|
fileinfo equ I_END
|
|
start_data equ (fileinfo+16384)
|
|
;
|
|
mem_heap equ 0x100000
|
|
;
|
|
g_handle equ 0x300000
|
|
;dword - pointer - relative to file
|
|
;dword - begin of file
|
|
;dword - file size
|
|
;dword - 0/1 <=> read/write
|
|
;E:.
|
|
|
|
;E:.
|
|
|
|
init_osfunc:
|
|
;B+ Init OS functions
|
|
;B+ Clear file handles
|
|
mov edi,g_handle
|
|
mov ecx,files
|
|
shl ecx,2 ;*4
|
|
xor eax,eax
|
|
cld
|
|
rep stosd
|
|
;E:.
|
|
ret
|
|
;E:.
|
|
|
|
;B+ Main OS functions
|
|
ppp dd 70
|
|
|
|
_OS_fopen:
|
|
;B+ Implement "fopen"
|
|
;esp+4 - mode
|
|
;esp+8 - file name
|
|
|
|
; mov eax,-1
|
|
; int 0x40
|
|
|
|
; mov ebx,[esp+8];
|
|
; push dword 10
|
|
; push dword [ppp]
|
|
; push ebx
|
|
; push dword 12
|
|
; call _outstrg
|
|
; add esp,4*4
|
|
; add [ppp],10
|
|
|
|
; cmp byte [ebx+8],0
|
|
; jne .l
|
|
; mov byte [ebx+8],'?'
|
|
;.l:
|
|
; cmp [ppp],80
|
|
; je .l
|
|
|
|
mov ecx , [esp+4] ; file mode
|
|
mov [file_mode],ecx
|
|
;B+ Copy file name
|
|
|
|
|
|
mov esi,[esp+8]
|
|
mov edi,[p_filename]
|
|
mov ecx,12
|
|
.next_copy:
|
|
lodsb
|
|
;fill name (space)
|
|
or al,al
|
|
jz .fill_space
|
|
;set upper case
|
|
cmp al,'a'
|
|
jb .good_char
|
|
cmp al,'z'
|
|
ja .good_char
|
|
add al,'A'-'a'
|
|
.good_char:
|
|
stosb
|
|
dec ecx
|
|
jnz .next_copy
|
|
.fill_space:
|
|
mov al,' '
|
|
cld
|
|
rep stosb
|
|
|
|
mov eax,[file_mode]
|
|
cmp byte [eax],'w'
|
|
jne .no_wri
|
|
|
|
|
|
;B+ Copy file name
|
|
mov esi,[esp+8]
|
|
mov edi,[w_file_name]
|
|
mov ecx,12
|
|
.next_copy2:
|
|
lodsb
|
|
;fill name (space)
|
|
or al,al
|
|
jz .fill_space2
|
|
;set upper case
|
|
cmp al,'a'
|
|
jb .good_char2
|
|
cmp al,'z'
|
|
ja .good_char2
|
|
add al,'A'-'a'
|
|
.good_char2:
|
|
stosb
|
|
dec ecx
|
|
jnz .next_copy2
|
|
.fill_space2:
|
|
;mov al,' '
|
|
;cld
|
|
rep stosb
|
|
|
|
.no_wri:
|
|
|
|
|
|
|
|
;E:.
|
|
;B+ Find file handle
|
|
mov eax,g_handle
|
|
.new_handle:
|
|
cmp dword [eax+4],0
|
|
je .find_place
|
|
add eax,16
|
|
cmp eax,g_handle+files*16-16
|
|
jne .new_handle
|
|
xor eax,eax ; no free handle
|
|
ret
|
|
.find_place:
|
|
; TMP: mov eax,[.ccc]
|
|
; TMP: add [.ccc],16
|
|
;E:.
|
|
push eax
|
|
;B+ Test open mode
|
|
mov eax,[esp+4+4]
|
|
cmp byte [eax],'r'
|
|
je .open_read
|
|
cmp byte [eax],'w'
|
|
je .open_write
|
|
;bad mode
|
|
add esp,4
|
|
mov eax,eax ; invalid open mode
|
|
ret
|
|
;E:.
|
|
|
|
; TMP:.ccc dd g_handle
|
|
|
|
.open_read:
|
|
;B+ Open for read
|
|
;B+ Read file
|
|
|
|
;Wait to read correct
|
|
mov ebx,100
|
|
mov eax,5
|
|
int 0x40
|
|
|
|
mov eax,[g_fileend]
|
|
mov dword [file_parameters+2*4],2000 ;read all
|
|
mov dword [file_parameters+3*4],eax
|
|
|
|
mov dword [file_parameters],0
|
|
mov ebx,file_parameters
|
|
mov eax,58
|
|
int 0x40
|
|
;E:.
|
|
|
|
;B+ TEST FILE FOUND
|
|
or eax,eax
|
|
jz .file_found
|
|
cmp eax,5
|
|
je .file_found
|
|
|
|
; mov ecx,eax ; eax
|
|
; mov ebx,8 shl 16 + 0x0100
|
|
; mov edx,100 shl 16 + 120
|
|
; mov esi,0xffffff
|
|
; mov eax,47
|
|
; int 0x40
|
|
|
|
;file not found - return 0
|
|
add esp,4
|
|
xor eax,eax
|
|
ret
|
|
.file_found:
|
|
;E:.
|
|
pop eax
|
|
push ebx
|
|
xchg eax,ebx
|
|
;B+ Fill file handle
|
|
;save current pointer
|
|
xor eax,eax
|
|
mov [ebx],eax
|
|
|
|
;save file begin
|
|
mov eax,[g_fileend]
|
|
mov [ebx+4],eax
|
|
|
|
;save file size
|
|
pop eax
|
|
mov [ebx+8],eax
|
|
;reserve file zone
|
|
add eax,7
|
|
and eax,not 7
|
|
add [g_fileend],eax
|
|
|
|
;save file mode
|
|
mov eax,0 ;read
|
|
mov [ebx+12],eax
|
|
;E:.
|
|
xchg eax,ebx ;return pointer place
|
|
ret
|
|
;E:.
|
|
|
|
.open_write:
|
|
;B+ Open for write
|
|
;B+ Reserve filename
|
|
|
|
; p_filename -> w_file_name
|
|
|
|
;pusha
|
|
; mov eax, w_file_name
|
|
; mov ebx, [p_filename]
|
|
;.ncpy:
|
|
; mov ch, byte [ebx]
|
|
; cmp ch, 0
|
|
; je .ecpy
|
|
; mov [eax], ch
|
|
; inc dword [eax]
|
|
; inc dword [ebx]
|
|
;jmp .ncpy
|
|
;
|
|
;.ecpy:
|
|
;
|
|
;popa
|
|
|
|
mov [save_buffer_p], save_buffer_w
|
|
|
|
mov esi,[p_filename]
|
|
mov edi,[g_fileend]
|
|
mov ecx,12
|
|
cld
|
|
rep movsb
|
|
add [g_fileend],16
|
|
;E:.
|
|
pop ebx
|
|
;B+ Fill file handle
|
|
;save begin pointer
|
|
xor eax,eax
|
|
mov [ebx],eax
|
|
|
|
;save file begin
|
|
mov eax,[g_fileend]
|
|
mov [ebx+4],eax
|
|
|
|
;save file zone
|
|
mov dword [ebx+8],save_buffer
|
|
;reserve file zone
|
|
add [g_fileend],save_buffer
|
|
|
|
;save file mode
|
|
mov eax,1 ;write
|
|
mov [ebx+12],eax
|
|
;E:.
|
|
xchg eax,ebx ;return pointer place
|
|
ret
|
|
;E:.
|
|
|
|
;E:.
|
|
|
|
_OS_fclos:
|
|
;B+ Close file
|
|
;esp+4 - file handle
|
|
|
|
;B+ Test write mode - save file
|
|
mov eax,[esp+4]
|
|
mov eax,[eax+12]
|
|
cmp eax,1
|
|
;E:.
|
|
jne .no_write
|
|
|
|
mov eax, [esp+4]
|
|
mov ecx, [eax]
|
|
mov ebx, [eax+8]
|
|
|
|
mov ebx, [save_buffer_p]
|
|
sub ebx, save_buffer_w
|
|
; ebx = number of read bytes = file size
|
|
; save loaded file
|
|
mov [dest_info.bytes],ebx ; file size in bytes
|
|
|
|
mov [dest_info.bytes+4], save_buffer_w
|
|
;mov eax, [p_filename];[w_file_name]
|
|
;mov [destination],eax
|
|
mov eax,70
|
|
mov ebx,dest_info
|
|
mcall
|
|
|
|
; 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
|
|
|
|
.copy_error:
|
|
.ok_write:
|
|
|
|
|
|
;E:.
|
|
jmp .read
|
|
|
|
.no_write:
|
|
;B+ Test read mode - if no error end
|
|
cmp eax,0
|
|
je .read
|
|
mov eax,BAD
|
|
ret
|
|
;E:.
|
|
.read:
|
|
|
|
;B+ Relace memory
|
|
;find file size
|
|
mov eax,[esp+4]
|
|
mov ecx,[eax+8]
|
|
add ecx,7
|
|
and ecx,not 7
|
|
push ecx
|
|
|
|
;mov memory
|
|
mov esi,[eax+4]
|
|
mov edi,esi
|
|
add esi,ecx
|
|
mov ecx,[g_fileend]
|
|
sub ecx,edi
|
|
jz .is_last
|
|
shr ecx,2
|
|
inc ecx ;not neccessery
|
|
cld
|
|
rep movsd
|
|
;update gl. memory
|
|
.is_last:
|
|
pop ecx
|
|
sub dword [g_fileend],ecx
|
|
|
|
;update file pointers
|
|
mov edx,ecx
|
|
mov ecx,[eax+4]
|
|
mov eax,g_handle
|
|
.new_handle1:
|
|
mov ebx,[eax+4]
|
|
cmp ebx,ecx
|
|
jbe .no_update
|
|
sub ebx,edx
|
|
mov [eax+4],ebx
|
|
.no_update:
|
|
add eax,16
|
|
cmp eax,g_handle+files*16
|
|
jne .new_handle1
|
|
|
|
;clear handle
|
|
mov edi,[esp+4]
|
|
xor eax,eax
|
|
cld
|
|
stosd
|
|
stosd
|
|
stosd
|
|
stosd
|
|
;E:.
|
|
ret
|
|
;E:.
|
|
|
|
_OS_fgetc:
|
|
;B+ Load char from file
|
|
;esp+4 - input file
|
|
|
|
mov eax,[esp+4]
|
|
mov ebx,[eax]
|
|
cmp ebx,[eax+8]
|
|
je .eof
|
|
inc dword [eax]
|
|
add ebx,[eax+4]
|
|
movzx eax,byte [ebx]
|
|
ret
|
|
.eof:
|
|
mov eax,EOF
|
|
ret
|
|
;E:.
|
|
|
|
;rrr db 'g',0
|
|
|
|
_OS_fputc:
|
|
;B+ Save char to file
|
|
;esp+4 - output file
|
|
;esp+8 - char to write
|
|
|
|
;push dword '<'
|
|
;mov cl,1
|
|
;push dword 0
|
|
;call test_outch
|
|
;add esp,8
|
|
|
|
|
|
|
|
;B+ Temp - write direct.
|
|
cmp dword [esp+4],__iob
|
|
jne .real_write0
|
|
jmp _OS_exit
|
|
.real_write0:
|
|
cmp dword [esp+4],__iob+32
|
|
jne .real_write1
|
|
mov [print_textcolor],0x00ffff
|
|
jmp test_outch
|
|
.real_write1:
|
|
cmp dword [esp+4],__iob+64
|
|
jne .real_write2
|
|
mov [print_textcolor],0x77ffff
|
|
jmp test_outch
|
|
.real_write2:
|
|
;E:.
|
|
|
|
mov ebx,[save_buffer_p]
|
|
mov eax,[esp+8]
|
|
mov [ebx],eax
|
|
inc dword [save_buffer_p]
|
|
|
|
|
|
ret
|
|
|
|
;push dword '<'
|
|
;mov cl,1
|
|
;push dword 0
|
|
;call test_outch
|
|
;add esp,8
|
|
|
|
mov eax,[esp+4]
|
|
mov ebx,[eax]
|
|
push ebx
|
|
cmp ebx,[eax+8]
|
|
jne .write_normal
|
|
|
|
|
|
|
|
;B+ Alloc save_buffer bytes
|
|
;mov memory
|
|
mov ebx,[esp+4+4]
|
|
mov esi,[g_fileend]
|
|
mov edi,esi
|
|
add edi,save_buffer-4
|
|
mov ecx,esi
|
|
sub ecx,[ebx+4]
|
|
sub ecx,[ebx+8]
|
|
shr ecx,2
|
|
jz .is_last
|
|
sub esi,4
|
|
std
|
|
rep movsd
|
|
.is_last:
|
|
|
|
;expand file size
|
|
add dword [eax+8],save_buffer
|
|
|
|
;update file pointers
|
|
mov ebx,g_handle
|
|
.new_handle:
|
|
mov ecx,[ebx+4]
|
|
cmp [eax+4],ecx
|
|
jae .no_update
|
|
add dword [ebx+4],save_buffer
|
|
.no_update:
|
|
add ebx,16
|
|
cmp ebx,g_handle+files*16-16
|
|
jne .new_handle
|
|
;E:.
|
|
|
|
.write_normal:
|
|
pop ebx
|
|
inc dword [eax]
|
|
add ebx,[eax+4]
|
|
mov cl,[esp+8]
|
|
mov byte [ebx],cl
|
|
|
|
;sub [test_outch.x_coord],2
|
|
;
|
|
;push dword '>'
|
|
;mov cl,1
|
|
;push dword 0
|
|
;call test_outch
|
|
;add esp,8
|
|
;
|
|
;sub [test_outch.x_coord],6
|
|
|
|
xor eax,eax
|
|
ret
|
|
;E:.
|
|
|
|
_OS_callo:
|
|
;B+ Alloc memory
|
|
;find all size
|
|
mov eax,[esp+4]
|
|
mov ebx,[esp+8]
|
|
mul ebx
|
|
push eax
|
|
|
|
;clear memory
|
|
mov edi,[.mem_p]
|
|
xor eax,eax
|
|
mov ecx,[esp]
|
|
cld
|
|
rep stosb
|
|
|
|
;update new memory pointer
|
|
pop ebx
|
|
push dword [.mem_p]
|
|
add ebx,7
|
|
and ebx,not 7
|
|
add [.mem_p],ebx
|
|
|
|
;return value
|
|
pop eax
|
|
ret
|
|
|
|
.mem_p dd mem_heap
|
|
;E:.
|
|
|
|
_OS_exit:
|
|
;B+ Exit program
|
|
; ;TMP
|
|
; mov eax,-1
|
|
; int 0x40
|
|
mov esp,[exit_esp]
|
|
sub esp,4
|
|
ret
|
|
;E:.
|
|
|
|
;E:.
|
|
|
|
|
|
|
|
|
|
;B+ Test procedures
|
|
|
|
;B+ Definitions
|
|
LEFTMARGIN equ 11
|
|
BEGIN_CHARS equ 20
|
|
NL equ 10
|
|
;E:.
|
|
|
|
print_textcolor dd 0x00ffff
|
|
|
|
_file_beg:
|
|
;B+ Show begin of file - test fopen
|
|
;esp+4 - file handle (descriptor)
|
|
|
|
mov eax,[esp+4]
|
|
mov ebx,10 shl 16 + 30
|
|
mov ecx,[print_textcolor]
|
|
mov edx,[eax+4]
|
|
mov esi,BEGIN_CHARS
|
|
mov eax,4
|
|
int 0x40
|
|
ret
|
|
;E:.
|
|
|
|
_outstrg:
|
|
;B+ Draw black text - test function call
|
|
;esp+4*4 - x
|
|
;esp+4*3 - y
|
|
;esp+4*2 - *c
|
|
;esp+4*1 - len
|
|
|
|
mov ebx,[esp+4*4]
|
|
shl ebx,16
|
|
mov bx,[esp+4*3]
|
|
mov ecx,[print_textcolor]
|
|
mov edx,[esp+4*2]
|
|
mov esi,[esp+4]
|
|
mov eax,4
|
|
int 0x40
|
|
ret
|
|
;E:.
|
|
|
|
test_outch:
|
|
;B+ Draw one char - use as _OS_fputc, to test printf(...)
|
|
;esp+8 - char to write
|
|
|
|
;this is test! \b \r - not nesessary
|
|
|
|
mov al,[esp+8]
|
|
cmp al,NL
|
|
jne .no_newline
|
|
add [.y_coord],10
|
|
mov [.x_coord],LEFTMARGIN
|
|
ret
|
|
.no_newline:
|
|
|
|
mov ebx,[.x_coord]
|
|
shl ebx,16
|
|
mov bx,word [.y_coord]
|
|
mov ecx,[print_textcolor]
|
|
mov [.out_char],al
|
|
mov edx,.out_char
|
|
mov esi,1
|
|
mov eax,4
|
|
int 0x40
|
|
|
|
add [.x_coord],6
|
|
;mov eax,5
|
|
;mov ebx,5
|
|
;int 0x40
|
|
ret
|
|
|
|
.x_coord dd LEFTMARGIN
|
|
.y_coord dd 60
|
|
.out_char db 0
|
|
;E:.
|
|
|
|
;E:.
|
|
|
|
;B+ Data section
|
|
;B+ Memory managment
|
|
g_fileend dd g_handle+files*4*4 ;from 2MB+100*4*4
|
|
;w_buff dd
|
|
;E:.
|
|
|
|
save_buffer_p dd save_buffer_w
|
|
;B+ File parameters
|
|
file_parameters:
|
|
dd 0x0 ; mode
|
|
dd 0x0 ; first block
|
|
dd 1000 ; block read
|
|
dd -1 ; return place
|
|
dd fileinfo ; work area
|
|
filepath: times 100 db 0
|
|
|
|
file_mode dd 0 ;file mode
|
|
|
|
dest_info: ; DESTINATION FILEINFO
|
|
dd 2
|
|
dd 0
|
|
dd 0
|
|
.bytes dd ?
|
|
dd save_buffer
|
|
db 0
|
|
destination:
|
|
dd save_file_name
|
|
;db "EXAMPLE.ASM",0
|
|
|
|
|
|
|
|
w_file_name dd save_file_name
|
|
|
|
p_filename dd 0x0
|
|
;E:.
|
|
;E:.
|
|
|
|
;TO DO
|
|
mov eax,-1
|
|
int 0x40
|
|
;TO DO
|
|
|