Board.KolibriOS.org

Official KolibriOS board
It is currently Thu May 23, 2019 2:24 pm

All times are UTC+03:00




Post new topic  This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
PostPosted: Tue Jan 05, 2016 3:04 pm 
Offline

Joined: Tue Jan 05, 2016 12:45 am
Posts: 2
Spoiler: Show
data1 equ image_end+0x100000*01 ; Timestamp data
data4 equ image_end+0x100000*02 ; Image data time order
data5 equ image_end+0x100000*03 ; Length data time order
data6 equ image_end+0x100000*04 ; Decoded image
data8 equ 0x100000*08 ; 7M*4 - Data return, 4k aligned
data9 equ 0x100000*44 ; 1M*4 - Data length return
data10 equ 0x100000*48 ; Save snap / avi - size 16M

scx equ 3 ; Scroll x pos
rby equ (220 shl 32+21) ; Ydim
b3y equ 0 ; B3y add
bys equ 21 ; Buttons y add
scl equ 0 ; Scroll length

use64

org 0x0

db 'MENUET64' ; Header identifier
dq 0x01 ; Version
dq START ; Start of code
dq image_end ; Size of image
dq data10+0x100000*16 ; Memory for app
dq image_end ; Stack
dq 0x00 ; Prm
dq 0x00 ; Icon


turn_camera_on:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Reserves, configures and turns camera on
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

cmp [camera_state],byte 1
je camera_on

; Camera present ?

mov rax , 128
mov rbx , 1
int 0x60
add rax , rbx
cmp rax , 0
je camera_fail

; Configuration found ?

cmp [sconf],dword 0
je camera_fail

; Set configuration

mov rax , 128
mov rbx , 3
mov rcx , 1
mov rdx , [sconf]
int 0x60

; Start camera

mov rax , 128
mov rbx , 4
mov rcx , 1
mov rdx , 1
int 0x60

mov [camera_state],byte 1

camera_fail:
camera_on:

ret


turn_camera_off:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Turns camera off and clears the reservation
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

cmp [camera_state],byte 0
je camera_off

; Camera present ?

mov rax , 128
mov rbx , 1
int 0x60
add rax , rbx
cmp rax , 0
je camera_off

; Stop camera

mov rax , 128
mov rbx , 4
mov rcx , 1
mov rdx , 0
int 0x60

; Set configuration 0

mov rax , 128
mov rbx , 3
mov rcx , 1
mov rdx , 0
int 0x60

camera_off:

mov [camera_state],byte 0

ret



server:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Server thread for webcam picture - port 8090
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov [serveronoff],byte 1

mov [datasent],dword 0

server_open:

; Open port

mov rax , 53
mov rbx , 5
mov rcx , 8090
mov rdx , 0
mov rsi , 0
mov rdi , 0 ; Passive mode
int 0x60

mov [server_socket],eax

mov r15 , 100*30

server_loop:

; Close server port and re-open every 30 seconds

dec r15
jz timeoutclose

;

mov rax , 5
mov rbx , 1
int 0x60

cmp [serveronoff],byte 2
je serveroff

; Server status ?

mov rax , 53
mov rbx , 6
mov rcx , [server_socket]
int 0x60

cmp rax , 4
jne server_loop

; Wait 0.50 seconds

mov rax , 5
mov rbx , 50
int 0x60

mov [picsend],byte 0

; Read all data

read_server_data:

mov rax , 53
mov rbx , 3
mov rcx , [server_socket]
int 0x60

shl r8 , 8
mov r8b , bl

mov r9 , 'pmb.egam'
cmp r8 , r9
jne nopicsend2
mov [picsend],byte 1
nopicsend2:

cmp rax , 0
jne read_server_data

; Wait 0.05 seconds

mov rax , 5
mov rbx , 5
int 0x60

; Send index htm file

cmp [picsend],byte 0
jne noindexsend

mov rax , 53
mov rbx , 7
mov rcx , [server_socket]
mov rdx , h_i_len-html_header_index
mov rsi , html_header_index
int 0x60

jmp nopicsend

noindexsend:

; form picture to data10+

mov rax , [resx]
mov [sizex],rax
mov rax , [resy]
mov [sizey],rax
call form_picture

; send picture - html header

mov rax , '00230454' ; 320
cmp [resx],dword 160
jne nor160
mov rax , '00057654' ; 160
nor160:
cmp [resx],dword 640
jne nor640
mov rax , '00921654' ; 640
nor640:
mov [hsz],rax

mov rax , 53
mov rbx , 7
mov rcx , [server_socket]
mov rdx , h_len-html_header
mov rsi , html_header
int 0x60

mov rax , 105
mov rbx , 100
int 0x60

; send picture - bmp header

mov rax , 53
mov rbx , 7
mov rcx , [server_socket]
mov rdx , 54
mov rsi , data10
int 0x60

; send picture - bmp data

mov rsi , data10+54

mov r15 , 99999
call server_stats
mov r15 , 0

newdatasend:

mov rax , 53
mov rbx , 6
mov rcx , [server_socket]
int 0x60
cmp rax , 4
jne timeoutclose

mov rax , 53
mov rbx , 7
mov rcx , [server_socket]
mov rdx , 160*3
int 0x60

mov rax , 105
mov rbx , 3
int 0x60

; If camera is off, display the stats

call server_stats ; In:r15

add rsi , 160*3

mov [datasent],rsi
sub [datasent],dword data10+54

mov rbx , [resx_resy_3]
add rbx , data10+54

cmp rsi , rbx
jb newdatasend

timeoutclose:
nopicsend:

mov rax , 5
mov rbx , 5
int 0x60

; close port

mov rax , 53
mov rbx , 8
mov rcx , [server_socket]
int 0x60

mov [datasent],dword 0

mov r15 , 99999
call server_stats

;mov rax , 5
;mov rbx , 50
;int 0x60

jmp server_open

serveroff:

; Close port

mov rax , 53
mov rbx , 8
mov rcx , [server_socket]
int 0x60

mov [serveronoff],byte 3

mov rax , 512
int 0x60


server_stats:
;
; In: r15 - counter
;
cmp [camera_state],byte 1
je nodfps
inc r15
cmp r15 , 75
jb nodfps
mov [show_fps],byte 1
mov r15 , 0
nodfps:

ret



START:

mov rax , 141
mov rbx , 1
mov rcx , 1
mov rdx , 5 shl 32 + 5
mov r8 , 9 shl 32 + 12
int 0x60

call grey_default

; Draw window

call draw_window

still:

mov rax , 123 ; Check for event
mov rbx , 1
int 0x60

test rax , 0x1 ; Window redraw
jnz window_event
test rax , 0x2 ; Keyboard press
jnz key_event
test rax , 0x4 ; Button press
jnz button_event

call check_camera_state

call read_data

cmp [show_fps],byte 1
jne nosfps
call display_frames_per_second
mov [show_fps],byte 0
nosfps:

jmp still


window_event:

call draw_window
jmp still

key_event:

mov rax , 0x2 ; Read the key and ignore
int 0x60

jmp still

button_event:

mov rax , 0x11
int 0x60

; rax = status
; rbx = button id

cmp rbx , 0x10000001
jne no_application_terminate_button
call turn_camera_off
mov rax , 0x200
int 0x60
no_application_terminate_button:

cmp rbx , 0x102
jb no_stats
cmp rbx , 0x103
ja no_stats
sub rbx , 0x102
mov [sta1+1],byte ' '
mov [sta2+1],byte ' '
imul rbx , 14
mov [sta1+1+rbx],byte '>'
call fps_background
call display_frames_per_second
jmp still
no_stats:

cmp rbx , 0x109
jne no_application_terminate_menu
call turn_camera_off
mov rax , 0x200
int 0x60
no_application_terminate_menu:

cmp rbx , 0x105
jb no_effect
cmp rbx , 0x107
ja no_effect
sub rbx , 0x105
mov [eo+1],byte ' '
mov [eb+1],byte ' '
mov [en+1],byte ' '
imul ebx , 12
mov [eo+1+rbx],byte '>'
jmp still
no_effect:

cmp rbx , 121
jb nomodechange
cmp rbx , 123
ja nomodechange

; Turn camera off

push rbx
call turn_camera_off
pop rbx

; Turn server off

push rax rbx
cmp [serveronoff],byte 1
jne noserveron2
mov [serveronoff],byte 2
mov rax , 5
mov rbx , 20
int 0x60
call server_button
noserveron2:
pop rbx rax

;

cmp rbx , 123 ; 640 & 800
jne screenresxfine
call get_data_boot_info
cmp [data_boot_info+4*8],dword 800
jae screenresxfine
mov rax , 4
mov rbx , string_screen_req
mov rcx , 15+5
mov rdx , 49+5
mov rsi , 0xffffff
mov r9 , 1
int 0x60
mov rax , 5
mov rbx , 200
int 0x60
call display_image_yuv
jmp still
screenresxfine:

mov r11 , [xpos]

sub rbx , 121

mov r8 , [xr+rbx*8]
mov r9 , [yr+rbx*8]
mov r10, [xp+rbx*8]

cmp r8 , [resx] ; already selected
je still

mov [resx],r8
mov [resy],r9
mov [xpos],r10

imul r8 , r9
mov r9 , r8
add r8 , r9
mov [resx_resy_2],r8
add r8 , r9
mov [resx_resy_3],r8
add r8 , r9
mov [resx_resy_4],r8

cmp r11 , [xpos] ; redraw needed
jne redraw
mov rax , 13
mov rbx , 15 shl 32 + 320
mov rcx , 49 shl 32 + 240
mov rdx , 0xffffff
int 0x60
call display_image_yuv
mov [camera_connection_status],dword 2
call check_camera_state
jmp still
redraw:

mov rax , 67
mov rbx , -1
mov rcx , -1

mov rdx , [resx]
cmp rdx , 320
jae rdxfine
mov rdx , 320
rdxfine:
mov r8 , [resy]
cmp r8 , 240
jae r8fine
mov r8 , 240
r8fine:
add rdx , 160
add r8 , 70

cmp r11 , [xpos]
jae noupleft
mov rbx , 0
mov rcx , 0
mov r8 , 561 ; 640x480 picture
noupleft:

int 0x60

jmp still

nomodechange:

cmp rbx , 101
jne no_on

call scan_for_configuration
mov [sconf],r12

call turn_camera_on
jmp still
no_on:

cmp rbx , 102
jne no_off
mov [record_state],byte 0
cmp [serveronoff],byte 1
jne noserveron
mov [serveronoff],byte 2
mov rax , 5
mov rbx , 20
int 0x60
noserveron:
call turn_camera_off
call display_image_yuv
call server_button
jmp still
no_off:

cmp rbx , 103
jne no_snap
call save_snap
jmp still
no_snap:

cmp rbx , 104
jne no_clip
cmp [camera_state], byte 1
jne still
cmp [resx],dword 320
je resolutionfine
mov rax , 4
mov rbx , string_resolution_320
mov rcx , 15+5
mov rdx , 49+5
mov rsi , 0xffffff
mov r9 , 1
int 0x60
mov rax , 5
mov rbx , 100
int 0x60
call display_image_yuv
jmp still
resolutionfine:
mov [record_state],byte 1
mov [record_position], dword data10+1208
mov rax , data10+(avi_end-avi_start)
mov [record_position],rax
jmp still
no_clip:

cmp rbx , 105
jne no_server
cmp [serveronoff],byte 3
je startserver
mov [serveronoff],byte 2
waitmore:
mov rax , 5
mov rbx , 10
int 0x60
call read_data
cmp [serveronoff],byte 2
je waitmore
call server_button
jmp still
startserver:
; Start server thread
mov rax , 51
mov rbx , 1
mov rcx , server
mov rdx , server_stack
int 0x60
mov rax , 5
mov rbx , 10
int 0x60
call server_button
jmp still
no_server:


cmp rbx , 10000
jb noscroll1
cmp rbx , 11000
ja noscroll1
mov [scroll_value_1],rbx
call draw_scroll_1
call draw_scroll_values
jmp still
noscroll1:

cmp rbx , 20000
jb noscroll2
cmp rbx , 21000
ja noscroll2
mov [scroll_value_2],rbx
call draw_scroll_2
call draw_scroll_values
jmp still
noscroll2:

cmp rbx , 30000
jb noscroll3
cmp rbx , 31000
ja noscroll3
mov [scroll_value_3],rbx
call draw_scroll_3
call draw_scroll_values
jmp still
noscroll3:

jmp still




scan_for_configuration:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Configuration for selected resolution
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov r12 , 001b ; 160x120
;
mov r14 , 010b
cmp [resx],dword 320
cmove r12 , r14 ; 320x240
;
mov r14 , 100b
cmp [resx],dword 640
cmove r12 , r14 ; 640x480

mov rdx , 1

newconftest:

mov rax , 128
mov rbx , 2
mov rcx , 1
int 0x60
shr rbx , 16
and rbx , 0xff
cmp rbx , r12
je cfound

inc rdx
cmp rdx , 3
jbe newconftest

mov r12 , 0 ; conf not found
ret

cfound:

mov r12 , rdx ; conf found
ret



grey_default:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Grey default picture
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov rdi , data6
mov rcx , [resx]
imul rcx , [resy]
imul rcx , 4
mov rax , 0xe0
cld
rep stosb

ret


get_data_boot_info:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Screen resolution
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

push rax rbx rcx rdx
mov rax , 26
mov rbx , 3
mov rcx , data_boot_info
mov rdx , 8*20
int 0x60
pop rdx rcx rbx rax

ret



check_camera_state:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Displays text message if camera is disconnected
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov rax , 128
mov rbx , 1
int 0x60
add rax , rbx

cmp rax , [camera_connection_status]
je no_camera_change

mov [camera_connection_status],rax

push rax
call grey_default
call display_image_yuv
pop rax

cmp rax , 0
jne camera_connected

mov rax , 4
mov rbx , string_camera_disconnected
mov rcx , 114
mov rdx , 162
mov rcx , [resx]
shr rcx , 1
add rcx , 15
sub rcx , 62
mov rdx , [resy]
shr rdx , 1
add rdx , 43
mov rsi , 0xb8b8b8
mov r9 , 1
int 0x60

camera_connected:

no_camera_change:

ret



fps_delay:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Waits for next time to read from device
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

fps_wait:

mov rax , 11
int 0x60
cmp rax , 0
jne fps_wait_event

mov rax , 105
mov rbx , 1
int 0x60

mov rax , 26
mov rbx , 1
mov rcx , fps_data
mov rdx , 1024
int 0x60

call check_framerate

mov rax , [fps_data+384]

cmp [thread_running],byte 0
jne yes_fps_wait
mov [fps_add],dword 34 ; assume 30fps
jmp no_fps_wait
yes_fps_wait:

cmp rax , [fps_next]
jb fps_wait

no_fps_wait:

add rax , [fps_add]
mov [fps_next],rax

no_fps_add:

fps_wait_event:

ret



check_framerate:

; Display FPS and adjust display rate delay

mov rax , [fps_data+384]
cmp rax , [fps_n]
jb nofps
add rax , 1000
mov [fps_n],rax
;
cmp [frames_per_second],dword 5
jae nofrpsz
mov [frames_per_second],dword 5
nofrpsz:
cmp [frames_per_second],dword 30
jbe nofrpst
mov [frames_per_second],dword 30
nofrpst:
call display_frames_per_second
mov rax , 1000
xor rdx , rdx
mov rbx , [frames_per_second]
;
;sub rbx , [frames_per_second_missed]
;and rbx , 0x1f
;inc rbx
;
div rbx
;
cmp rax , [fps_add]
jae nofaster
inc dword [fastercount]
cmp [fastercount],dword 2
jb nofasterset
mov [frames_per_second],dword 30
mov rax , 1000/30
nofaster:
mov [fastercount],dword 0
nofasterset:
;
mov [fps_add],rax
mov [frames_per_second],dword 0
mov [frames_per_second_missed],dword 0
nofps:

ret



display_frames_per_second:

cmp [sta2+1],byte '>'
jne nodispstats

fpsy equ 24

call fps_background
;
mov rax , 47
mov rbx , 6 * 65536
mov rcx , [datasent]
mov rdx , [fpsx]
add rdx , 2+6*5
shl rdx , 32
add rdx , fpsy+4
mov rsi , 0xb0b0b0
int 0x60
;
mov rax , 47
mov rbx , 2 * 65536
mov rcx , [frames_per_second]
sub rcx , [frames_per_second_missed]
mov rdx , [fpsx]
add rdx , 2+6*16
shl rdx , 32
add rdx , fpsy+4
mov rsi , 0xb0b0b0
int 0x60
mov rax , 47
mov rbx , 2 * 65536
mov rcx , [frames_per_second]
mov rdx , (fpsx+2+19*6) shl 32 + fpsy+4
mov rdx , [fpsx]
add rdx , 2+19*6
shl rdx , 32
add rdx , fpsy+4
mov rsi , 0xb0b0b0
int 0x60
mov rax , 0x4
mov rbx , string_fps
mov rcx , [fpsx]
add rcx , 2
mov rdx , fpsy+4
mov rsi , 0xb0b0b0
mov r9 , 1
int 0x60

nodispstats:

ret

fps_background:

mov rax , [xpos]
sub rax , 8
mov [fpsx],rax

mov rax , 13
mov rbx , [fpsx]
sub rbx , 3
shl rbx , 32
add rbx , 22*6+5
mov rcx , fpsy shl 32 + 14
mov rdx , 0xe8e8e8
int 0x60

ret




read_block:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Starts the read thread
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

cmp [thread_running],byte 0
jne nostartthread

; Start thread

mov [thread_running],byte 1

mov rax , 51
mov rbx , 1
mov rcx , read_thread
mov rdx , thread_stack
int 0x60

mov rax , 5
mov rbx , 20
int 0x60

nostartthread:

ret


read_thread:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Read data block in a separate thread.
; Doesn't block main process.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

newth:

inc dword [threadpos]
and dword [threadpos],dword 3

mov rax , 128
mov rbx , 5
mov rcx , 1

mov rdx , [threadpos]
imul rdx , 0x100000*7
add rdx , data8

mov r8 , [threadpos]
imul r8 , 0x100000
add r8 , data9

mov r9 , 255

int 0x60

cmp [camera_state],byte 1
je newth

mov [thread_running],byte 0

mov rax , 512
int 0x60




read_data:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Reads and analyzes data blocks from device
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;
; Camera enabled ?
;

cmp [camera_state],byte 1
je continue_read
ret
continue_read:

;
; Start thread
;

call read_block

mov rcx , [threadposprev]
waitforread:
mov rax , 105
mov rbx , 1
int 0x60
cmp rcx , [threadpos]
je waitforread

mov rcx , [threadpos]
mov [threadposprev],rcx

mov rdx , [threadpos]
dec rdx
and rdx , 0x3
imul rdx , 0x100000*7
add rdx , data8

mov r8 , [threadpos]
dec r8
and r8 , 0x3

imul r8 , 0x100000
add r8 , data9

mov [pdata82],rdx ; data - 1024*3 4k aligned
mov [pdata92],r8 ; length - qword

;
; Analyze
;

;
; Arrange data to data1+ for faster cache access
;

mov rsi , [pdata82]
mov rdi , data1
newarr:
xor rax , rax
mov al , [rsi]
xor rbx , rbx
mov ebx , [rsi+rax-6]
mov [rdi],rbx
add rsi , 1024*3
add rdi , 8
cmp rdi , data1+8*256*8
jbe newarr

;
; Timestamp order
;

mov r12 , data4 ; data position
mov r10 , data5 ; length position

newdataorder2:

; Search for lowest timestamp count

mov rax , 0xfffffffff ; timestamp

mov r11 , data1
mov r15 , data1 + 8*256*8

lowsearch2:

; Timestamp position

cmp [r11+7],byte 1 ; used ?
je nolowfound2
cmp eax , [r11] ; smaller ?
jb nolowfound2

mov r14 , r11 ; save position
mov eax , [r11] ; save packet num

nolowfound2:

add r11 , 8

cmp r11 , r15
jbe lowsearch2

mov r13 , 0xfffffffff
cmp rax , r13
jae dataintimeorder2

mov rdx , r14
sub rdx , data1

mov rbx , rdx
add rbx , [pdata92]
mov [r10],rbx ; save length position to line
add r10 , 8

imul rdx , 1024*3/8
add rdx , [pdata82]
mov [r12], rdx ; save data position to line
add r12 , 8

mov [r14+7],byte 1

jmp newdataorder2

dataintimeorder2:

markdone:

; Mark end of list

mov [r12+00],dword 0xfffffff
mov [r12+08],dword 0xfffffff
mov [r12+16],dword 0xfffffff
mov [r12+24],dword 0xfffffff

;
; Display frames in sent data
;

mov r12 , data4
call display_frame_yuv
call record_picture

mov r15 , 0
yesnewframe:
push r15
mov r12 , [framebegin]
add r12 , 8
call display_frame_yuv
call record_picture
pop r15
inc r15
cmp r15 , 50
ja nonewframes
cmp rsi , 0
je yesnewframe
nonewframes:

inc dword [frames_per_second]
inc dword [frames_per_second_missed]

ret



display_number:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Displays scroll values
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

push rax rbx rcx rdx rsi

push rcx rdx
mov rax , 13
mov rbx , rdx
sub rbx , 2
mov rcx , rdx
sub rcx , 2
mov bx , 6*3
shl rcx , 32
add rcx , 11
mov rdx , 0xffffff
int 0x60
pop rdx rcx

mov rax , 47
mov rbx , 3 * 65536 + 0*256
mov rsi , 0x000000
int 0x60

pop rsi rdx rcx rbx rax

ret




get_frame_size:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Counts the number of bytes in frame
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov rax , 0

mov r12 , [framebegin]

mov rsi , [r12]
cmp rsi , 0xfffffff
jae cfrl2

; rsi = data area

mov rcx , [rsi+1] ;toggle bit
and rcx , 1

mov r10 , r12
add r10 , data5
sub r10 , data4
mov r10 , [r10]

; r10 = data count area

movzx rax , word [r10]
and rax , 0xfff

movzx rbx , byte [rsi]
and rbx , 0x7f
sub rax , rbx

cfrl1:

add r12 , 8

mov rsi , [r12]
cmp rsi , 0xfffffff
jae cfrl2

; rsi = data area

mov rdx , [rsi+1]
and rdx , 1

; last block found -> exit

cmp rcx , rdx
jne cfrl2

mov r10 , r12
add r10 , data5
sub r10 , data4
mov r10 , [r10]

; r10 = data count area

movzx rbx , word [r10]
and rbx , 0xfff

movzx r8 , byte [rsi]
and r8 , 0x7f

cmp rbx , r8
jbe cfrl1

add rax , rbx
sub rax , r8

jmp cfrl1

cfrl2:

ret



separate_data:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Separates picture data from received packets
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov r14 , [framebegin]

mov rdi , data6

testnewline:

mov r10 , [r14] ; data content position

mov rsi , r14
add rsi , data5
sub rsi , data4
mov rsi , [rsi] ; data length position

cmp [r14], dword 0xfffffff
je nothisdata
cmp r14 , data4 + 8*8*256
jae nothisdata

mov rcx , [rsi]
and rcx , 0xfff

movzx rdx , byte [r10]
and rdx , 0x7f

cmp rcx , rdx
jbe nothisc

;

mov rsi , r10
add rsi , rdx

sub rcx , rdx
and rcx , 4096-1
shr rcx , 2

push rdx r8 r9 r10

newdoform:

cmp rcx , 0
je nomoreform

; Effect: none

cmp [eo+1],byte '>'
jne noeffectoff
movzx r8 , byte [rsi]
movzx r9 , byte [rsi+1]
movzx r10 , byte [rsi+3]
call calculate_yuv
mov [rdi+0],edx
movzx r8 , byte [rsi+2]
movzx r9 , byte [rsi+1]
movzx r10 , byte [rsi+3]
call calculate_yuv
mov [rdi+4],edx
jmp pixelsdone
noeffectoff:

; Effect: Blur

cmp [eb+1],byte '>'
jne noeffectblur
movzx r8 , byte [rsi]
movzx r9 , byte [rsi+1]
movzx r10 , byte [rsi+3]
call calculate_yuv
shr edx , 1
and edx , 0x7f7f7f
shr dword [rdi],byte 1
and dword [rdi],dword 0x7f7f7f
add [rdi],edx
movzx r8 , byte [rsi+2]
movzx r9 , byte [rsi+1]
movzx r10 , byte [rsi+3]
call calculate_yuv
shr edx , 1
and edx , 0x7f7f7f
shr dword [rdi+4],byte 1
and dword [rdi+4],dword 0x7f7f7f
add [rdi+4],edx
jmp pixelsdone
noeffectblur:

; Effect: Negative

cmp [en+1],byte '>'
jne noeffectnegative
movzx r8 , byte [rsi]
movzx r9 , byte [rsi+1]
movzx r10 , byte [rsi+3]
call calculate_yuv
not edx
mov [rdi+0],edx
movzx r8 , byte [rsi+2]
movzx r9 , byte [rsi+1]
movzx r10 , byte [rsi+3]
call calculate_yuv
not edx
mov [rdi+4],edx
jmp pixelsdone
noeffectnegative:

pixelsdone:

add rdi , 8
add rsi , 4

sub rcx , 1
jmp newdoform

nomoreform:

pop r10 r9 r8 rdx

;

mov rcx , [resx_resy_4]
add rcx , data6
cmp rdi , rcx
jae nothisdata

nothisc:

add r14 , 8

jmp testnewline

nothisdata:

ret



display_frame_yuv:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Displays wanted frame at data from video device
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov [framebegin],r12

newframesearch:

call get_frame_size
cmp rax , [resx_resy_2]
je displayframe

; If framesize if not acceptable, search for next frame

mov rsi , [r12]
cmp rsi , 0xfffffff
jae frbl312

mov [framebegin],r12

jmp newframesearch

frbl312:

mov rsi , 1 ; no more frames
ret

displayframe:

; Calculate and display

call separate_data

call fps_delay

call display_image_yuv

display_exit:

inc dword [frames_per_second]

mov rsi , 0
ret




display_image_yuv:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Displays image
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov rax , 7
mov rbx , 15 shl 32
mov rcx , (49) shl 32
add rbx , [resx]
add rcx , [resy]
mov rdx , data6
mov r8 , 0
mov r9 , 0x1000000
mov r10 , 4
int 0x60

ret



calculate_yuv:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; YUV to RGB
;
; In: r8,r9,r10 - YUV
;
; Out: rdx - RGB
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

push r11 r12 r13

lea r9 , [r9-128]
lea r10 , [r10-128]

; Red
mov rdx , r8
mov r11 , r10
add rdx , r11
shr r11 , 2
add rdx , r11
shr r11 , 1
add rdx , r11
shr r11 , 2
add rdx , r11
imul rdx , [scroll_value_1_multiply]
shr rdx , 7
test rdx , 1111100000000b
jnz redlimit
redlimitret:
shl rdx , 8

; Green
mov r11 , r8
mov r12 , r9
shr r12 , 2
mov r13 , r12
shr r12 , 2
add r13 , r12
shr r12 , 1
add r13 , r12
sub r11 , r12
mov r12 , r10
shr r12 , 1
mov r13 , r12
shr r12 , 2
add r13 , r12
shr r12 , 1
add r13 , r12
shr r12 , 1
add r13 , 1
sub r11 , r13
imul r11 , [scroll_value_2_multiply]
shr r11 , 7
test r11 , 1111100000000b
jnz greenlimit
greenlimitret:
mov dl , r11b
shl rdx , 8

; Blue
mov r12 , r8
mov r11 , r9
add r12 , r11
shr r11 , 1
add r12 , r11
shr r11 , 1
add r12 , r11
shr r11 , 4
add r12 , r11
imul r12 , [scroll_value_3_multiply]
shr r12 , 7
test r12 , 1111100000000b
jnz bluelimit
bluelimitret:
mov dl , r12b

pop r13 r12 r11

ret


redlimit:
test rdx , 1000000000000b
jnz redlimit000
mov rdx , 255
jmp redlimitret
redlimit000:
xor rdx , rdx
jmp redlimitret
greenlimit:
test r11 , 1000000000000b
jnz greenlimit000
mov r11 , 255
jmp greenlimitret
greenlimit000:
xor r11 , r11
jmp greenlimitret
bluelimit:
test r12 , 1000000000000b
jnz bluelimit000
mov r12 , 255
jmp bluelimitret
bluelimit000:
xor r12 , r12
jmp bluelimitret






form_picture:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Forms BMP picture to data10+
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Header

mov rsi , bmpheader
mov rdi , data10
mov rcx , 54
cld
rep movsb

mov rax , [sizex]
mov [data10+0x12],eax

mov rbx , [sizey]
mov [data10+0x16],ebx

; Picture data

mov rdi , data10+54
mov rsi , [sizex]
imul rsi , [sizey]
imul rsi , 4
add rsi , data6
mov rcx , 0
newpicdata:

sub rsi , [sizex]
sub rsi , [sizex]
sub rsi , [sizex]
sub rsi , [sizex]

push rcx rsi
mov rcx , [sizex]
datamovel1:
mov eax , [rsi]
mov [rdi],eax
add rsi , 4
add rdi , 3
loop datamovel1
pop rsi rcx

inc rcx
cmp rcx , [sizey]
jb newpicdata

ret


save_snap:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Saves BMP snap
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

push qword [camera_state]

mov rax , 5
mov rbx , 10
int 0x60

call turn_camera_off

; Saving BMP text

mov rbx , textsaving2
call display_text

mov rax , [resx]
mov [sizex],rax
mov rax , [resy]
mov [sizey],rax

; Form picture to data10+

call form_picture

; Snap count

mov rax , [snapcount]
xor rdx , rdx
mov rbx , 10
div rbx
mov [filesave+12],dl
mov [filesave+11],al
add [filesave+11],word '00'

; Delete file if persent

mov rax , 58
mov rbx , 2
mov r9 , filesave
int 0x60

; Save file

mov rax , 58
mov rbx , 1
mov rcx , 0
mov rdx , [sizex]
imul rdx , [sizey]
imul rdx , 3
add rdx , 54
mov r8 , data10
mov r9 , filesave
int 0x60

; Increase snap counter

inc dword [snapcount]

; Draw button

call draw_snap_button

; Draw image

call display_image_yuv

pop rax
cmp rax , 1
jne noturnbackon
mov rax , 5
mov rbx , 10
int 0x60
call turn_camera_on
noturnbackon:

ret


display_text:

mov rax , 0x4
mov rcx , 20
mov rdx , 54
mov rsi , 0xffffff
mov r9 , 0x1
int 0x60

ret



record_picture:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Records picture for AVI
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

cmp [record_state],byte 1
jne recl2

; 10 fps

mov rbx , textrec
call display_text

mov rax , 26
mov rbx , 1
mov rcx , fps_data
mov rdx , 1024
int 0x60
mov rax , [fps_data+384]
cmp rax , [record_next]
jb recl2
add rax , 100
mov [record_next],rax

; All recorded ?

mov rax , [resx_resy_4]
add rax , 4*2
imul rax , 50
add rax , data10+(avi_end-avi_start)

cmp [record_position], rax
jb recfine
mov [record_state],byte 0

call display_image_yuv

; Saving text

mov rbx , textsaving
call display_text

call save_clip

call display_image_yuv

ret
recfine:

call display_image_yuv

mov rax , [record_position]
sub rax , data10
xor rdx , rdx
mov rbx , [resx_resy_4]
imul rbx , 10
div rbx
add rax , 48+1
mov [textrec+5],al

mov rbx , textrec
call display_text

mov rdi , [record_position]
mov [rdi], dword '00db'

mov rsi, [resx_resy_4]

mov [rdi+4], esi

add rdi , 8
mov rsi , data6
add rsi , [resx_resy_4]
sub rsi , [resx]
sub rsi , [resx]
sub rsi , [resx]
sub rsi , [resx]
recl1:

push rsi rdi
mov rcx , [resx]
shl rcx , 2
cld
rep movsb
pop rdi rsi

add rdi , [resx]
add rdi , [resx]
add rdi , [resx]
add rdi , [resx]

sub rsi , [resx]
sub rsi , [resx]
sub rsi , [resx]
sub rsi , [resx]

cmp rsi , data6
jae recl1

mov rsi , [resx_resy_4]
add rsi , 8

add [record_position],esi

recl2:

ret


save_clip:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Saves AVI clip
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

push qword [camera_state]

mov rax , 5
mov rbx , 10
int 0x60

call turn_camera_off

; Header

mov rsi , avi_start
mov rdi , data10
mov rcx , avi_end-avi_start
cld
rep movsb

; idx1

mov rsi , idx1_start
mov rdi , data10 + (avi_end-avi_start) + ((4*2+320*240*4)*50)
mov rcx , idx1_end-idx1_start
cld
rep movsb

; Filecount

mov rax , [clipcount]
xor rdx , rdx
mov rbx , 10
div rbx
mov [filesaveavi+12],dl
mov [filesaveavi+11],al
add [filesaveavi+11],word '00'

; Delete file if persent

mov rax , 58
mov rbx , 2
mov r9 , filesaveavi
int 0x60

; Save file

mov rax , 58
mov rbx , 1
mov rcx , 0
mov rdx , (avi_end-avi_start)+(4*2+320*240*4)*50+(idx1_end-idx1_start)
mov r8 , data10
mov r9 , filesaveavi
int 0x60

; Increase snap counter

inc dword [clipcount]

; Draw button

call draw_clip_button

pop rax
cmp rax , 1
jne noturnbackonavi
mov rax , 5
mov rbx , 10
int 0x60
call turn_camera_on
noturnbackonavi:

ret



draw_window:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Draws window
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov rax , 0xC ; Beginning of window draw
mov rbx , 0x1
int 0x60

; Draw window

mov rax , 0x0
mov rbx , 150 shl 32 + 480
mov rcx , 80 shl 32 + 310
mov rdx , 0x0000000000FFFFFF
mov r8 , 0x0000000000000001
mov r9 , window_label
mov r10 , menu_struct
int 0x60

; Start camera button

mov rax , 8
mov rbx , [xpos]
shl rbx , 32
add rbx , 116
mov rcx , (247+21-21) shl 32 + 21
mov rdx , 101
mov r8 , 0
mov r9 , string_start_camera
int 0x60

; Stop camera button

mov rax , 8
mov rbx , [xpos]
shl rbx , 32
add rbx , 116
mov rcx , (247+21+21-21) shl 32 + 21
mov rdx , 102
mov r8 , 0
mov r9 , string_stop_camera
int 0x60

; Server button

call server_button

; Snap picture button

call draw_snap_button

; Clip button

call draw_clip_button

; Resolution buttons

call resolution_buttons

; Display image

call display_image_yuv

; Display text

mov rax , 0x4
mov rbx , text
mov rcx , [xpos]
add rcx , 4+scx-6
mov rdx , 132
mov rsi , 0x0
mov r9 , 0x1
newline:
int 0x60
add rbx , 0x1F
add rdx , 13-2
cmp [rbx],byte 'x'
jne newline

; Scrolls

call draw_scroll_1
call draw_scroll_2
call draw_scroll_3
call draw_scroll_values

; Camera status

mov [camera_connection_status],dword 2
call check_camera_state

; FPS

call display_frames_per_second

mov rax , 0xC
mov rbx , 0x2
int 0x60

ret


server_button:

; Server button

mov rax , 8
mov rbx , [xpos]
shl rbx , 32
add rbx , 116
mov rcx , (173-20+4+b3y) shl 32 + bys
mov rdx , 105
mov r8 , 0
mov r9 , string_server_off
cmp [serveronoff],byte 3
je serverl1
mov r9 , string_server_on
serverl1:
int 0x60

ret


resolution_buttons:

; Resolution buttons

mov rax , 8
mov rbx , [xpos] ; shl 32 + 116/3+1
shl rbx , 32
add rbx , 116/3+1
mov rcx , rby ; 236-20-2) shl 32 + bys
mov rdx , 121
mov r8 , 0
mov r9 , string_res_160
int 0x60

mov rax , 8
mov rbx , [xpos]
add rbx , 116/3+1
shl rbx , 32
add rbx , 116/3
mov rcx , rby ; (236-20-2) shl 32 + bys
mov rdx , 122
mov r8 , 0
mov r9 , string_res_320
int 0x60

mov rax , 8
mov rbx , [xpos]
add rbx , 116/3*2+1
shl rbx , 32
add rbx , 116/3+1
mov rcx , rby ; (236-20-2) shl 32 + bys
mov rdx , 123
mov r8 , 0
mov r9 , string_res_640
int 0x60

ret


draw_snap_button:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Draws snap button
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Snap count

mov rax , [snapcount]
xor rdx , rdx
mov rbx , 10
div rbx
mov [string_snap_save+12],dl
mov [string_snap_save+11],al
add [string_snap_save+11],word '00'

; Save snap button

mov rax , 8
mov rbx , [xpos]
shl rbx , 32
add rbx , 116
mov rcx , (194-18+2+b3y) shl 32 + bys
mov rdx , 103
mov r8 , 0
mov r9 , string_snap_save
int 0x60

ret


draw_clip_button:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Draws video clip button
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Clip count

mov rax , [clipcount]
xor rdx , rdx
mov rbx , 10
div rbx
mov [string_clip_save+12],dl
mov [string_clip_save+11],al
add [string_clip_save+11],word '00'

; Save clip button

mov rax , 8
mov rbx , [xpos]
shl rbx , 32
add rbx , 116
mov rcx , (215-16+b3y) shl 32 + bys
mov rdx , 104
mov r8 , 0
mov r9 , string_clip_save
int 0x60

ret


draw_scroll_values:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Draws scroll RGB values
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov rbx , [scroll_value_1]
sub rbx , 10000
mov rcx , 200
sub rcx , rbx
call get_multiplier
mov [scroll_value_1_multiply], r8
mov rdx , [xpos]
add rdx , 4+scx
shl rdx , 32
add rdx , 140-14+6+scl
call display_number

mov rbx , [scroll_value_2]
sub rbx , 20000
mov rcx , 200
sub rcx , rbx
call get_multiplier
mov [scroll_value_2_multiply], r8
mov rdx , [xpos]
add rdx , 4+7*6+scx
shl rdx , 32
add rdx , 140-14+6+scl
call display_number

mov rbx , [scroll_value_3]
sub rbx , 30000
mov rcx , 200
sub rcx , rbx
call get_multiplier
mov [scroll_value_3_multiply], r8
mov rdx , [xpos]
add rdx , 4+14*6+scx
shl rdx , 32
add rdx , 140-14+6+scl
call display_number

ret


get_multiplier:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Multiplier for colour values
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

push rax rbx rcx rdx

shl rcx , 7
mov rax , rcx
xor rdx , rdx
mov rbx , 100
div rbx
mov r8 , rax

pop rdx rcx rbx rax

ret


draw_scroll_1:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Scroll 1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov rax , 113
mov rbx , 1
mov rcx , 10000
mov rdx , 201
mov r8 ,[scroll_value_1]
mov r9 , [xpos]
add r9 , 7+scx
mov r10 , 50
mov r11 , 80-12+6+scl
int 0x60

ret


draw_scroll_2:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Scroll 2
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov rax , 113
mov rbx , 1
mov rcx , 20000
mov rdx , 201
mov r8 ,[scroll_value_2]
mov r9 , [xpos]
add r9 , 7+7*6+scx
mov r10 , 50
mov r11 , 80-12+6+scl
int 0x60

ret


draw_scroll_3:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Scroll 3
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov rax , 113
mov rbx , 1
mov rcx , 30000
mov rdx , 201
mov r8 ,[scroll_value_3]
mov r9 , [xpos]
add r9 , 7+14*6+scx
mov r10 , 50
mov r11 , 80-12+6+scl
int 0x60

ret


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Data area
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

scroll_value_1: dq 10100
scroll_value_2: dq 20100
scroll_value_3: dq 30100

scroll_value_1_multiply: dq 10100
scroll_value_2_multiply: dq 20100
scroll_value_3_multiply: dq 30100

text:

db ' xxx% xxx% xxx% ',0
db ' Red Green Blue ',0
db 'x'

string_res_160: db '160',0
string_res_320: db '320',0
string_res_640: db '640',0

picsend: dq 0x0
show_fps: dq 0x0
fastercount: dq 0x0

string_start_camera: db 'START',0
string_stop_camera: db 'STOP',0
string_snap_save: db '/USB/1/SNAPXX.BMP',0
string_clip_save: db '/USB/1/CLIPXX.AVI',0

string_server_off: db 'SERVER: OFF',0
string_server_on: db 'PORT 8090 OPEN',0
string_resolution_320: db '320x240 required.',0
string_fps: db 'Sent: FPS: / ',0
string_screen_req: db '800x600 screen resolution required.',0


string_camera_disconnected:

db 'Camera disconnected.',0

read_wait: dq 0x0

pdata82: dq data8
pdata92: dq data9

scanstart: dq 0x0
threadpos: dq 0x0
fps_n: dq 0x0

threadposprev: dq 0x0
frames_per_second: dq 0x0

fpsx: dq 0x0
record_next: dq 0x0

camera_connection_status: dq 0x2
frames_per_second_missed: dq 0x0

xr: dq 160,320,640
yr: dq 120,240,480
xp: dq 346,346,666
cb: dq 001b,010b,100b

serveronoff: dq 3 ; 1=on-2=closing-3=closed

server_socket: dq 0x0

resx: dq 320
resy: dq 240
xpos: dq 346

resx_resy_2: dq 320*240*2
resx_resy_3: dq 320*240*3
resx_resy_4: dq 320*240*4

sconf: dq 0x0
sizex: dq 0x0
sizey: dq 0x0

filesaveavi: db '/usb/1/clipxx.avi',0
record_state: dq 0x0
clipcount: dq 0x0
filesave: db '/usb/1/snapxx.bmp',0
snapcount: dq 0x0

textrec: db 'REC (1/5s)',0
textsaving: db 'Saving AVI-file, which might take a minute...',0
textsaving2: db 'Saving BMP-file...',0

record_position: dq data10 + 1208

red: dq 0x0
green: dq 0x0
blue: dq 0x0

framebegin: dq 0x0

framestart: dq 0x0
framenumber: dq 0x0
timedifference: dq 0x0
headerstart: dq 0x0
next_update: dq 0x0
thread_running: dq 0x0
read_position: dq 0x0

pre_read_block: dq 0x1
analyze_block: dq 0x0
analyze_block_position: dq 0x0

readon: dq 0x1
camera_state: dq 0x0

tsc_base: dq 0x0
fps_next: dq 0x0
fps_add: dq 34 ; 30fps
tsc_next: dq 0x0

color: dq 0x0
ypos: dq 0x0
maxcount: dq 0x0
framec: dq 0x0
datapos: dq 0x0
savecount: dq 0x0

framecount: dq 0x0
currentframe: dq 0x0
bytesperframe: dq 0x0
jpgheaders: dq 0x0
jpgheadersmem: dq 0x0
bytesperframejpg: dq 0x0
bytespersecond: dq 0x0
framesinsample: dq 0x0

data_amount: dq 0x0
data_valid: dq 0x0
data_pre: dq 0x0
data_unavailable: dq 0x0
datasent: dq 0x0

window_label:

db 'WEBCAM',0 ; Window label

menu_struct: ; Menu Struct

dq 0 ; Version

dq 0x100 ; Start value of ID to return ( ID + Line )
; Returned when menu closes and
; user made no selections.

db 0,'SETUP',0

sta1: db 1,'> Stats Off ',0
sta2: db 1,' Stats On ',0

db 1,'-',0

eo: db 1,'> Normal ',0
eb: db 1,' Blur ',0
en: db 1,' Negative',0

db 1,'-',0

db 1,'Quit',0

db 255 ; End of Menu Struct


html_header_index:

db 'HTTP/1.1 200 OK',13,10
db 'Server: Menuet',13,10
db 'Connection: close',13,10
db 'Content-Length: 47',13,10
db 'Content-Type: text/html',13,10
db 13,10
db '<html><body><img src=image.bmp></body></html>',13,10

h_i_len:



html_header:

db 'HTTP/1.1 200 OK',13,10
db 'Server: Menuet',13,10
db 'Connection: close',13,10
db 'Content-Length: '
hsz: db '00230454'
db 13,10
db 'Content-Type: image/bmp',13,10,13,10

h_len:


bmpheader:

db 66
db 77
db 54
db 12
db 0
db 0
db 0
db 0
db 0
db 0
db 54
db 0
db 0
db 0
db 40
db 0
db 0
db 0
db 32 ; x
db 0
db 0
db 0
db 32 ; y
db 0
db 0
db 0
db 1
db 0
db 24
db 0
db 0
db 0
db 0
db 0
db 0
db 12
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0

numframes equ 50

avi_start:

db 'RIFF'
dd 15361432-8

db 'AVI '

db 'LIST'
dd l4_end-l4
l4:
db 'hdrl'
dd 'avih'
dd 0x38
dd 100000 ; microseconds between frames
dd 0x320000 ; maxbytespersec
dd 0x200 ; paddinggranularity
dd 0x810 ; flags
dd numframes ; total frames
dd 0x00 ; zero for non-interleaved
dd 0x01 ; number of streams
dd 330*240*4 ; suggested buffer size
dd 320 ; image size x
dd 240 ; image size y
dd 0,0,0,0

db 'LIST'
dd l6_end-l6
l6:
db 'strl'
db 'strh'
dd 0x38
db 'vids'
db 'DIB ' ; handler
dd 0x0 ; flags
dd 0x0 ; priority and language
dd 0x0 ; initial frames
dd 01000000 ; scale
dd 10000000 ; rate
dd 0x0 ; start
dd numframes ; number of frames
dd 320*240*4 ; 0x4b008 ; suggested buffer size
dd 0x0 ; quality
dd 4 ; sample size
dd 0x0 ; rect struct
dd 0x0

db 'strf'
dd 0x28 ; length
dd 0x28 ; length II
dd 320 ; width
dd 240 ; height
dd 0x200001 ; planes and bitcount
dd 0x0 ; compression
dd 320*240*4 ; image size
dd 0x0 ; xpelspermeter
dd 0x0 ; ypelspermeter
dd 0x0 ; clrused
dd 0x0 ; clrimportant

l4_end:
l6_end:

db 'LIST'
dd 4+(2*4+320*240*4)*50
l5:
db 'movi'

avi_end:

idx1_start:

db 'idx1'
dd indx12-indx11
indx11:
db '00db'
dd 16
dd 0x4+(320*240*4+8)*0
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*1
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*2
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*3
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*4
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*5
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*6
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*7
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*8
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*9
dd 320*240*4

db '00db'
dd 16
dd 0x4+(320*240*4+8)*10
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*11
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*12
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*13
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*14
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*15
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*16
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*17
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*18
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*19
dd 320*240*4

db '00db'
dd 16
dd 0x4+(320*240*4+8)*20
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*21
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*22
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*23
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*24
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*25
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*26
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*27
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*28
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*29
dd 320*240*4

db '00db'
dd 16
dd 0x4+(320*240*4+8)*30
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*31
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*32
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*33
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*34
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*35
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*36
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*37
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*38
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*39
dd 320*240*4

db '00db'
dd 16
dd 0x4+(320*240*4+8)*40
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*41
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*42
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*43
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*44
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*45
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*46
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*47
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*48
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*49
dd 320*240*4

indx12:

idx1_end:


data_boot_info: times 8*30 db ?


fps_data:

times 2048 db ?

;

times 1024 db ? ; Stack server

server_stack:

times 1024 db ? ; Stack read

thread_stack:

times 1024 db ? ; Stack main

image_end:

#compile this fasm 1.7+


Top
   
 
PostPosted: Tue Jan 05, 2016 3:23 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Fri Jun 30, 2006 9:01 am
Posts: 1247
Congratulations, you have copied the contents of webcam.asm from Menuet64 sources into a forum post!

Problems:
  • You failed to use the code tags to mark up the text properly.
  • You removed the header of the program, which some coders (especially Ville) dont like.
  • You failed to realize that this is the code of a 64-bit program (and not a driver) that only works on menuetos 64, or are just trolling.

Therefore, this thread has been closed.

_________________
"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein


Top
   
 
Display posts from previous:  Sort by  
Post new topic  This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited