diff --git a/programs/media/aspapi.INC b/programs/media/aspapi.INC deleted file mode 100644 index 3e553b9da4..0000000000 --- a/programs/media/aspapi.INC +++ /dev/null @@ -1,180 +0,0 @@ -include '../../proc32.inc' - -macro start_draw_window x,y,xsize,ysize,areacolor,caption;,capsize -{ - ;pusha - mov eax, 12 ; function 12:tell os about windowdraw - mov ebx, 1 ; 1, start of draw - int 0x40 - ; DRAW WINDOW - mov eax, 0 ; function 0 : define and draw window - mov ebx, x*65536+xsize ; [x start] *65536 + [x size] - mov ecx, y*65536+ysize ; [y start] *65536 + [y size] - mov edx, areacolor ; color of work area RRGGBB - or edx, 0x34000000 - mov edi, caption -; mov esi, 0x00334455 ; color of grab bar RRGGBB -; mov edi, 0x00ddeeff ; color of frames RRGGBB - int 0x40 - ;popa -} - -macro end_draw_window -{ - mov eax, 12 ; end of redraw - mov ebx, 2 - int 0x40 -} - -macro change_window_place_size x,y,xsize,ysize -{ - mov eax, 67 ; function 67 : replace and/or resize window - mov ebx, x - mov ecx, y - mov edx, xsize - mov esi, ysize - int 0x40 -} - -proc draw_button stdcall, x:dword, y:dword, xsize:dword, ysize:dword, \ - id:dword, butcolor:dword, text:dword, textlen:byte, textcolor:dword - - pusha - mov ebx, dword [x] - shl ebx, 16 - add ebx, dword [xsize] ; [x start] *65536 + [x size] - - mov ecx, dword [y] - shl ecx, 16 - add ecx, dword [ysize] ; [y start] *65536 + [y size] - - mov edx, dword [id] ; button id - mov esi, dword [butcolor] ; button color RRGGBB - mov eax, 8 ; function 8 : define and draw button - int 0x40 - - mov ebx, dword [x] - add ebx, 5 - shl ebx, 16 - mov eax, dword [ysize] - sub eax, 5 - shr eax, 1 - add ebx, eax - add ebx, dword [y] ;mov ebx, (x+5)*65536+y+(ysize-5)/2 ; Draw button text - - mov ecx, dword [textcolor] - mov edx, dword [text] - xor eax, eax - mov al, byte [textlen] - mov esi, eax - mov eax, 4 - int 0x40 - popa -ret -endp - -;macro outtextxy x,y,prompt,prompt_len,color -;{ -proc outtextxy stdcall, x:dword, y:dword, prompt:dword, prompt_len:dword, color:dword - pusha - mov eax, 4 - mov ebx, dword [x] ; draw info text with function 4 - shl ebx, 16 - or ebx, dword [y] - mov ecx, dword [color] - mov edx, dword [prompt] - mov esi, dword [prompt_len] - int 0x40 - popa -ret -endp -;} - -proc bar x:dword, y:dword, xsize:dword, ysize:dword, color:dword -;macro bar x, y, xsize, ysize, color -;{ - pusha - mov eax, 13 - mov ebx, [x] - shl ebx, 16 - add ebx, [xsize] - mov ecx, [y] - shl ecx, 16 - add ecx, [ysize] - mov edx, [color] - ;mov ebx, x*65536+xsize - ;mov ecx, y*65536+ysize - ;mov edx, color - - int 0x40 - popa -ret -endp -;} - - -proc line x1:dword, y1:dword, x2:dword, y2:dword, color:dword -;macro line x1,y1,x2,y2,color -;{ - pusha - mov eax, 38 -; mov ebx, x1*65536+x2 -; mov ecx, y1*65536+y2 - mov ebx, [x1] - shl ebx, 16 - add ebx, [x2] - mov ecx, [y1] - shl ecx, 16 - add ecx, [y2] - - mov edx, [color] - int 0x40 - popa -ret -endp -;} - - -;macro rectangle x,y,xsize,ysize,color -;{ -; x2=x+xsize -; y2=y+ysize -; line x,y,x2,y,color -; line x,y,x,y2,color -; line x,y2,x2,y2,color -; line x2,y,x2,y2,color -;} - -proc rectangle x:dword, y:dword, xsize:dword, ysize:dword, color:dword - pusha - mov eax, [x] - mov ebx, eax - add ebx, [xsize] - mov ecx, [y] - mov edx, ecx - add edx, [ysize] - mov edi, [color] - - stdcall line, eax,ecx,ebx,ecx,edi - stdcall line, eax,ecx,eax,edx,edi - stdcall line, eax,edx,ebx,edx,edi - stdcall line, ebx,ecx,ebx,edx,edi - popa -ret -endp - - -proc putpixel stdcall, x:dword, y:dword, color:dword -;macro putpixel x,y,color -;{ - pusha - mov eax, 1 - mov ebx, [x] ;x - mov ecx, [y] ;y - mov edx, [color] ;color - int 0x40 - popa -ret -endp -;} - diff --git a/programs/media/infinity_mixer.ASM b/programs/media/infinity_mixer.ASM deleted file mode 100644 index 6e8f6134e0..0000000000 --- a/programs/media/infinity_mixer.ASM +++ /dev/null @@ -1,609 +0,0 @@ -; -; KolibriOS system mixer. Version 0.2 -; -; Author: Asper -; Date of issue: 15.08.2010 -; Compiler: FASM -; Target: KolibriOS -; - -use32 - org 0x0 - - db 'MENUET01' ; 8 byte id - dd 38 ; required os - dd STARTAPP ; program start - dd I_END ; program image size - dd I_MEM ; required amount of memory - dd I_MEM ; stack heap - dd 0x0, 0x0 - -include 'aspAPI.inc' -include '../../macros.inc' -;include 'string.inc' - - -;include 'debug.inc' - -DEBUG equ 0 ;1 - -SRV_GETVERSION equ 0 -DEV_PLAY equ 1 -DEV_STOP equ 2 -DEV_CALLBACK equ 3 -DEV_SET_BUFF equ 4 -DEV_NOTIFY equ 5 -DEV_SET_MASTERVOL equ 6 -DEV_GET_MASTERVOL equ 7 -DEV_GET_INFO equ 8 - - -;C_UNKNOWN equ ? -C_BLACK equ 0x000000 -C_GREY equ 0xB0B0B0 ; 0xC0C0C0 -C_BLUE equ 0x1070D0 -C_GREEN equ 0x70D010 -C_RED equ 0xD01010 -C_ORANGE equ 0xD07010 -C_YELLOW equ 0xE0E010 -C_PURPLE equ 0x7010D0 -C_PINK equ 0xFF00FF -;C_RESERVED equ ? -C_WHITE equ 0xFFFFFF -;C_OTHER equ ? - - -C_KEYCOLOR1 equ 0x0050D250 ; Control button color 1 -C_KEYCOLOR2 equ 0x00CBE1E1 ; Control button color 2 -C_TEXTCOLOR equ 0x80000000 ; Button caption color -BUT_W equ 20 -BUT_H equ 20 -;WIN_X equ 30000 ; I hope nobody has screen -;WIN_Y equ 30000 ; with such a big resolution :) -WIN_W equ 250;390 -WIN_H equ 180 -WIN_COLOR equ 0x505050 ;0x0099BB -WIN_X_CENTER equ WIN_W/2 - -FIRST_CTRL_BUTTON_ID equ 7 -MAX_CONTROLS_NUM equ 15 ; Bad bounding :/ - -struc CONTROL -{ - .level dw ? - .num_steps dw ? -} - -; widget node for parsing -;struc HDA_GNODE -;{ -; .nid dw ? ;NID of this widget -; .nconns dw ? ;number of input connections -; .conn_list dd ? -; .slist dw ? ;temporay list -; dw ? -; -; .wid_caps dd ? ;widget capabilities -; .type db ? ;widget type -; .pin_ctl db ? ;pin controls -; .checked db ? ;the flag indicates that the node is already parsed -; .pin_caps dd ? ;pin widget capabilities -; .def_cfg dd ? ;default configuration -; .amp_out_caps dd ? ;AMP out capabilities -; .amp_in_caps dd ? ;AMP in capabilities -; .next dd ? ; struct list_head list -; .sizeof: -;} - -;virtual at 0 -; HDA_GNODE HDA_GNODE -;end virtual - -STARTAPP: - ; Initialize memory -; mcall 68, 11 -; or eax,eax -; jz close_app - - - ; Load sound system driver - mov eax, 68 - mov ebx, 16 - mov ecx, drivername - int 0x40 - mov [hDriver], eax - test eax, eax - jnz @f -loaderr: - if DEBUG - print "Can't load driver" - end if - jmp close_app - @@: - mov [is_hda], 1 - call GetDriverVer - mov eax, [driver_ver] - cmp ax, 0x11DA - je @f - mov [is_hda], 0 - @@: - cmp [is_hda], 0 - je .init_ac97_controls - ; Init volume controls - stdcall GetMasterVol, 0 - mov ebx, eax - mov [LVolume.level], ax - shr eax, 16 - mov [LVolume.num_steps], ax - stdcall GetMasterVol, 1 - mov [RVolume.level], ax - shr eax, 16 - mov [RVolume.num_steps], ax - jmp .controls_init_complete - ; Asper: temporary workaround on ac97 codecs [ - .init_ac97_controls: ;jmp @f - mov [is_hda], 0 - mov [LVolume.num_steps], 31 - mov [RVolume.num_steps], 31 - mov ax, [LVolume.level] - call convert_ac97_volume_to_level - mov [LVolume.level], ax - mov [RVolume.level], ax - ; Asper: temporary workaround on ac97 codecs ] - .controls_init_complete: - if DEBUG - print "Left level" - movzx eax, [LVolume.level] - dph eax - newline - print "Left num_steps" - movzx eax, [LVolume.num_steps] - dph eax - newline - print "Right level" - movzx eax, [RVolume.level] - dph eax - newline - print "Right num_steps" - movzx eax, [RVolume.num_steps] - dph eax - newline - end if - - mcall 66, 1, 1 ; Set keyboard mode to get scancodes. - - mcall 37,0 - mov cx,ax - shl ecx,16 - mov cx,WIN_H - mov ebx,eax - mov bx,WIN_W - -red: - call draw_window - -still: - mcall 10 ; Wait for an event in the queue. - - cmp al,1 ; redraw request ? - jz red - cmp al,2 ; key in buffer ? - jz key - cmp al,3 ; button in buffer ? - jz button - - jmp still - -key: - mcall 2 - - cmp ah, 1 ;Esc - je close_app - -; cmp ah, 5 ; '4' -; jne @f -; stdcall GetMasterVol, 0 -; jmp still -; @@: -; -; cmp ah, 6 ; '5' -; jne @f -; stdcall GetMasterVol, 1 -; jmp still -; @@: - -; cmp ah, 8 ; '7' -; jne @f -; call GetDriverVer -; jmp still -; @@: - - ;Left channel Up - cmp ah, 71 ; 'Home' - jne @f - movzx eax, [LVolume.level] - inc ax - cmp ax, [LVolume.num_steps] - jg still - mov [LVolume.level], ax - call convert_level_to_ac97_volume ;Asper: temporary workaround on ac97 - stdcall SetMasterVol, 0, eax - jmp red - @@: - - ;Left channel Down - cmp ah, 79 ; 'End' - jne @f - movzx eax, [LVolume.level] - dec ax - cmp ax, 0 - jl still - mov [LVolume.level], ax - call convert_level_to_ac97_volume ;Asper: temporary workaround on ac97 - stdcall SetMasterVol, 0, eax - jmp red - @@: - - ;Right channel Up - cmp ah, 73 ; 'PageUp' - jne @f - movzx eax, [RVolume.level] - inc ax - cmp ax, [RVolume.num_steps] - jg still - mov [RVolume.level], ax - call convert_level_to_ac97_volume ;Asper: temporary workaround on ac97 - movzx edx, [is_hda] - stdcall SetMasterVol, edx, eax - jmp red - @@: - - ;Right channel Down - cmp ah, 81 ; 'PageDown' - jne @f - movzx eax, [RVolume.level] - dec ax - cmp ax, 0 - jl still - mov [RVolume.level], ax - call convert_level_to_ac97_volume ;Asper: temporary workaround on ac97 - .RVdown: - movzx edx, [is_hda] - stdcall SetMasterVol, edx, eax - jmp red - @@: - - jmp still - -button: - mcall 17 ; Get pressed button code - cmp ah, 1 ; Test x button - je close_app - jmp still - - -draw_window: - ;start_draw_window WIN_X,WIN_Y,WIN_W,WIN_H,WIN_COLOR,caption;, 12;labellen-labelt - mcall 0,,,34000000h+WIN_COLOR,,caption - - - stdcall draw_button, WIN_X_CENTER-BUT_W-55, 30+BUT_H*0,BUT_W,BUT_H,2,C_PINK,aNoText,0,0 - stdcall draw_button, WIN_X_CENTER-BUT_W-55, 30+BUT_H*1+10,BUT_W,BUT_H,3,C_GREEN,aNoText,0,0 - stdcall draw_button, WIN_X_CENTER-BUT_W-55, 30+BUT_H*2+20,BUT_W,BUT_H,4,C_BLUE,aNoText,0,0 - - stdcall draw_button, WIN_X_CENTER-BUT_W/2+55, 30+BUT_H*0,BUT_W,BUT_H,5,C_GREY,aNoText,0,0 - stdcall draw_button, WIN_X_CENTER-BUT_W/2+55, 30+BUT_H*1+10,BUT_W,BUT_H,6,C_BLACK,aNoText,0,0 - stdcall draw_button, WIN_X_CENTER-BUT_W/2+55, 30+BUT_H*2+20,BUT_W,BUT_H,7,C_ORANGE,aNoText,0,0 - - movzx eax, [LVolume.level] - movzx edx, [LVolume.num_steps] - stdcall draw_volume_control, WIN_X_CENTER-BUT_W-25, 20, 110, aLVolume, C_BLACK, eax, edx - movzx eax, [RVolume.level] - movzx edx, [RVolume.num_steps] - stdcall draw_volume_control, WIN_X_CENTER+25, 20, 110, aRVolume, C_BLACK, eax, edx - - stdcall rectangle, WIN_X_CENTER-BUT_W-56, 29+BUT_H*0, BUT_W+2, BUT_H+2, C_BLACK - stdcall rectangle, WIN_X_CENTER-BUT_W-56, 29+BUT_H*1+10, BUT_W+2, BUT_H+2, C_BLACK - stdcall rectangle, WIN_X_CENTER-BUT_W-56, 29+BUT_H*2+20, BUT_W+2, BUT_H+2, C_BLACK - - stdcall rectangle, WIN_X_CENTER-BUT_W/2+54, 29+BUT_H*0, BUT_W+2, BUT_H+2, C_BLACK - stdcall rectangle, WIN_X_CENTER-BUT_W/2+54, 29+BUT_H*1+10, BUT_W+2, BUT_H+2, C_GREEN - stdcall rectangle, WIN_X_CENTER-BUT_W/2+54, 29+BUT_H*2+20, BUT_W+2, BUT_H+2, C_BLACK - - stdcall rectangle, WIN_X_CENTER-BUT_W-57, 28+BUT_H*0, BUT_W+4, BUT_H+4, C_PINK - stdcall rectangle, WIN_X_CENTER-BUT_W-57, 28+BUT_H*1+10, BUT_W+4, BUT_H+4, C_GREEN - stdcall rectangle, WIN_X_CENTER-BUT_W-57, 28+BUT_H*2+20, BUT_W+4, BUT_H+4, C_BLUE - - stdcall rectangle, WIN_X_CENTER-BUT_W/2+53, 28+BUT_H*0, BUT_W+4, BUT_H+4, C_GREY - stdcall rectangle, WIN_X_CENTER-BUT_W/2+53, 28+BUT_H*1+10, BUT_W+4, BUT_H+4, C_BLACK; - stdcall rectangle, WIN_X_CENTER-BUT_W/2+53, 28+BUT_H*2+20, BUT_W+4, BUT_H+4, C_ORANGE - - - end_draw_window -ret - - - -proc draw_volume_control stdcall, x:dword, y:dword, ysize:dword, name:dword, textcolor:dword, step:dword, max_steps:dword - mov ebx, [x] - mov edx, [y] - mov eax, [ysize] - stdcall bar, ebx, edx, 10, eax, C_GREEN - mov ecx, [max_steps] - cmp ecx, [step] - je .l2 - - push eax edx - mov cl, byte [max_steps] - test cl, cl - jnz @f - mov ecx, [ysize] - jmp .l1 - @@: - div cl - mov cl, byte [step] - mul cl - mov ecx, [ysize] - sub ecx, eax - .l1: - pop edx eax - stdcall bar, ebx, edx, 10, ecx, C_RED - .l2: - dec ebx - dec edx - inc eax - stdcall rectangle, ebx, edx, 11, eax, C_BLACK - - - add edx, eax - add edx, 10 - sub ebx, 8 - stdcall outtextxy, ebx, edx, [name], 0, C_GREEN or 0x80000000 - ret -endp - -;____________________________________ -GetDriverVer: - push ebx ecx - mov [ioctl_code], SRV_GETVERSION - and [inp_size], 0 - mov [outp_size], 4 - mov [output], driver_ver - mcall 68,17,ioctl - test eax, eax - jnz loaderr - if DEBUG - push eax - dps "1.) Driver version = " - dph [driver_ver] - newline - pop eax - end if - pop ecx ebx -ret - -;____________________________________ -Stop: - and [ioctl_code], DEV_STOP - and [inp_size], 4 - mov [input], 0 ;? stream - mov [outp_size], 0 - mov [output], 0 - mcall 68,17,ioctl - test eax, eax - jnz loaderr - if DEBUG - print "Stop device" - end if -ret - -;____________________________________ -proc GetMasterVol stdcall, channel:dword - push ebx ecx - mov [ioctl_code], DEV_GET_MASTERVOL - mov [inp_size], 1 - mov eax, [channel] - mov [input], eax - mov [outp_size], 4 - mov [output], master_vol - mcall 68,17,ioctl - if DEBUG - push eax - dps "Get Master volume = " - dph [master_vol] - newline - pop eax - end if - mov eax, [master_vol] - pop ecx ebx -ret -endp -;____________________________________ -proc SetMasterVol stdcall, channel:dword, val:dword - push ebx ecx - mov [ioctl_code], DEV_SET_MASTERVOL - mov [inp_size], 4 - mov eax, [channel] - shl eax, 24 - or eax, [val] - mov [master_vol], eax - mov [input], master_vol - mov [outp_size], 0 - mcall 68,17,ioctl - if DEBUG - push eax - dps "Set Master volume = " - dph [val] - dps " ch = " - dph [channel] - newline - pop eax - end if - pop ecx ebx -ret -endp - -;____________________________________ -;GetDevInfo: ; Get pins configurations or controls -; mov [ioctl_code], DEV_GET_INFO -; and [inp_size], 0 -; mov [outp_size], 9*4 -; mov [output], ctrl_info -; mcall 68,17,ioctl -; if DEBUG -; push eax -; print "CTRL_INFO" -; dps ".pci_cmd = " -; dph [ctrl_info] -; newline -; dps ".irq = " -; dph [ctrl_info+4] -; newline -; ;dps ".glob_cntrl = " -; dps ".VIA_REG_OFFSET_CONTROL = " -; dph [ctrl_info+8] -; newline -; ;dps ".glob_sta = " -; dps ".VIA_REG_OFFSET_STATUS = " -; dph [ctrl_info+12] -; newline -; ;dps ".codec_io_base = " -; dps ".VIA_REG_OFFSET_TABLE_PTR = " -; dph [ctrl_info+16] -; newline -; dps ".ctrl_io_base = " -; dph [ctrl_info+20] -; newline -; ;dps ".codec_mem_base = " -; dps ".VIA_REG_OFFSET_STOP_IDX = " -; dph [ctrl_info+24] -; newline -; ;dps ".ctrl_mem_base = " -; dps ".VIA_REG_OFFSET_CURR_COUNT = " -; dph [ctrl_info+28] -; newline -; dps ".codec_id = " -; dph [ctrl_info+32] -; newline -; pop eax -; end if -;ret - - -convert_level_to_ac97_volume: - push ebx ecx edx - cmp [is_hda], 0 - jne .not_ac97 - - mov [LVolume.level], ax - mov [RVolume.level], ax - - mov bx, ax - mov ax, [LVolume.num_steps] - sub ax, bx - mov cx, 150 - mul cx - neg eax - .not_ac97: - pop edx ecx ebx -ret - - -convert_ac97_volume_to_level: - push ebx ecx edx - cmp [is_hda], 0 - jne .not_ac97 - - neg eax - mov cx, 150 - div cx - mov bx, ax - mov ax, [LVolume.num_steps] - sub ax, bx - .not_ac97: - pop edx ecx ebx -ret - - -close_app: - or eax, -1 - int 0x40 -;____________________________________ -caption db 'Sound Mixer',0 -drivername db 'SOUND',0 - -;aRamdisk db '/rd/1/',0 - -;aStartDriver db 'Start driver',0 -;aStop db 'Stop',0 -;aGetMVol db 'Get Master Volume',0 -;aSetMVol db 'Set Master Volume',0 -;aGetDevInfo db 'Get device info',0 -aNoText db 0 - -aLVolume db 'Left',0 -aRVolume db 'Right',0 - -; Jack types -;aLineOut db 'Line Out',0 -;aSpeaker db 'Speaker',0 -;aHPOut db 'HP Out',0 -;aSideSpk db '',0 -;aCD db 'CD',0 -;aSPDIFOut db 'SPDIF Out',0 -;aDigitalOut db 'Digital Out',0 -;aModemLine db 'Modem Line',0 -;aModemHand db 'Modem Hand',0 -;aLineIn db 'Line In',0 -;aAUX db 'AUX',0 -;aMic db 'Mic',0 -;aTelephony db 'Telephony',0 -;aSPDIFIn db 'SPDIF In',0 -;aDigitalIn db 'Digital In',0 -;aReserved db 'Reserved',0 -;aOther db 'Other',0 - -;Jack locations -;base -;aNA db 'N/A',0 -;aRear db 'Rear',0 -;aFront db 'Front',0 -;aLeft db 'Left',0 -;aRight db 'Right',0 -;aTop db 'Top',0 -;aBottom db 'Bottom',0 -;special -;aRearPanel db 'Rear Panel',0 -;aDriveBar db 'Drive Bar',0 -;aRiser db 'Riser',0 -;aHDMI db 'HDMI',0 -;aATAPI db 'ATAPI',0 -;aMobileIn db 'Mobile-In',0 -;aMobileOut db 'Mobile-Out',0 - - -I_END: - -align 4 -ioctl: -hDriver rd 1 -ioctl_code rd 1 -input rd 1 -inp_size rd 1 -output rd 1 -outp_size rd 1 - -driver_ver rd 1 -master_vol rd 1 - -;ctrl_info rd 9 - -is_hda rb 1 - -LVolume CONTROL -RVolume CONTROL - -align 4 -rb 2048 ; stack -I_MEM: - diff --git a/programs/media/string.INC b/programs/media/string.INC deleted file mode 100644 index 8db2f5d4ab..0000000000 --- a/programs/media/string.INC +++ /dev/null @@ -1,94 +0,0 @@ -;**************************************** -;* input: esi = pointer to string * -;* output: ecx = length of the string * -;**************************************** -strlen: - push eax esi - xor ecx, ecx - @@: - lodsb - or al, al - jz @f - inc ecx - jmp @b - @@: - pop esi eax - ret - -;************************************************* -;* input: esi = pointer to the src string * -;* edi = pointer to the dest string * -;* ecx = number of bytes to copy * -;************************************************* -strncpy: - push eax ecx esi edi - @@: - lodsb - stosb - or al, al - jz @f - dec ecx - jz @f - jmp @b - @@: - pop edi esi ecx eax - ret - -;************************************************* -;* input: esi = pointer to the src string * -;* edi = pointer to the dest string * -;************************************************* -strcpy: - push esi edi - rep movsb - pop edi esi - ret - -;************************************************* -;* input: esi = pointer to the src string * -;* edi = pointer to the dest string * -;************************************************* -strcat: - push esi - call strlen - add esi, ecx - call strcpy - pop esi - ret - -;************************************************* -;* input: esi = pointer to the src string * -;* edi = pointer to the dest string * -;* ecx = number of bytes to copy * -;************************************************* -strncat: - push edi - push ecx esi - mov esi, edi - call strlen - add edi, ecx - pop esi ecx - call strncpy - pop edi - ret - -;************************************************* -;* input: edi = pointer to the dest string * -;* al = byte to set the string to * -;************************************************* -;strset: -; push edi -; rep stosb -; pop edi -; ret - -;************************************************* -;* input: edi = pointer to the dest string * -;* al = byte to set the string to * -;* ecx = number of bytes to set * -;************************************************* -strnset: - push edi ecx - repe stosb - pop ecx edi - ret