struct TBOX x dw ? width dw ? y dw ? height dw ? sel.x db ? pos.x db ? ofs.x db ? length db ? text rb 255 ends virtual at ebp tbox TBOX end virtual tb.pos.x db ? tb.sel.x db ? tb.sel.selected db ? func textbox.get_width push ebx edx movzx eax,[tbox.width-2] add eax,-6 xor edx,edx mov ebx,6 div ebx movzx ebx,[tbox.length] cmp eax,ebx jle @f mov eax,ebx @@: pop edx ebx ret endf func textbox.delete_selection cmp [tb.sel.selected],0 je .exit.2 pushad movzx ecx,[tbox.length] sub cl,[tb.sel.x] lea eax,[tbox.text] movzx esi,[tb.pos.x] movzx edi,[tb.sel.x] add esi,eax add edi,eax mov eax,esi sub eax,edi sub [tbox.length],al cld rep movsb .exit: mov al,[tb.sel.x] mov [tbox.pos.x],al mov [tbox.sel.x],al popad clc ret .exit.2: stc ret endf func textbox.draw ; TBOX* ebp call textbox.get_width movzx ebx,[tbox.pos.x] sub bl,[tbox.ofs.x] sub ebx,eax jle @f mov bl,[tbox.pos.x] sub bl,al mov [tbox.ofs.x],bl @@: mov [tb.sel.selected],0 mov al,[tbox.pos.x] mov ah,[tbox.sel.x] cmp al,ah je @f inc [tb.sel.selected] ja @f xchg al,ah @@: mov [tb.pos.x],al mov [tb.sel.x],ah mcall 13,dword[tbox.x],dword[tbox.y],[color_tbl+4*5];[sc.work] call draw_framerect call textbox.get_width mov esi,eax mov edi,eax cmp ebp,[focused_tb] je @f mov ebx,dword[tbox.x] mov bx,[tbox.y+2] movzx eax,[tbox.height-2] shr eax,1 add eax,4*65536-4 add ebx,eax lea edx,[tbox.text] ; movzx esi,[tbox.length] mcall 4,,[color_tbl+4*0];[sc.work_text] ret @@: movzx eax,[tb.pos.x] cmp al,[tb.sel.x] je @f sub al,[tbox.ofs.x] jz @f movzx ebx,[tb.sel.x] sub bl,[tbox.ofs.x] jge .lp1 xor ebx,ebx .lp1: push eax ebx sub eax,ebx mov ecx,edi sub ecx,ebx cmp eax,ecx jbe .lp2 mov eax,ecx .lp2: imul eax,6 imul ebx,6 movzx ecx,[tbox.x+2] add ecx,3 ; sub eax,ebx add ebx,ecx shl ebx,16 add ebx,eax movzx ecx,[tbox.height-2] shr ecx,1 add cx,[tbox.y+2] shl ecx,16 add ecx,-5*65536+10 mcall 13,,,[color_tbl+4*7];0x0000007F mov esi,[esp] lea edx,[tbox.text] movzx eax,[tbox.ofs.x] add edx,eax mov ebx,dword[tbox.x] mov bx,[tbox.y+2] movzx eax,[tbox.height-2] shr eax,1 add eax,4*65536-4 add ebx,eax mov eax,4 or esi,esi jz .lp3 mcall ,,[color_tbl+4*0];[sc.work_text] .lp3: sub edi,esi jnz .lp4 add esp,8 jmp .exit .lp4: add edx,esi imul esi,6*65536 add ebx,esi pop ecx esi sub esi,ecx cmp esi,edi jbe .lp5 mov esi,edi .lp5: mcall ,,[color_tbl+4*6];0x00FFFFFF sub edi,esi jz .exit add edx,esi imul esi,6*65536 add ebx,esi lea ecx,[tbox.text] ; sub ecx,edx ; add edi,ecx mcall ,,[color_tbl+4*0],,edi;[sc.work_text],,edi jmp .exit @@: lea edx,[tbox.text] movzx eax,[tbox.ofs.x] add edx,eax mov ebx,dword[tbox.x] mov bx,[tbox.y+2] movzx eax,[tbox.height-2] shr eax,1 add eax,4*65536-4 add ebx,eax movzx eax,[tbox.ofs.x] call textbox.get_width mov esi,eax mcall 4,,[color_tbl+4*0];[sc.work_text] .exit: movzx ebx,[tbox.pos.x] movzx eax,[tbox.ofs.x] sub ebx,eax imul ebx,6 movzx eax,[tbox.x+2] add eax,3 add ebx,eax push bx shl ebx,16 pop bx movzx ecx,[tbox.height-2] shr ecx,1 add cx,[tbox.y+2] push cx shl ecx,16 pop cx add ecx,-5*65536+4 mcall 38,,,0x01000000 add ebx,0x00010001 mcall ret endf func textbox.key mov ebp,[focused_tb] mov esi,accel_table_textbox .acc: cmp ebx,[esi] jne @f call dword[esi+4] jmp .exit.2 @@: add esi,8 cmp byte[esi],0 jne .acc test byte[shi+2],0x06 jnz .exit cmp [tbox.length],255 je .exit movzx eax,[chr] movzx eax,[eax+key0] or al,al jz .exit mov al,[eax+key1] cmp [tb_casesen],0 je @f cmp al,$60 jle @f add al,[add_table-$60+eax] @@: call textbox.delete_selection mov ecx,255 sub cl,[tbox.pos.x] lea edi,[tbox.text] add edi,255 lea esi,[edi-1] std rep movsb stosb cld inc [tbox.length] call key.tb.right .exit.2: call textbox.draw .exit: ret endf textbox.mouse: ret func key.tb.bkspace call textbox.delete_selection jnc @f cmp [tbox.pos.x],0 je @f call key.tb.left jmp key.tb.del.direct @@: ret endf func key.tb.home xor al,al mov [tbox.pos.x],al mov [tbox.sel.x],al mov [tbox.ofs.x],al ret endf func key.tb.left mov al,[tbox.pos.x] mov [tbox.sel.x],al dec al js @f mov [tbox.pos.x],al mov [tbox.sel.x],al cmp [tbox.ofs.x],al jl @f sub [tbox.ofs.x],8 jge @f mov [tbox.ofs.x],0 @@: ret endf func key.tb.right call textbox.get_width mov bl,[tbox.pos.x] mov [tbox.sel.x],bl inc bl cmp bl,[tbox.length] ja @f mov [tbox.pos.x],bl mov [tbox.sel.x],bl sub bl,[tbox.ofs.x] cmp bl,al jbe @f inc [tbox.ofs.x] @@: ret endf func key.tb.end call textbox.get_width movzx ebx,[tbox.length] mov [tbox.pos.x],bl mov [tbox.sel.x],bl sub ebx,eax jge @f xor bl,bl @@: mov [tbox.ofs.x],bl ret endf func key.tb.del call textbox.delete_selection jnc @f .direct: movzx ecx,[tbox.length] sub cl,[tbox.pos.x] jz @f lea eax,[tbox.text] movzx edi,[tbox.pos.x] add edi,eax lea esi,[edi+1] dec [tbox.length] cld rep movsb @@: ret endf func key.tb.shift_home xor al,al mov [tbox.pos.x],al mov [tbox.ofs.x],al ret endf func key.tb.shift_left mov al,[tbox.pos.x] dec al js @f mov [tbox.pos.x],al cmp [tbox.ofs.x],al jl @f sub [tbox.ofs.x],8 jge @f mov [tbox.ofs.x],0 @@: ret endf func key.tb.shift_right call textbox.get_width mov bl,[tbox.pos.x] inc bl cmp bl,[tbox.length] ja @f mov [tbox.pos.x],bl sub bl,[tbox.ofs.x] cmp bl,al jbe @f inc [tbox.ofs.x] @@: ret endf func key.tb.shift_end call textbox.get_width movzx ebx,[tbox.length] mov [tbox.pos.x],bl sub ebx,eax jge @f xor bl,bl @@: mov [tbox.ofs.x],bl ret endf