0,0 → 1,349 |
; Playlist support for MIDPLAY |
LCOLOR equ 0x00ff00 |
PCOLOR equ 0xffffff |
|
PL_X equ 10 shl 16 |
PL_Y equ PLY shl 16 |
PL_XY equ 10 shl 16+PLY |
|
PL_show: |
test [flag],FL_HIDDEN |
jnz .ex |
pusha |
and [counter],0 |
mov ebx,PL_X+255 |
mov eax,13 |
mov ecx,PL_Y-1 shl 16+4+9*LISTITEMS |
xor edx,edx |
int 0x40 |
movzx ecx,byte[list_count] |
test ecx,ecx |
jz .ex2 |
push ecx |
imul ecx,9 |
add ecx,PL_Y-1 shl 16-2 |
mov edx,11+1 shl 29+1 shl 30 |
mov eax,8 |
int 0x40 |
pop ecx |
mov edi,[pl_ptr] |
mov eax,4 |
mov ebx,PL_XY+2 shl 16 |
.sh_loop: |
movzx esi,word[edi] |
and esi,not FL_MULSEL |
add edi,2 |
pusha |
mov edx,edi |
mov ecx,[counter] |
test word[edi-2],FL_MULSEL |
jz .nosel |
pusha |
mov ebx,PL_X+255+1 shl 16-2 |
imul ecx,9 |
shl ecx,16 |
add ecx,PL_Y-1 shl 16+8 |
mov edx,0xc6 |
mov eax,13 |
int 0x40 |
popa |
.nosel: |
pusha |
mov edx,ebx |
mov esi,0xa0a0a0;0x508cec |
mcall 47,0x30000 |
popa |
cmp ecx,[play_num] |
je .high |
mov ecx,LCOLOR |
jmp .int |
.high: |
mov ecx,PCOLOR |
.int: |
add ebx,25 shl 16 |
int 0x40 |
popa |
add edi,esi |
add ebx,9 |
inc [counter] |
loop .sh_loop2 |
jmp .ex2 |
.sh_loop2: |
jmp .sh_loop |
.ex2: |
popa |
test [flag],FL_BOTTRED |
jz .nobott |
pusha |
mcall 7,hdr_raw+12+275*16*3,<275,12>,<10,(WND_HEIGHT-20)> |
mov ebp,main_coo2 |
mov esi,10 shl 16 |
mov edi,(WND_HEIGHT-22)shl 16 |
mov ecx,1 |
pushd 155 shl 16+5 |
pushd (WND_HEIGHT-22) shl 16+5 |
call draw_navigation |
add esp,8 |
popa |
call draw_bottom |
and [flag],not FL_BOTTRED |
.nobott: |
.ex: |
ret |
|
PL_add: |
; in: esi->filename,ecx->fname_len |
jecxz .ex |
cmp [list_count],LISTITEMS |
jae .ex |
pusha |
mov edi,[play_limit] |
mov [edi],cx |
add edi,2 |
rep movsb |
mov [play_limit],edi |
inc [list_count] |
popa |
.ex: |
ret |
|
PL_del: |
movzx ecx,byte[list_count] |
jecxz .ex |
call PL_get1stsel |
mov edx,ebx |
.lp: |
mov edi,esi |
xor eax,eax |
lodsw |
btr eax,15 |
jc .elp2 |
add esi,eax |
jmp .elp |
.elp2: |
push esi ecx |
add esi,eax |
mov ecx,[play_limit] |
sub ecx,esi |
rep movsb |
mov [play_limit],edi |
dec [list_count] |
cmp edx,[play_num] |
ja .no |
dec [play_num] |
.no: |
pop ecx esi |
sub esi,2 |
.elp: |
inc edx |
loop .lp |
.ex: |
ret |
|
PL_getitemclick: |
; out: eax- item # (0..n) |
mov ebx,1 |
mov eax,37 |
int 0x40 |
sub eax,PLY-1 |
mov ebx,9 |
div bl |
movzx eax,al |
ret |
|
PL_getbyindex: |
; in:eax-index, out: esi-filename, ecx-length |
mov esi,[pl_ptr] |
mov ecx,eax |
.loop: |
lodsw |
and eax,not FL_MULSEL |
jecxz .gbi |
add esi,eax |
dec ecx |
jmp .loop |
.gbi: |
movzx ecx,ax |
ret |
|
PL_get1stsel: |
; out: esi- 1st selected, ebx - index |
mov esi,[pl_ptr] |
xor ebx,ebx |
PL_getnextsel: |
push eax ecx |
movzx ecx,[list_count] |
.lp: |
movzx eax,word[esi] |
btr eax,15 |
jc .ex2 |
lea esi,[esi+eax+2] |
inc ebx |
loop .lp |
xor ebx,ebx |
.ex2: |
pop ecx |
.ex: |
pop eax |
ret |
|
PL_clearsel: |
pusha |
mov ebx,not FL_MULSEL |
xor eax,eax |
mov esi,[pl_ptr] |
movzx ecx,[list_count] |
jecxz .flg |
.loop: |
and word[esi],bx |
lodsw |
add esi,eax |
loop .loop |
.flg: |
and [flag],not FL_MULSEL |
popa |
ret |
|
PL_shiftsel: |
pusha |
xor eax,eax |
; mov esi,[pl_ptr] |
; movzx ecx,[list_count] |
.loop: |
lodsw |
or word[esi-2],FL_MULSEL |
add esi,eax |
loop .loop |
jmp PL_clearsel.flg |
|
PL_invsel: |
pusha |
mov ebx,not FL_MULSEL |
xor eax,eax |
mov esi,[pl_ptr] |
movzx ecx,[list_count] |
jecxz .ex |
.loop: |
xor word[esi],FL_MULSEL |
lodsw |
and eax,ebx |
add esi,eax |
loop .loop |
.ex: |
jmp PL_clearsel.flg |
|
PL_load: |
and [list_count],0 |
mov [pl_ptr],playlist |
mov ebx,PL_info |
mov dword[ebx+12],playlist |
mov eax,58 |
int 0x40 |
test eax,eax |
jz .ok1 ; ebx- filesize |
cmp eax,6 |
jne .ex |
.ok1: |
mov eax,0x0a0d |
cmp word[playlist],ax |
je .ok |
sub [pl_ptr],2 |
.ok: |
mov edi,[pl_ptr] |
add ebx,edi |
mov word[ebx],ax |
add edi,2 |
.loo: |
mov edx,edi |
.loo2: |
mov ecx,256 |
repne scasb |
cmp edi,ebx |
jb .ok2 |
lea edi,[ebx+1] |
.ok2: |
mov ecx,edi |
sub ecx,edx |
dec ecx |
inc edi |
jecxz .shift |
mov [edx-2],cx |
inc [list_count] |
cmp edi,ebx |
jb .loo |
.ex1: |
sub ebx,2 |
mov [play_limit],ebx |
.ex: |
ret |
|
.shift: |
mov ecx,ebx |
sub ecx,edi |
jecxz .ex1 |
sub ebx,2 |
mov esi,edi |
sub edi,2 |
push edi |
rep movsb |
pop edi |
jmp .loo |
|
PL_save: |
movzx ecx,byte[list_count] |
jecxz .ex |
mov eax,0x0a0d |
mov edi,[pl_ptr] |
lea edx,[edi+2] |
mov [PL_info+12],edx |
.savl: |
movzx ebx,word[edi] |
and bx,not FL_MULSEL |
stosw |
add edi,ebx |
loop .savl |
stosw |
sub edi,[pl_ptr] |
mov ebx,PL_info |
mov [ebx+8],edi |
mov dword[ebx],1 |
mov eax,58 |
int 0x40 |
.ex: |
ret |
|
PL_swap: ; swap [ebx] with [ebx+1] |
mov eax,ebx |
call PL_getbyindex |
add ecx,2 |
sub esi,2 |
push ecx esi ; save begin & length of 1st fname |
mov edi,fnbuf |
rep movsb |
movzx ecx,word[esi] |
and cx,not FL_MULSEL |
add ecx,2 |
pop edi |
rep movsb |
pop ecx |
mov esi,fnbuf |
rep movsb |
cmp ebx,[play_num] |
jne .nosel1 |
inc [play_num] |
ret |
.nosel1: |
inc ebx |
cmp ebx,[play_num] |
jne .nosel2 |
dec [play_num] |
.nosel2: |
ret |
|
PL_info: |
.mode dd 0 |
dd 0 |
.bytes dd 20 |
dd 0 |
dd hash_table |
db PLAYLIST_PATH,0 |