forked from KolibriOS/kolibrios
156 lines
3.8 KiB
NASM
156 lines
3.8 KiB
NASM
|
; to compile: nasm -f bin fillscr.asm -o fillscr ;
|
||
|
; to generate random colors use "fillscr rnd" ;
|
||
|
; otherwise use "filscr r,g,b, r,g,b, r,g,b,..." ;
|
||
|
ORG 0
|
||
|
BITS 32
|
||
|
; ---------------------------- ;
|
||
|
points equ END
|
||
|
POINTS_SIZE equ 108
|
||
|
PARAMS_SIZE equ 256
|
||
|
; ---------------------------- ;
|
||
|
MENUET01 db 'MENUET01'
|
||
|
version dd 1
|
||
|
program.start dd START
|
||
|
program.end dd END
|
||
|
program.memory dd END + POINTS_SIZE + PARAMS_SIZE
|
||
|
program.stack dd 0
|
||
|
program.params dd END + POINTS_SIZE
|
||
|
program.path dd 0
|
||
|
; ---------------------------- ;
|
||
|
points_count dd 0
|
||
|
rnd dd 0
|
||
|
; ---------------------------- ;
|
||
|
START:
|
||
|
mov edi, points
|
||
|
mov esi, [program.params]
|
||
|
cmp [esi], dword "rnd"
|
||
|
jne .not_rnd
|
||
|
mov [points_count], dword POINTS_SIZE / 3
|
||
|
mov ecx, POINTS_SIZE / 2
|
||
|
.next_rnd:
|
||
|
rdtsc
|
||
|
xor eax, edx
|
||
|
xor [rnd], eax
|
||
|
imul eax, [rnd], 134775813
|
||
|
add eax, 2531011
|
||
|
mov [rnd], eax
|
||
|
shr eax, 16
|
||
|
mov [edi], ax
|
||
|
inc edi
|
||
|
inc edi
|
||
|
loop .next_rnd
|
||
|
jmp .exit
|
||
|
.not_rnd:
|
||
|
xor ebp, ebp
|
||
|
.next:
|
||
|
.skip_spaces:
|
||
|
cmp [esi], byte " "
|
||
|
jne .spaces_skipped
|
||
|
inc esi
|
||
|
jmp .skip_spaces
|
||
|
.spaces_skipped:
|
||
|
; cmp [esi], byte 0
|
||
|
; je .exit
|
||
|
mov eax, esi
|
||
|
.find_end_or_comma:
|
||
|
cmp [esi], byte ","
|
||
|
je .end_or_comma_found
|
||
|
cmp [esi], byte 0
|
||
|
je .end_or_comma_found
|
||
|
inc esi
|
||
|
jmp .find_end_or_comma
|
||
|
.end_or_comma_found:
|
||
|
; in eax start of number
|
||
|
; in esi pointer to comma or end after number
|
||
|
mov ecx, esi
|
||
|
sub ecx, eax
|
||
|
xor ebx, ebx
|
||
|
cmp cl, 1
|
||
|
jne .cmp2
|
||
|
xor cl, cl
|
||
|
jmp .1
|
||
|
.cmp2:
|
||
|
cmp cl, 2
|
||
|
jne .cmp3
|
||
|
xor cl, cl
|
||
|
jmp .2
|
||
|
.cmp3:
|
||
|
cmp cl, 3
|
||
|
jne .exit
|
||
|
xor cl, cl
|
||
|
.3:
|
||
|
movzx edx, byte[eax + ecx]
|
||
|
sub dl, 48
|
||
|
shl dl, 2
|
||
|
lea edx, [edx * 4 + edx]
|
||
|
lea edx, [edx * 4 + edx]
|
||
|
add bl, dl
|
||
|
inc ecx
|
||
|
.2:
|
||
|
movzx edx, byte[eax + ecx]
|
||
|
sub dl, 48
|
||
|
shl dl, 1
|
||
|
lea edx, [edx * 4 + edx]
|
||
|
add bl, dl
|
||
|
inc ecx
|
||
|
.1:
|
||
|
movzx edx, byte[eax + ecx]
|
||
|
sub dl, 48
|
||
|
add bl, dl
|
||
|
test ebp, ebp
|
||
|
jnz .cmp_next
|
||
|
mov [edi + 2], bl
|
||
|
jmp .putted
|
||
|
.cmp_next:
|
||
|
cmp ebp, 2
|
||
|
jne .cmp_next1
|
||
|
mov [edi - 2], bl
|
||
|
jmp .putted
|
||
|
.cmp_next1:
|
||
|
mov [edi], bl
|
||
|
.putted:
|
||
|
inc ebp
|
||
|
cmp ebp, 3
|
||
|
jne .not_3
|
||
|
xor ebp, ebp
|
||
|
inc dword[points_count]
|
||
|
.not_3:
|
||
|
inc edi
|
||
|
inc esi
|
||
|
jmp .next
|
||
|
.exit:
|
||
|
; width = height = sqrt(points_count)
|
||
|
mov eax, [points_count]
|
||
|
or edx, -1
|
||
|
@@:
|
||
|
add edx, 2
|
||
|
sub eax, edx
|
||
|
jnle @@
|
||
|
sbb edx, -1
|
||
|
shr edx, 1
|
||
|
; set width, height
|
||
|
mov eax, 15
|
||
|
mov ebx, 1
|
||
|
mov ecx, edx
|
||
|
int 64
|
||
|
; set "stretch"
|
||
|
; mov eax, 15
|
||
|
mov ebx, 4
|
||
|
mov ecx, 2
|
||
|
int 64
|
||
|
; put pixels
|
||
|
; mov eax, 15
|
||
|
mov ebx, 5
|
||
|
mov ecx, points ; BBGGRRBBGGRR...
|
||
|
xor edx, edx
|
||
|
mov esi, [points_count] ; size of data = count * 3
|
||
|
lea esi, [esi * 2 + esi]
|
||
|
int 64
|
||
|
; refresh screen
|
||
|
; mov eax, 15
|
||
|
mov ebx, 3
|
||
|
int 64
|
||
|
; thread terminate
|
||
|
mov eax, -1
|
||
|
int 64
|
||
|
END:
|