key_codes db 27,182,109,115,114,122,98,118,108,120,99,13,8,32,0, 0, 0,0 db 180,181,93,91 ; bottom actions db 0, 0, 0, 0, 0,185,0, 0, 0, 0,0,0,92 btn_codes db 1, 0, 0, 9, 10, 3, 7, 6, 8, 4, 5, 0,0, 0,101,100,11,2 db 0, 0, 0, 0 ; bottom actions db 35,49,48,37,31,32,41,42,40,36,103,104,0 jmps dw _close, kDel,kMute, bList.shuf, bList.repe, bList.prev, bList.next dw bList.stop, kLoad, Xpress, Rewind.space, auto_load,Rewind, Rewind.space dw bReverse, bShade, bList, bBar, bOctU, bOctD, bSelTrack, bSelChannel ; bottom actions dw kDel,bLsave,bLload,bRemAll,bAdd,bAddDir,bSelZero,bInvSel,bSelAll,bRemCrop dw bMinimize,bAbout,bResetTrk jmps_end: key: mov eax,2 int 0x40 mov edi,key_codes cmp ah,48 jb .jump cmp ah,57 ja .jump sub ah,48 mov byte[channel],ah jmp midi_kill .jump: mov ecx,(jmps_end-jmps)/2 mov ebx,edi shr eax,8 repne scasb jne play_.noplsel sub edi,ebx jmp word[jmps+edi*2-2] kDel: call PL_del call PL_show jmp still kMute: xor [flag],FL_MUTE jmp still kLoad: ; dps 'Load' cmp [list_count],LISTITEMS jbe noparam jmp still Xpress: mov eax,IPC_PLAY call ipc_send jmp still;Rewind.space auto_load: call PL_get1stsel mov eax,ebx play_: mov [play_num],eax call PL_getbyindex mov edi,filename;fnbuf rep movsb xor eax,eax mov byte[edi],al and [flag],not FL_ADD or [flag],FL_PLAY jmp open_file .noplsel: call PL_get1stsel test ebx,ebx jz .noupward cmp al,178 jne .noupa .seldec: dec ebx;[listsel] .listdraw: call PL_clearsel mov eax,ebx call PL_getbyindex or word[esi-2],FL_MULSEL call PL_show jmp still .noupa: cmp al,184 jne .noupward dec [listsel] .swap: dec ebx call PL_swap jmp .listdraw .noupward: inc ebx cmp bl,[list_count] jae still cmp al,177 je .listdraw .nodowna: cmp al,183 jne still inc [listsel] jmp .swap Rewind: push [midi_limit] pop [cur_ptr] and [cur_tick],0 jmp red .space: cmp [tick_count],0 jz still mov eax,IPC_TRIG call ipc_send jmp red button: mov eax,17 int 0x40 cmp ah,20 jb .nobott cmp ah,25 ja .nobott sub ah,20 mov [popup],ah .sh: or [flag],FL_BOTTRED call PL_show jmp still .nobott: cmp ah,31 jb .nopop cmp ah,50 ja .nopop mov [popup],-1 or [flag],FL_BOTTRED call PL_show SH_POPUP equ 10 if SH_POPUP eq 1 mov ebx,eax shr ebx,8 dps 'Popup#=' dpd ebx jmp .sh end if .nopop: mov edi,btn_codes jmp key.jump bReverse: xor [flag],FL_REVERSE call draw_bar jmp still _close: call kill or eax,-1 int 0x40 bShade: call Shade jmp still Shade: xor [flag],FL_HIDDEN test [flag],FL_HIDDEN jz .open mov esi,14 mov [coo],main_coo2 jmp .op .open: mov esi,WND_HEIGHT mov [coo],main_coo .op: mov ebx,-1 mov ecx,ebx mov edx,ebx mov eax,67 int 0x40 ret bMinimize: ; mcall 18,10 jmp still bList: mov [popup],-1 mov edx,[listsel] call PL_getitemclick mov [listsel],eax mcall 66,3 mov ebx,eax ; dph ebx test ebx,1100b jnz .mul call PL_clearsel test ebx,11b jz .skipor mov ecx,[listsel] mov [listsel],edx cmp ecx,edx je .skipor ja .above xchg ecx,edx .above: sub ecx,edx inc ecx mov eax,edx push ecx call PL_getbyindex sub esi,2 pop ecx call PL_shiftsel jmp .plsh .mul: bts [flag],15 jc .skipor mov eax,edx call PL_getbyindex or word[esi-2],FL_MULSEL .skipor: mov eax,[listsel] call PL_getbyindex xor word[esi-2],FL_MULSEL .plsh: call PL_show mcall 40,111b mcall 23,30 push eax mcall 40,1000111b pop eax cmp eax,3 jne still mcall 17 cmp ah,11 jne still call PL_getitemclick cmp eax,[listsel] je auto_load mov [listsel],eax call PL_show jmp still .repe: xor [flag],FL_REPEAT jmp red .stop: mov eax,IPC_PAUS call ipc_send jmp Rewind .shuf: xor [flag],FL_SHUFFLE jmp red .prev: mov eax,[play_num] test eax,eax jz still dec eax jmp play_ .next: mov eax,[play_num] inc eax cmp al,[list_count] jae still jmp play_ bBar: cmp [tick_count],0 jz still mov eax,37 mov ebx,1 int 0x40 mov ebp,[coo] sub eax,[ebp-16] shr eax,16 mov ebx,[tick_count] mul ebx mov ebx,[ebp-20] div ebx mov ebx,eax ; ebx - selected tick xor ecx,ecx mov esi,[midi_limit] .further: lodsw and eax,0x7f add ecx,eax cmp ecx,ebx jb .further sub ecx,eax mov [cur_tick],ecx sub esi,2 mov [cur_ptr],esi drw: jmp red OCT_CH equ 3 bOctU: add [octave],OCT_CH jmp midi_kill bOctD: sub [octave],OCT_CH jmp midi_kill bSelChannel: call get_num cmp eax,-1 je still dps <13,10,'Channel#'> dpd eax mov [channel],eax jmp midi_kill bSelTrack: call get_num cmp eax,-1 je still dps <13,10,'Track#'> dpd eax mov [sel_track],al jmp midi_kill bResetTrk: xor eax,eax mov [sel_track],al mov [channel],eax dps <13,10,'Both track & channel are 0',13,10> jmp midi_kill bLsave: call PL_save bLload: call PL_load jmp red bRemAll: and [list_count],0 mov [play_limit],playlist-2 jmp red bAdd: movzx eax,[list_count] dpd eax call fopen mov edi,filename cmp byte[edi],0 jz still call str_len xchg eax,ecx mov esi,edi jmp add_song bAddDir: call fopen mov edi,filename cmp byte[edi],0 jz still call find_slash lea edx,[edi-filename+fnbuf] ; edx -> '/' and byte[edi],0 mov esi,filename mov edi,fnbuf mov ecx,1024/4 rep movsd and dword [dir_info+4], 0 .nxt2: mcall 70, dir_info cmp ebx, 1 jnz red ;still test byte [dir_table+32], 11000b ; exclude directories & vol label jnz .no mov edi, dir_table+32+40 mov esi, edi xor eax, eax or ecx, -1 repnz scasb mov eax, [edi-5] or eax, 0x20202000 cmp eax, '.mid' jz .ok cmp eax, '.kar' jnz .no .ok: lea ecx, [edi-dir_table-32-40-1] mov edi, edx rep movsb mov ecx, edi mov esi, fnbuf sub ecx, esi call PL_add .no: inc dword [dir_info+4] jmp .nxt2 bSelZero: call PL_clearsel jmp red bInvSel: call PL_invsel jmp red bSelAll: call PL_clearsel call PL_invsel jmp red bRemCrop: call PL_invsel call PL_del jmp bSelAll bAbout: mov edx,about1 call debug_outstr jmp still get_num: ; out: eax-number entered or [flag],FL_LOCK mcall 10 dpd eax cmp eax,1 jne .nored call draw_window jmp get_num .nored: cmp eax,2 jne .nokey mcall 2 movzx eax,ah sub eax,'0' jl .none cmp eax,9 jbe .ok .none: mov eax,-1 .ok: and [flag],not FL_LOCK ret .nokey: cmp eax,3 jne get_num mcall 17 jmp get_num find_slash: ; in: edi-filename, out: edi-slash ptr-1 push eax ecx call str_len mov ecx,eax std add edi,eax mov al,'/' repne scasb cld add edi,2 pop ecx eax ret