0,0 → 1,3076 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; |
; 64 bit Menuet Webcam |
; |
; Compile with FASM 1.60 or above |
; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
data1 equ image_end+0x100000*1 ; Timestamp data |
data3 equ image_end+0x100000*2 ; Image data |
data4 equ image_end+0x100000*10 ; Image data time order |
data5 equ image_end+0x100000*11 ; Length data time order |
data6 equ image_end+0x100000*12 ; Decoded image |
data8 equ 0x100000*16 ; 7M*4 - Data return, 4k aligned |
data9 equ 0x100000*52 ; 1M*4 - Data length return |
data10 equ 0x100000*56 ; 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 |
|
use32 |
|
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 |
|
; 320x240 as default |
|
mov r12, 010b |
call scan_for_configuration |
mov [sconf],r12 |
|
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] |
|
mov r12, [cb+rbx*8] |
call scan_for_configuration |
|
cmp r8 , [resx] ; already selected |
je still |
|
mov [resx],r8 |
mov [resy],r9 |
mov [xpos],r10 |
mov [sconf],r12 |
|
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 |
|
scan_for_configuration: |
|
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 |
|
nomodechange: |
|
cmp rbx , 101 |
jne no_on |
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 |
|
|
|
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] |
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 , 256 |
|
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] |
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 , data3 |
|
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*256*8 |
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 |
|
cld |
rep movsb |
|
mov rcx , [resx_resy_2] |
add rcx , data3 |
|
cmp rdi , rcx |
ja nothisdata |
|
nothisc: |
|
add r14 , 8 |
|
jmp testnewline |
|
nothisdata: |
|
ret |
|
|
|
display_frame_yuv: |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; |
; Displays wanted frame at data from video device |
; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
; |
; Search for beginning of frame |
; |
|
mov [framebegin],dword data4 |
|
jmp frbl32 |
|
newframesearch2: |
|
mov rsi , [r12] |
|
cmp rsi , 0xfffffff |
jae frbl312 |
|
mov rcx , [rsi+1] |
and rcx , 1 |
|
frbl12: |
|
add r12 , 8 |
mov rsi , [r12] |
|
cmp rsi , 0xfffffff |
jae frbl312 |
|
mov rdx , [rsi+1] |
and rdx , 1 |
|
cmp rdx , rcx |
je frbl12 |
|
frbl32: |
|
mov [framebegin],r12 |
|
; |
; Check framesize |
; |
|
call get_frame_size |
cmp rax , [resx_resy_2] |
je framesizefine |
|
; If framesize if not acceptable, search for next frame |
|
mov r12 , [framebegin] |
add r12 , 8 |
jmp newframesearch2 |
|
framesizefine: |
|
jmp displayframe |
|
; |
|
frbl312: |
|
mov rsi , 1 ; no more frames |
ret |
|
displayframe: |
|
mov r12 , [framebegin] |
mov [found_frame],r12 |
|
; |
|
call separate_data |
|
; |
; Form picture YUV -> RGB |
; |
|
mov rsi , data3 |
|
mov rdi , data6 |
mov r15 , [resx_resy_4] |
add r15 , data6 |
|
npixell1: |
|
; 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 |
|
cmp rdi , r15 |
jbe npixell1 |
|
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: |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; |
; Calculates RGB from YUV |
; |
; In: r8,r9,r10 - YUV |
; |
; Out: rdx - RGB |
; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
push rbx rcx r11 |
|
mov rcx , r8 |
sub rcx , 16 ; ?! |
mov rdx , r9 |
sub rdx , 128 |
mov r8 , r10 |
sub r8 , 128 |
|
; For all components |
|
imul rcx , 298 |
|
; |
|
mov r9 , 0 ; limit low |
mov r10 , 255 ; limit high |
|
; Red |
|
push rcx r8 |
|
imul r8 , 409 |
|
add rcx , r8 |
add rcx , 128 |
shr rcx , 8 |
|
imul rcx , [scroll_value_1_multiply] |
shr rcx , 7 |
|
cmp rcx , 0xfffffff |
cmovae rcx , r9 |
cmp rcx , r10 |
cmova rcx , r10 |
|
mov r11 , rcx |
|
pop r8 rcx |
|
; Green |
|
push rcx rdx |
|
imul rdx , 100 |
imul r8 , 208 |
|
sub rcx , rdx |
sub rcx , r8 |
add rcx , 128 |
shr rcx , 8 |
|
imul rcx , [scroll_value_2_multiply] |
shr rcx , 7 |
|
cmp rcx , 0xfffffff |
cmovae rcx , r9 |
cmp rcx , r10 |
cmova rcx , r10 |
|
shl r11 , 8 |
mov r11b , cl |
|
pop rdx rcx |
|
; Blue |
|
imul rdx , 516 |
|
add rcx , rdx |
add rcx , 128 |
shr rcx , 8 |
|
imul rcx , [scroll_value_3_multiply] |
shr rcx , 7 |
|
cmp rcx , 0xfffffff |
cmovae rcx , r9 |
cmp rcx , r10 |
cmova rcx , r10 |
|
shl r11 , 8 |
mov r11b , cl |
|
mov rdx , r11 |
|
pop r11 rcx rbx |
|
ret |
|
|
|
acalculate_yuv: |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; |
; YUV to RGB |
; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
push rax rbx rcx r8 |
|
mov rcx , r8 |
sub rcx , 16 |
mov rdx , r9 |
sub rdx , 128 |
mov r8 , r10 |
sub r8 , 128 |
|
; Red |
|
push rcx rdx r8 |
|
imul rcx , 298 |
imul r8 , 409 |
|
add rcx , r8 |
add rcx , 128 |
shr rcx , 8 |
|
imul rcx , [scroll_value_1_multiply] |
shr rcx , 7 |
|
cmp rcx , 0xfffffff |
jb norcxzero1 |
mov rcx , 0 |
norcxzero1: |
cmp rcx , 255 |
jbe rcxfine |
mov rcx , 255 |
rcxfine: |
mov [red],cl |
|
pop r8 rdx rcx |
|
; Green |
|
push rcx rdx r8 |
|
imul rcx , 298 |
imul rdx , 100 |
imul r8 , 208 |
|
sub rcx , rdx |
sub rcx , r8 |
add rcx , 128 |
shr rcx , 8 |
|
imul rcx , [scroll_value_2_multiply] |
shr rcx , 7 |
|
cmp rcx , 0xfffffff |
jb norcxzero2 |
mov rcx , 0 |
norcxzero2: |
cmp rcx , 255 |
jbe rcxfine2 |
mov rcx , 255 |
rcxfine2: |
mov [green],cl |
|
pop r8 rdx rcx |
|
; Blue |
|
push rcx rdx r8 |
|
imul rcx , 298 |
imul rdx , 516 |
add rcx , rdx |
add rcx , 128 |
shr rcx , 8 |
|
imul rcx , [scroll_value_3_multiply] |
shr rcx , 7 |
|
cmp rcx , 0xfffffff |
jb norcxzero3 |
mov rcx , 0 |
norcxzero3: |
cmp rcx , 255 |
jbe rcxfine3 |
mov rcx , 255 |
rcxfine3: |
mov [blue],cl |
|
pop r8 rdx rcx |
|
; |
|
mov rdx , [red] |
shl rdx , 8 |
add rdx , [green] |
shl rdx , 8 |
add rdx , [blue] |
|
pop r8 rcx rbx rax |
|
ret |
|
|
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 |
found_frame: 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: |
|
|
|
|
|
|
|
|