kolibrios/programs/system/skinsel/skinsel.asm

102 lines
2.1 KiB
NASM

include '..\..\macros.inc'
use32
db 'MENUET01'
dd 1
dd start
dd i_end
dd mem, mem
dd 0, 0
start:
push 70
pop eax
mov ebx, fileinfo
mcall
cmp ebx, max_file_size
jz exit
cmp ebx, -1
jnz @f
exit:
or eax, -1
mcall
@@:
mov esi, filebuf
xor ecx, ecx
scan1l1:
or edi, -1
scan1:
inc edi
lodsb
test al, al
jz scan1done
cmp al, 13
jz newline
cmp al, 10
jnz scan1
newline:
test edi, edi
jz scan1l1
inc ecx
jmp scan1l1
scan1done:
test edi, edi
jz @f
inc ecx
@@:
jecxz exit
push 3
pop eax
mcall
ror eax, 16
mov edx, 1024
@@:
sub eax, 0x43ab45b5
ror eax, 1
xor eax, 0x32c4324f
ror eax, 1
dec edx
jnz @b
div ecx
; use edx as random index
mov esi, filebuf
scan2l1:
push esi
or edi, -1
scan2:
inc edi
lodsb
test al, al
jz newline2
cmp al, 13
jz newline2
cmp al, 10
jnz scan2
newline2:
pop eax
test edi, edi
jz scan2l1
dec edx
jns scan2l1
mov byte [esi-1], 0
; set eax (-> ASCIIZ string) as skin
mov ecx, eax
push 48
pop eax
mov bl, 8
mcall
jmp exit
fileinfo:
dd 0
dq 0
dd max_file_size
dd filebuf
db '/sys/skinsel.dat',0
i_end:
max_file_size = 0x1000 - 0x40 - $
filebuf:
rb max_file_size
; stack
rb 0x40
mem: