umka/kolibri.asm

703 lines
17 KiB
NASM

format ELF
__DEBUG__ = 1
__DEBUG_LEVEL__ = 1
extrn malloc
malloc fix __malloc
_malloc fix malloc
extrn free
free fix __free
_free fix free
sys_msg_board equ _sys_msg_board
cli equ nop
lang fix en
preboot_blogesc = 0 ; start immediately after bootlog
pci_code_sel = 0
VESA_1_2_VIDEO = 0 ; enable vesa 1.2 bank switch functions
purge mov,add,sub
purge mov,add,sub
section '.text' executable align 16
coverage_begin:
public coverage_begin
include 'macros.inc'
macro diff16 blah1,blah2,blah3 {
}
include 'proc32.inc'
include 'struct.inc'
include 'const.inc'
;OS_BASE = os_base
LFB_BASE = lfb_base
SLOT_BASE = os_base + 0x00080000
window_data = os_base + 0x00001000
WIN_STACK = os_base + 0x0000C000
WIN_POS = os_base + 0x0000C400
KEY_COUNT = os_base + 0x0000F400
KEY_BUFF = os_base + 0x0000F401 ; 120*2 + 2*2 = 244 bytes, actually 255 bytes
BTN_COUNT = os_base + 0x0000F500
BTN_BUFF = os_base + 0x0000F501
BTN_ADDR = os_base + 0x0000FE88
TASK_BASE = os_base + 0x00003010
CURRENT_TASK = os_base + 0x00003000
TASK_COUNT = os_base + 0x00003004
TASK_BASE = os_base + 0x00003010
include 'system.inc'
include 'fdo.inc'
; block and fs
include 'blkdev/disk.inc'
include 'blkdev/disk_cache.inc'
include 'fs/fs_lfn.inc'
include 'crc.inc'
; video
include 'core/dll.inc'
include 'video/framebuffer.inc'
include 'video/vesa20.inc'
include 'video/vga.inc'
include 'video/cursors.inc'
include 'unpacker.inc'
include 'gui/window.inc'
include 'gui/button.inc'
load_file equ __load_file
include 'gui/skincode.inc'
restore load_file
include 'gui/draw.inc'
include 'gui/font.inc'
include 'sha3.asm'
struct VDISK
File dd ?
SectCnt DQ ?
SectSize dd ? ; sector size
ends
public sha3_256_oneshot as 'hash_oneshot'
proc sha3_256_oneshot c uses ebx esi edi ebp, _ctx, _data, _len
stdcall sha3_256.oneshot, [_ctx], [_data], [_len]
ret
endp
align 4
syscall_getpixel: ; GetPixel
mov ecx, [_display.width]
xor edx, edx
mov eax, ebx
div ecx
mov ebx, edx
xchg eax, ebx
and ecx, 0xFBFFFFFF ;negate 0x04000000 use mouseunder area
call dword [GETPIXEL]; eax - x, ebx - y
mov [esp + 32], ecx
ret
align 4
calculate_fast_getting_offset_for_WinMapAddress:
; calculate data area for fast getting offset to _WinMapAddress
xor eax, eax
mov ecx, [_display.height]
mov edi, d_width_calc_area
cld
@@:
stosd
add eax, [_display.width]
dec ecx
jnz @r
ret
;------------------------------------------------------------------------------
align 4
calculate_fast_getting_offset_for_LFB:
; calculate data area for fast getting offset to LFB
xor eax, eax
mov ecx, [_display.height]
mov edi, BPSLine_calc_area
cld
@@:
stosd
add eax, [_display.lfb_pitch]
dec ecx
jnz @r
redrawscreen:
force_redraw_background:
ret
; TODO: move to trace_lbr
public set_eflags_tf
set_eflags_tf:
pushfd
pop eax
mov ecx, [esp + 4]
and ecx, 1
shl ecx, 8 ; TF
and eax, NOT (1 SHL 8)
or eax, ecx
push eax
popfd
ret
; TODO: move to trace_lwp
public get_lwp_event_size
get_lwp_event_size:
mov eax, 0x80000001
cpuid
bt ecx, 15
jnc .no_lwp
mov eax, 0x8000001c
cpuid
and eax, 1001b
cmp eax, 1001b
jnz .no_lwp
movzx eax, bh
ret
.no_lwp:
xor eax, eax
ret
public kos_getcwd
proc kos_getcwd c uses ebx esi edi ebp, _buf, _len
mov eax, 30
mov ebx, 2
mov ecx, [_buf]
mov edx, [_len]
call sys_current_directory
ret
endp
public kos_cd
proc kos_cd c uses ebx esi edi ebp, _path
mov eax, 30
mov ebx, 1
mov ecx, [_path]
call sys_current_directory
ret
endp
public kos_time_to_epoch
proc kos_time_to_epoch c uses ebx esi edi ebp, _time
mov esi, [_time]
call fsCalculateTime
add eax, 978307200 ; epoch to 2001.01.01
ret
endp
public kos_init
proc kos_init c uses ebx esi edi ebp
MEMORY_BYTES = 128 SHL 20
DISPLAY_WIDTH = 400
DISPLAY_HEIGHT = 300
mov [pg_data.mem_amount], MEMORY_BYTES
mov [pg_data.pages_count], MEMORY_BYTES / PAGE_SIZE
mov [pg_data.pages_free], MEMORY_BYTES / PAGE_SIZE
mov dword[sysdir_name], 'sys'
mov dword[sysdir_path], 'HD0/'
mov word[sysdir_path+4], '1'
mov eax, SLOT_BASE + 2*256
mov [current_slot], eax
mov word[cur_dir.path], '/'
mov [eax+APPDATA.cur_dir], cur_dir
mov [eax+APPDATA.wnd_clientbox.left], 0
mov [eax+APPDATA.wnd_clientbox.top], 0
mov dword[CURRENT_TASK], 2
mov dword[TASK_COUNT], 2
mov dword[TASK_BASE], CURRENT_TASK + 2*sizeof.TASKDATA
mov [_display.x], 0
mov [_display.y], 0
mov [_display.width], DISPLAY_WIDTH
mov [_display.lfb_pitch], DISPLAY_WIDTH*4
mov [_display.height], DISPLAY_HEIGHT
mov [PUTPIXEL], Vesa20_putpixel32
mov [GETPIXEL], Vesa20_getpixel32
mov [_display.bytes_per_pixel], 4
mov [_display.bits_per_pixel], 32
mov [MOUSE_PICTURE], dword mousepointer
call calculate_fast_getting_offset_for_WinMapAddress
call calculate_fast_getting_offset_for_LFB
mov [X_UNDER], 500
mov [Y_UNDER], 500
mov word[MOUSE_X], 40
mov word[MOUSE_Y], 30
mov eax, [_display.width]
mul [_display.height]
mov [_display.win_map_size], eax
mov [_display.check_mouse], check_mouse_area_for_putpixel_new
mov [_display.check_m_pixel], check_mouse_area_for_getpixel_new
stdcall kernel_alloc, eax
mov [_display.win_map], eax
mov [BgrDrawMode], eax
mov [BgrDataWidth], eax
mov [BgrDataHeight], eax
mov [mem_BACKGROUND], 4
mov [img_background], static_background_data
; from set_variables
xor eax, eax
mov [BTN_ADDR], dword BUTTON_INFO ; address of button list
mov byte [KEY_COUNT], al ; keyboard buffer
mov byte [BTN_COUNT], al ; button buffer
call set_window_defaults
mov [skin_data], 0
call load_default_skin
mov eax, 0
mov ebx, (0 SHL 16)+300
mov ecx, (0 SHL 16)+200
mov edx, 0x34000088
mov esi, 0x00008800
mov edi, window_title
call syscall_draw_window
mov eax, 1
mov ebx, 0
mov ecx, 0
mov edx, 0x000000ff
call syscall_setpixel
mov eax, 1
mov ebx, 1
mov ecx, 1
mov edx, 0x00ff0000
call syscall_setpixel
mov eax, 1
mov ebx, 2
mov ecx, 2
mov edx, 0x0000ff00
call syscall_setpixel
mov eax, 38
mov ebx, (10 SHL 16) + 510
mov ecx, (10 SHL 16) + 510
mov edx, 0x00ff0000
call syscall_drawline
mov eax, 13
mov ebx, (60 SHL 16) + 20
mov ecx, (30 SHL 16) + 20
mov edx, 0x0000ff00
call syscall_drawrect
mov eax, 7
mov ebx, chess_image
mov ecx, (8 SHL 16) + 8
mov edx, (5 SHL 16) + 15
call syscall_putimage
mov eax, 65
mov ebx, chess_image
mov ecx, (12 SHL 16) + 12
mov edx, (5 SHL 16) + 30
mov esi, 9
mov edi, 0
mov ebp, 0
call sys_putimage_palette
mov eax, 4
mov ebx, (10 SHL 16) + 70
mov ecx, 0xffff00
mov edx, window_title
mov esi, 5
mov edi, 0
call syscall_writetext
mov eax, 8
mov ebx, (55 SHL 16) + 40
mov ecx, (5 SHL 16) + 20
mov edx, 0x20c0ffee
mov esi, 0x00dddddd
call syscall_button
mov eax, 47
mov ebx, 0x80040000
mov ecx, 1234
mov edx, (5 SHL 16) + 45
mov esi, 0x50ffff00
mov edi, 0x000000ff
call display_number
ret
endp
window_title db 'hello',0
public kos_disk_add
proc kos_disk_add c uses ebx esi edi ebp, _file_name, _disk_name
extrn cio_disk_init
ccall cio_disk_init, [_file_name]
stdcall disk_add, vdisk_functions, [_disk_name], eax, DISK_NO_INSERT_NOTIFICATION
push eax
stdcall disk_media_changed, eax, 1
pop edx
movi ecx, 1
mov esi, [edx+DISK.Partitions]
.next_part:
cmp ecx, [edx+DISK.NumPartitions]
ja .part_done
DEBUGF 1, "/%s/%d: ", [edx+DISK.Name], ecx
lodsd
inc ecx
cmp [eax+PARTITION.FSUserFunctions], xfs._.user_functions
jnz @f
DEBUGF 1, "xfs\n"
jmp .next_part
@@:
cmp [eax+PARTITION.FSUserFunctions], ext_user_functions
jnz @f
DEBUGF 1, "ext\n"
jmp .next_part
@@:
cmp [eax+PARTITION.FSUserFunctions], fat_user_functions
jnz @f
DEBUGF 1, "fat\n"
jmp .next_part
@@:
cmp [eax+PARTITION.FSUserFunctions], ntfs_user_functions
jnz @f
DEBUGF 1, "ntfs\n"
jmp .next_part
@@:
DEBUGF 1, "???\n"
jmp .next_part
.part_done:
xor eax, eax
ret
.error:
movi eax, 1
ret
endp
public kos_disk_del
proc kos_disk_del c uses ebx esi edi ebp, _name
mov eax, [disk_list+LHEAD.next]
.next_disk:
cmp eax, disk_list
jz .not_found
mov esi, [eax+DISK.Name]
mov edi, [_name]
@@:
movzx ecx, byte[esi]
cmpsb
jnz .skip
jecxz .found
jmp @b
.skip:
mov eax, [eax+LHEAD.next]
jmp .next_disk
.found:
stdcall disk_del, eax
xor eax, eax
ret
.not_found:
movi eax, 1
ret
endp
public kos_lfn
proc kos_lfn c uses ebx edx esi edi ebp, _f7080arg, _f7080ret, _f70or80
push ebx
mov ebx, [_f7080arg]
pushad ; file_system_lfn writes here
cmp [_f70or80], 80
jz .f80
.f70:
call file_system_lfn
jmp .done
.f80:
call fileSystemUnicode
.done:
popad
mov ecx, [_f7080ret]
mov [ecx+0], eax ; status
mov [ecx+4], ebx ; count
pop ebx
ret
endp
proc vdisk_close stdcall uses ebx esi edi ebp, _userdata
extrn cio_disk_free
ccall cio_disk_free, [_userdata]
ret
endp
proc vdisk_read stdcall uses ebx esi edi ebp, _userdata, _buffer, _startsector:qword, _numsectors
extrn cio_disk_read
ccall cio_disk_read, [_userdata], [_buffer], dword[_startsector+0], dword[_startsector+4], [_numsectors]
movi eax, DISK_STATUS_OK
ret
endp
proc vdisk_write stdcall uses ebx esi edi ebp, userdata, buffer, startsector:qword, numsectors
extrn cio_disk_write
ccall cio_disk_write, [userdata], [buffer], dword[startsector+0], dword[startsector+4], [numsectors]
movi eax, DISK_STATUS_OK
ret
endp
proc vdisk_querymedia stdcall uses ebx esi edi ebp, vdisk, mediainfo
mov ecx, [mediainfo]
mov edx, [vdisk]
mov [ecx + DISKMEDIAINFO.Flags], 0
mov eax, [edx + VDISK.SectSize]
mov [ecx + DISKMEDIAINFO.SectorSize], eax
mov eax, [edx + VDISK.SectCnt.lo]
mov dword [ecx + DISKMEDIAINFO.Capacity + 0], eax
mov eax, [edx + VDISK.SectCnt.hi]
mov dword [ecx + DISKMEDIAINFO.Capacity + 4], eax
movi eax, DISK_STATUS_OK
ret
endp
proc __malloc
push ecx edx
ccall _malloc, eax
pop edx ecx
ret
endp
proc kernel_alloc _size
mov eax, [_size]
call malloc
ret
endp
proc alloc_kernel_space _size
mov eax, [_size]
call malloc
ret
endp
proc alloc_pages _cnt
mov eax, [_cnt]
shl eax, 12
call malloc
ret
endp
proc __free
ccall _free, eax
ret
endp
proc kernel_free base
mov eax, [base]
call free
xor eax, eax
ret
endp
proc _sys_msg_board
cmp cl, 0x0d
jz @f
pushad
mov eax, SYS_WRITE
mov ebx, STDOUT
push ecx
mov ecx, esp
mov edx, 1
int 0x80
pop ecx
popad
@@:
ret
endp
align 16 ;very often call this subrutine
memmove: ; memory move in bytes
; eax = from
; ebx = to
; ecx = no of bytes
test ecx, ecx
jle .ret
push esi edi ecx
mov edi, ebx
mov esi, eax
test ecx, not 11b
jz @f
push ecx
shr ecx, 2
rep movsd
pop ecx
and ecx, 11b
jz .finish
;--------------------------------------
align 4
@@:
rep movsb
;--------------------------------------
align 4
.finish:
pop ecx edi esi
;--------------------------------------
align 4
.ret:
ret
proc my_putpixel
DEBUGF 1,"hello from my putpixel!\n"
ret
endp
sys_msg_board_str:
protect_from_terminate:
unprotect_from_terminate:
change_task:
ReadCDWRetr:
WaitUnitReady:
prevent_medium_removal:
Read_TOC:
commit_pages:
release_pages:
fs_execute:
mutex_init:
mutex_lock:
mutex_unlock:
alloc_page:
map_page:
free_kernel_space:
cache_ide0:
cache_ide1:
wakeup_osloop:
read_process_memory:
.forced:
ret
proc __load_file _filename
push ebx ecx edx esi edi
stdcall kernel_alloc, skin_size
push eax
mov esi, skin
mov edi, eax
mov ecx, skin_size
rep movsb
pop eax
pop edi esi edx ecx ebx
ret
endp
coverage_end:
public coverage_end
section '.data' writeable align 64
include_debug_strings
vdisk_functions:
dd vdisk_functions_end - vdisk_functions
dd 0;vdisk_close ; close
dd 0 ; closemedia
dd vdisk_querymedia
dd vdisk_read
dd vdisk_write
dd 0 ; flush
dd 0 ; adjust_cache_size
vdisk_functions_end:
disk_name db 'hd0',0
;IncludeIGlobals
skin file 'skin.skn'
skin_size = $ - skin
include 'hid/mousedrv.inc'
include 'gui/mousepointer.inc'
screen_workarea RECT
display_width_standard dd 0
display_height_standard dd 0
do_not_touch_winmap db 0
window_minimize db 0
sound_flag db 0
chess_image db \
0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \
0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \
0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, \
0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, \
0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \
0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \
0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, \
0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, \
0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \
0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \
0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, \
0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, \
0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \
0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \
0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, \
0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff
fl_moving db 0
rb 3
;section '.bss' writeable align 16
;IncludeUGlobals
;section '.bss' writeable align 16
;IncludeUGlobals
; crap
DiskNumber db ?
ChannelNumber db ?
DevErrorCode dd ?
CDSectorAddress dd ?
CDDataBuf_pointer dd ?
;DRIVE_DATA: rb 0x4000
;cdpos dd ?
;cd_appl_data dd ?
;current_slot dd ?
;pg_data PG_DATA
ide_channel1_mutex MUTEX
ide_channel2_mutex MUTEX
ide_channel3_mutex MUTEX
ide_channel4_mutex MUTEX
ide_channel5_mutex MUTEX
ide_channel6_mutex MUTEX
ide_channel7_mutex MUTEX
ide_channel8_mutex MUTEX
os_base rb 0x400000
public lfb_base_addr as 'kos_lfb_base'
lfb_base_addr dd lfb_base
lfb_base rd MAX_SCREEN_WIDTH*MAX_SCREEN_HEIGHT
cur_dir:
.encoding rb 1
.path rb maxPathLength
BgrAuxTable rb 32768
BgrAuxTable equ
SB16Buffer rb 65536
SB16Buffer equ
BUTTON_INFO rb 64*1024
BUTTON_INFO equ
include 'data32.inc'