kolibrios-fun/programs/system/disptest/trunk/disptest.ASM

888 lines
14 KiB
NASM
Raw Normal View History

; <--- description --->
; compiler: FASM 1.50
; name: Display Test
; version: 0.4
; author: barsuk
; <--- include all MeOS stuff --->
include "lang.inc"
include "../../../macros.inc"
; <--- start of MenuetOS application --->
MEOS_APP_START
;include "..\..\..\debug.inc"
; <--- start of code --->
CODE
mov eax, 37
mov ebx, 4
mov edx, 2
mov ecx, cursor
int 0x40
or eax, eax
jz exit
mov [cursorID], eax
call draw_window ; at first create and draw the window
wait_event: ; main cycle
xor ebx, ebx
mov eax, 10
int 0x40
cmp eax, 1 ; if event == 1
je redraw ; jump to redraw handler
cmp eax, 2 ; else if event == 2
je key ; jump to key handler
cmp eax, 3 ; else if event == 3
je button ; jump to button handler
jmp wait_event ; else return to the start of main cycle
redraw: ; redraw event handler
call draw_window
jmp wait_event
key: ; key event handler
mov eax, 2 ; get key code
int 0x40
cmp ah, 27
jz exit
cmp ah, 0x20
jz next_test
cmp ah, 179 ; ->
jz next_test
cmp ah, 176 ; <-
jz prev_test
cmp ah, 'i'
jz toggle_info
cmp ah, 'I' ; <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ))
jz toggle_info
cmp ah, 'c'
jz toggle_cursor
cmp ah, 'C'
jz toggle_cursor
cmp ah, 'd'
jz redraw
cmp ah, 'D'
jz redraw
jmp wait_event
next_test:
cmp dword [test_done], 1
jz wait_event
inc dword [test_num]
call draw_window
jmp wait_event
prev_test:
cmp dword [test_num], ebx
jz wait_event
dec dword [test_num]
mov dword [test_done], ebx
call draw_window
jmp wait_event
toggle_info:
xor dword [show_info], 1
call draw_window
jmp wait_event
toggle_cursor:
mov eax, cursorVisible
cmp dword [eax], 0
jz .no_cursor
mov dword [eax], 0
mov ecx, [cursorID]
jmp .set
.no_cursor:
mov dword [eax], 1
xor ecx, ecx
.set:
mov eax, 37
mov ebx, 5
int 0x40
mov eax, 18
mov ebx, 15
int 0x40 ; <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
jmp wait_event
button: ; button event handler
mov eax, 17 ; get button identifier
int 0x40
cmp ah, 1
jne wait_event ; return if button id != 1
exit:
or eax, -1 ; exit application
int 0x40
draw_window:
mov eax, 12 ; start drawing
mov ebx, 1
int 0x40
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;mov eax, 37
;mov ebx, 5
;mov ecx, cursorID
;int 0x40
mov eax, 14 ; screen size
int 0x40
mov ebx, eax
shr ebx, 16
mov ecx, eax
and ecx, 0xffff
mov [screenx], ebx
mov [screeny], ecx
inc ebx
inc ecx
mov eax, 0 ; create and draw the window
mov edx, 0x01000000
mov esi, edx
int 0x40
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A0AD><EFBFBD> <20><><EFBFBD><EFBFBD>
mov eax, 13 ; <20><>㡮 ⠪
xor edx, edx
int 0x40
dec ebx
dec ecx
mov eax, [test_num]
mov eax, [test_proc + eax*4]
or eax, eax
jz end_of_test
call eax
jmp exit_draw
end_of_test:
mov eax, 4
mov ebx, 8 * 65536 + 8
mov ecx, 0xffffff
mov edx, test_finish
mov esi, test_finish.size
int 0x40
mov dword [test_done], 1
jmp no_info
exit_draw:
cmp dword [show_info], 1
jnz no_info
; ᭮<><E1ADAE><><E0A0A7><EFBFBD><EFBFBD> <20><><EFBFBD>
mov ebx, [screenx]
mov ecx, [screeny]
; ᣥ<><E1A3A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><E0A0A7><EFBFBD><E8A5AD><EFBFBD> <20><><EFBFBD>. <20><> <20><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>
; <20><>אַ㣮<EFACAE><EFBFBD> 200<30>40 <20> <20><>
mov edx, 200
mov eax, 13
sub ebx, edx
shl ebx, 15
mov bx, dx
mov edx, 40
sub ecx, edx
shl ecx, 15
mov cx, dx
mov edx, 0xffffff
int 0x40
xor edx, edx
add ebx, 0x0000fffe ; <20><EFBFBD><><E3A4AE><EFBFBD> :))))
add ecx, 0x0000fffe
int 0x40
; ⥪<><E2A5AA>
mov eax, 4
shr ecx, 16
mov bx, cx
add ebx, 0x00010001
mov ecx, 0x80ffffff
mov edx, [test_num]
mov edx, [test_info + edx*4]
int 0x40
add ebx, 8
mov edx, press_space
int 0x40
add ebx, 8
mov edx, press_i
int 0x40
add ebx, 8
mov edx, press_c
int 0x40
no_info:
mov eax, 12 ; finish drawing
mov ebx, 2
int 0x40
ret
; <---- procedures for various tests of display ----->
; in: ebx = screen_width, ecx = screen_height
lsz i_image_size, ru, "Image Size and Placement"
db 0
t_image_size:
mov eax, 38
mov esi, ebx
mov edi, ecx
mov edx, 0xffffff
; 6 <20><><EFBFBD><E0A5A7><EFBFBD>
xor ecx, ecx
int 0x40
mov ecx, edi
shl ecx, 16
xor ebx, ebx
int 0x40
mov ebx, esi
shl ebx, 16
add ecx, edi
int 0x40
sub ecx, edi
add ebx, esi
int 0x40
; ࠬ<><E0A0AC> <20><><EFBFBD>
mov ebx, esi
shl ebx, 16
mov ecx, edi
shl ecx, 15
mov cx, di
shr cx, 1
int 0x40
shr ebx, 1
mov bx, si
shr bx, 1
mov ecx, edi
shl ecx, 16
int 0x40
ret
lsz i_grid, ru, "Grid"
db 0
t_grid:
; <20><>⪠ ࠧ<><E0A0A7><20> 64 <20><><EFBFBD><EFBFBD>
mov eax, 38
inc ebx
inc ecx
mov esi, ebx
mov edi, ecx
mov edx, 0xffffff
mov ebp, 0x00400040
; <20><><EFBFBD><E0A8A7><EFBFBD><E2A0AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
shl ebx, 16
xor ecx, ecx
grid_next_y:
int 0x40
add ecx, ebp
cmp cx, di
jnae grid_next_y
sub ecx, 0x00010001
int 0x40
; <20><><EFBFBD><EFBFBD><E2A8AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
mov ecx, edi
shl ecx, 16
xor ebx, ebx
grid_next_x:
int 0x40
add ebx, ebp
cmp bx, si
jnae grid_next_x
sub ebx, 0x00010001
int 0x40
ret
lsz i_horstr, ru, "Horizontal Straightness"
db 0
t_horstr:
mov eax, 38
mov edi, ecx
mov edx, 0xffffff
mov esi, ecx
inc esi
shr esi, 3
mov ebp, esi
shl ebp, 16
mov bp, si
; <20><><EFBFBD><E0A8A7><EFBFBD><E2A0AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
shl ebx, 16
mov ecx, ebp
shr ecx, 1
mov cx, bp
shr cx, 1
hor_next_y:
int 0x40
add ecx, ebp
cmp cx, di
jnae hor_next_y
ret
lsz i_vertstr, ru, "Vertical Straightness",0
db 0
t_vertstr:
mov eax, 38
mov edx, 0xffffff
mov esi, ebx
shl ecx, 16
mov edi, esi
shr edi, 3
mov ebp, edi
shl ebp, 16
mov bp, di
mov ebx, ebp
shr ebx, 1
mov bx, bp
shr bx, 1
vert_next_x:
int 0x40
add ebx, ebp
cmp bx, si
jnae vert_next_x
ret
lsz i_distort, ru, "Distortion",0
db 0
t_distort:
mov edx, 0xffffff
mov esi, ebx
mov edi, ecx
mov ebp, 3
xor ebx, ebx
dist_next:
mov eax, 38
push ebp
mov ebp, ebx
shl ebx, 16
or ebx, ebp
mov ecx, edi
shl ecx, 16
or ecx, ebp
int 0x40
mov ebx, esi
shl ebx, 16
mov bx, si
int 0x40
mov bx, bp
mov ecx, ebp
shl ecx, 16
or ecx, ebp
int 0x40
mov ecx, edi
shl ecx, 16
mov cx, di
int 0x40
mov eax, 30
sub esi, eax
sub edi, eax
mov ebx, ebp
add ebx, eax
pop ebp
dec ebp
jnz dist_next
ret
lsz i_horres, ru, "Horizontal Resolution",0
db 0
t_horres:
mov eax, 38
mov edx, 0xffffff
mov edi, ecx
shl ecx, 16
mov esi, ebx
xor ebx, ebx
mov edi, 0x003A003A
mov ebp, 0x00030003
horres_next:
add ebx, edi
int 0x40
add ebx, ebp
int 0x40
add ebx, ebp
int 0x40
add ebx, ebp
int 0x40
add ebx, ebp
int 0x40
cmp bx, si
jna horres_next
ret
lsz i_vertres, ru, "Vertical Resolution",0
db 0
t_vertres:
mov eax, 38
mov edx, 0xffffff
; mov esi, ebx
shl ebx, 16
mov edi, ecx
xor ecx, ecx
mov ebp, 0x00030003
mov esi, 0x002A002A
vertres_next:
add ecx, esi
int 0x40
add ecx, ebp
int 0x40
add ecx, ebp
int 0x40
add ecx, ebp
int 0x40
add ecx, ebp
int 0x40
add ecx, 0x00540054
cmp cx, di
jna vertres_next
ret
lsz i_moire, ru, "Moire Patterns",0
db 0
t_moire:
mov eax, 38
mov edx, 0xffffff
mov edi, ecx
shl ecx, 16
mov esi, ebx
xor ebx, ebx
mov ebp, 0x00030003
moire_next:
int 0x40
add ebx, ebp
cmp bx, si
jna moire_next
ret
lsz i_revsharp, ru, "Reverse Video Sharpness",0
db 0
t_revsharp:
mov esi, ebx
mov edi, ecx
shr ecx, 1
mov eax, 13
mov edx, 0xffffff
int 0x40
; <20><><E2A5AF><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
mov eax, 38
mov ecx, edi
mov edx, 0x01000000
xor ebx, ebx
mov ebp, 0x00010001
mov edi, 0x003F003F
revsharp_next:
add ebx, edi
int 0x40
add ebx, ebp
int 0x40
add ebx, ebp
int 0x40
add ebx, edi
sub ebx, ebp
int 0x40
cmp bx, si
jna revsharp_next
ret
lsz i_flicker, ru, "Flicker Severity",0
db 0
t_flicker:
mov eax, 13
mov edx, 0xffffff
int 0x40
ret
lsz i_glare, ru, "Glare Severity",0
db 0
t_glare: ; <20><><EFBFBD><E2A8AC><EFBFBD><EFBFBD><E0AEA2><EFBFBD> <20><><EFBFBD>
ret
lsz i_interlace, ru, "Interlacing Detection",0
db 0
t_interlace:
mov edi, ecx
mov eax, 38
mov edx, 0xffffff
xor ecx, ecx
mov ebp, 0x00020002
interlace_next:
add ecx, ebp
int 0x40
cmp cx, di
jna interlace_next
ret
lsz i_scrreg, ru, "Screen Regulation",0
db 0
t_scrreg:
mov eax, 13
mov edx, 0xffffff
add ebx, 0x0018FFCD ; +25 <20> <20><><EFBFBD> <20> -50 <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
shr ecx, 1
add ecx, 0x0013FFEC ; +19 <20> <20><><EFBFBD> <20> -19 <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
int 0x40
ret
lsz i_pricol, ru, "Primary Color Purity"
db 0
t_pricol:
mov esi, ebx
mov edi, ecx
mov eax, 13
shr ebx, 4 ; /16
mov ebp, ebx
shl ebx, 16
mov bx, bp
shl ebp, 16
lea ebp, [ebp + ebp * 4] ; ebp *= 5
mov ecx, 0x00280000
mov cx, di
sub cx, 80
;shr cx, 1
shl bx, 2
mov edx, 0xff0000
int 0x40
add ebx, ebp
shr edx, 8
int 0x40
add ebx, ebp
shr edx, 8
int 0x40
ret
lsz i_colint, ru, "Color Intensity Gradient"
db 0
t_colint:
mov esi, ebx
mov edi, ecx
; mov eax, ecx
; shr ecx, 2 ; end y coord
; and ecx, 0xffffff80 ; <20><><EFBFBD> not 7F
; shr eax, 7 ; / 128
; mov ebp, eax
; mov edx, eax
; lea eax, [eax + eax * 2] ; eax *= 5
; shl ebp, 4
; add eax, ebp
; shl eax, 16
; add ecx, eax
; mov edx, ebp
; shl ebp, 16
; mov bp, dx ; <20><> <20><><EFBFBD><EFBFBD>
; <20> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1ADAE> <20>_<EFBFBD>
; <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><><E1A3A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ecx (<28><><EFBFBD><E7A0AB><EFBFBD><EFBFBD><><E1A4A2>) <20> ebp (蠣 <20><> <20>)
mov eax, edi
lea eax, [eax + 2 * eax]
shr eax, 5 ; eax = 3/32 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mov ebp, eax
shl ebp, 16
mov bp, ax ; ebp = ax <20> <20><><EFBFBD><EFBFBD><EFBFBD><><E1ABAE><EFBFBD>
mov ebx, eax ; <20><><EFBFBD><EFBFBD><E0A0AD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD>
mov eax, edi
inc eax
shr eax, 4 ; 3/16 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><>砫쭮<E7A0AB> <20><><EFBFBD><EFBFBD><E7A5AD>
; <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3/4 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><EFBFBD> <20><> 3/32 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><><E0AEA2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>)
lea eax, [eax + eax * 2]
mov ecx, eax
shl ecx, 16
shr ebx, 2
lea ebx, [ebx + ebx * 2] ; ebx = 3/4 ebx, <20>.<2E>. 3/4 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
add eax, ebx
mov cx, ax
xor edx, edx
mov eax, 0xffff
div esi
mov edi, eax ; edi = 64K/width
mov dword [color_index], 0
jmp colint_next
color_table dd 0x00ff0000, 0x0000ff00, 0x00ffff00, \
0x000000ff, 0x00ff00ff, 0x0000ffff, 0x00ffffff
color_index dd 0
colint_next:
xor edx, edx
xor ebx, ebx
mov eax, 38
colint_next_line:
push edx
push eax
movzx eax, dh
shl eax, 16
mov dl, dh
or edx, eax
mov eax, [color_index]
mov eax, [color_table + eax * 4]
and edx, eax
pop eax
int 0x40
pop edx
add ebx, 0x00010001
add edx, edi
cmp bx, si
jna colint_next_line
add ecx, ebp
inc dword [color_index]
cmp dword [color_index], 7
jb colint_next
ret
lsz i_colalign, ru, "Color Alignment Grid"
db 0
t_colalign:
; <20><><EFBFBD><EFBFBD> <20><>
inc ebx ; ⠪ <20><EFBFBD>
inc ecx
mov esi, ebx
mov edi, ecx
mov edx, 0xff0000
; <20><><EFBFBD><E0A8A7><EFBFBD><E2A0AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
shl ebx, 16
xor ecx, ecx
push edi
shr edi, 3
mov ebp, edi
shl ebp, 16
mov bp, di
pop edi
mov [yshift], ebp
mov eax, 38
cgrid_next_y:
int 0x40
add ecx, ebp
cmp cx, di
jnae cgrid_next_y
; <20><><EFBFBD><E1ABA5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>:
sub ecx, 0x00010001
int 0x40
; <20><><EFBFBD><EFBFBD><E2A8AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
mov ecx, edi
shl ecx, 16
xor ebx, ebx
push esi
shr esi, 3
mov ebp, esi
shl ebp, 16
mov bp, si
mov [xshift], ebp
pop esi
mov eax, 38
cgrid_next_x:
int 0x40
add ebx, ebp
cmp bx, si
jnae cgrid_next_x
; <20><><EFBFBD><E1ABA5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
sub ebx, 0x00010001
int 0x40
jmp cgrid_green
xshift dd 0
yshift dd 0
shift dd 0
cgrid_green:
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><E0A8A7><EFBFBD><E2A0AB><EFBFBD><EFBFBD>
mov edx, esi
shr edx, 5
lea eax, [edx + edx * 2]
shl edx, 16
or edx, eax
mov [shift], edx
mov eax, 38
mov edx, 0x00ff00
xor ecx, ecx
mov ebp, [xshift]
ggrid_next_yy:
mov ebx, [shift]
ggrid_next_yx:
int 0x40
add ebx, ebp
cmp bx, si
jnae ggrid_next_yx
sub ebx, 0x00010001
int 0x40
add ecx, [yshift]
cmp cx, di
jnae ggrid_next_yy
; last row of lines
mov ebx, [shift]
dec ecx
ggrid_last_yx:
int 0x40
add ebx, ebp
cmp bx, si
jnae ggrid_last_yx
; <20> <20><><EFBFBD><EFBFBD><E2A8AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mov edx, edi
shr edx, 5
lea eax, [edx + edx * 2]
shl edx, 16
or edx, eax
mov [shift], edx
mov eax, 38
mov edx, 0x00ff00
mov ecx, [shift]
mov ebp, [xshift]
ggrid_next_xy:
xor ebx, ebx
ggrid_next_xx:
int 0x40
add ebx, ebp
cmp bx, si
jnae ggrid_next_xx
sub ebx, 0x00010001
int 0x40
add ecx, [yshift]
cmp cx, di
jnae ggrid_next_xy
xor ebx, ebx
dec ecx
ggrid_last_xy:
;int 0x40
;add ebx, ebp
;cmp bx, si
;jnae ggrid_last_xy
ret
lsz i_colsyn, ru, "Color Synchronization"
db 0
t_colsyn:
inc ebx
inc ecx
mov esi, ebx
mov edi, ecx
shr ebx, 5
mov eax, ebx
lea ebx, [ebx + ebx * 4]
shl ebx, 1 ; 10/32
mov ebp, ebx
shl eax, 16
or ebx, eax
shl ebp, 16
mov edi, 0x0000ffff
add ecx, 0x003FFF7F
mov edx, edi
mov eax, 13
int 0x40
mov edx, 0x00ff0000
add ebx, ebp
int 0x40
mov edx, edi
add ebx, ebp
int 0x40
ret
; <--- initialised data --->
DATA
screenx dd 0
screeny dd 0
test_num dd 0
test_done dd 0
show_info dd 1
test_proc dd t_image_size, t_grid, t_horstr, t_vertstr,\
t_distort, t_horres, t_vertres, t_moire, t_revsharp, \
t_flicker, t_glare, t_interlace, t_scrreg, t_pricol, \
t_colint, t_colalign, t_colsyn, 0
test_info dd i_image_size, i_grid, i_horstr, i_vertstr, \
i_distort, i_horres, i_vertres, i_moire, i_revsharp, \
i_flicker, i_glare, i_interlace, i_scrreg, i_pricol, \
i_colint, i_colalign, i_colsyn, 0
lsz press_space, ru, "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0AEA1> <20><><EFBFBD> <20><EFBFBD><E0AEA4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,"
db 0
lsz press_i, ru, "I <20><><EFBFBD> <20><><EFBFBD><E0A5AA><EFBFBD><E7A5AD><><E1A2A5><EFBFBD><EFBFBD><EFBFBD>,"
db 0
lsz press_c, ru, "<22> C <20><><EFBFBD> <20><><EFBFBD><E0A5AA><EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
db 0
lsz header, ru, "<22><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
lsz test_finish, ru, "<22><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ESC."
cursor dd 32*32 dup(0x00000000) ; <20><><EFBFBD><><E0A0A2><><E1AEA6><EFBFBD><EFBFBD><EFBFBD>
cursorVisible dd 1
cursorID dd 0
; <--- uninitialised data --->
UDATA
MEOS_APP_END
; <--- end of MenuetOS application --->