; 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: