Spoiler:
data1 equ image_end+0x100000*01 ; Timestamp datadata4 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+