git-svn-id: https://svn.code.sf.net/p/kolmck/code@83 91bb2d04-0c0c-4d2d-88a5-bbb6f4c1fa07
This commit is contained in:
dkolmck
2010-10-25 13:50:25 +00:00
parent cd46f8871f
commit eae6fc00b4
2 changed files with 850 additions and 681 deletions

1163
KOL.pas

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
//------------------------------------------------------------------------------
// KOL_ASM.inc ()to be inlude in KOL.pas)
// v 3.00.o
// v 3.00.u
function MsgBox( const S: KOLString; Flags: DWORD ): DWORD;
asm
@ -2515,41 +2515,6 @@ asm
POP EBX
end;
function S2Int( S: PAnsiChar ): Integer;
asm
XCHG EDX, EAX
XOR EAX, EAX
TEST EDX, EDX
JZ @@exit
XOR ECX, ECX
MOV CL, [EDX]
INC EDX
CMP CL, '-'
PUSHFD
JE @@0
@@1: CMP CL, '+'
JNE @@2
@@0: MOV CL, [EDX]
INC EDX
@@2: SUB CL, '0'
CMP CL, '9'-'0'
JA @@fin
LEA EAX, [EAX+EAX*4] //
LEA EAX, [ECX+EAX*2] //
JMP @@0
@@fin: POPFD
JNE @@exit
NEG EAX
@@exit:
end;
function Str2Int(const Value : AnsiString) : Integer;
asm
CALL EAX2PChar
CALL S2Int
end;
function Trim( const S : KOLString): KOLString;
asm
PUSH EDX
@ -4193,11 +4158,14 @@ function WndProcParentResize( Self_: PControl; var Msg: TMsg; var Rslt: Integer
asm
CMP word ptr [EDX].TMsg.message, CM_SIZE
JNZ @@exit
PUSH EAX
PUSH 0
PUSH 0
PUSH WM_SIZE
PUSH EAX
CALL TControl.Perform
POP EAX
CALL TControl.Invalidate
@@exit: XOR EAX, EAX
end;
@ -4296,7 +4264,7 @@ asm
CMP EDX, NM_RCLICK
JNE @@chk_killfocus
{$IFDEF USE_FLAGS}
MOV CL, G6_RightClick
MOV CL, 1 shl G6_RightClick
{$ELSE}
INC ECX
{$ENDIF}
@ -4309,8 +4277,8 @@ asm
{$ENDIF}
{$IFDEF EVENTS_DYNAMIC}
MOV EAX, [EAX].TControl.EV
MOV ECX, [EAX].TEvents.fOnClick.TMethod.Code
MOV ECX, [EAX].TControl.EV
MOV ECX, [ECX].TEvents.fOnClick.TMethod.Code
{$ELSE}
MOV ECX, [EAX].TControl.EV.fOnClick.TMethod.Code
{$ENDIF}
@ -4641,7 +4609,7 @@ asm //cmd //opd
{$IFDEF EVENTS_DYNAMIC}
MOV EAX, [EAX].TEvents.fOnSelChange.TMethod.Data
{$ELSE}
MOV EAX, [EBX].TControl.fOnSelChange.TMethod.Data
MOV EAX, [EBX].TControl.EV.fOnSelChange.TMethod.Data
{$ENDIF}
CALL ECX
JMP @@ret_false
@ -5442,30 +5410,40 @@ asm
@@MWheel:ADD ESI, 32
end;
{$IFNDEF USE_GRAPHCTLS}
{$IFNDEF NEW_MODAL}
{$IFnDEF USE_GRAPHCTLS}
{$IFnDEF NEW_MODAL}
{$IFnDEF USE_MDI}
function TControl.WndProc( var Msg: TMsg ): Integer;
asm //cmd //opd
PUSH EBX
PUSH ESI
PUSH EDI
PUSH EBP
//MOV ESI, EAX
XCHG ESI, EAX
MOV EDI, EDX
//CALL TControl.RefInc
MOV EBP, [ESI].TControl.PP.fPass2DefProc
XOR EAX, EAX
CMP EAX, [EDX].TMsg.hWnd
CMP EAX, [EDI].TMsg.hWnd
JE @@1
CMP EAX, [ESI].TControl.fHandle
JNE @@1
{$IFDEF USE_GRAPHCTLS}
{$IFDEF USE_FLAGS}
TEST [ESI].TControl.fFlagsG6, 1 shl G6_GraphicCtl
{$ELSE}
CMP [ESI].TControl.fWindowed, AL
{$ENDIF}
JNE @@1
{$ENDIF}
MOV EAX, [EDX].TMsg.hWnd
MOV EAX, [EDI].TMsg.hWnd
MOV [ESI].TControl.fHandle, EAX
@@1:
XOR eax, eax
CMP [AppletRunning], 0
CMP [AppletRunning], AL
JZ @@dyn2
MOV ECX, [Applet]
JECXZ @@dyn2
@ -5481,20 +5459,9 @@ asm //cmd //opd
MOV EAX, ESI
CALL @@callonmes
@@flicksproc:
(*
MOV EAX, ESI
MOV EDX, EDI
PUSH 0
MOV ECX, ESP
CALL dword ptr [ESI].TControl.PP.fWndProcResizeFlicks
TEST AL, AL
POP EAX
JNZ @@pass2defproc
*)
//**********************************************************
MOVZX EAX, word ptr [EDI].TMsg.message
CMP EAX, WM_CLOSE
CMP AX, WM_CLOSE
JNZ @@chk_WM_DESTROY
CMP ESI, [Applet]
@ -5506,6 +5473,7 @@ asm //cmd //opd
@@postquit:
PUSH 0
CALL PostQuitMessage
MOV byte ptr [AppletTerminated], 1
JMP @@calldef
//********************************************************** Added By M.Gerasimov
@@chk_WM_DESTROY:
@ -5527,6 +5495,11 @@ asm //cmd //opd
PUSH offset[ID_SELF]
PUSH [ESI].fHandle
CALL RemoveProp
{$ELSE}
PUSH 0
PUSH GWL_USERDATA
PUSH [ESI].fHandle
CALL SetWindowLong
{$ENDIF}
//**********************************************************
@ -5561,6 +5534,8 @@ asm //cmd //opd
JZ @@ret
POP EDX // pop retaddr
JMP @@pass2defproc
//**************************************************************
@@chk_WM_SIZE:
CMP AX, WM_SIZE
JNE @@chk_WM_SYSCOMMAND //@@chk_WM_SHOWWINDOW
@ -5581,9 +5556,11 @@ asm //cmd //opd
CALL dword ptr [Global_Align]
@@doGlobalAlignSelf:
{$ENDIF}
XCHG EAX, ESI
MOV EAX, ESI
CALL dword ptr [Global_Align]
JMP @@popeax_exit // fPass2DefProc not needed, CallDefWndProc already called
//**************************************************************
@@chk_WM_SYSCOMMAND:
CMP AX, WM_SYSCOMMAND
JNE @@chk_WM_SETFOCUS
@ -5610,6 +5587,7 @@ asm //cmd //opd
@@ret_0:
JMP @@0pass2defproc
//***************************************************************
@@chk_WM_SETFOCUS:
CMP AX, WM_SETFOCUS
JNE @@chk_WM_CTLCOLOR //@@chk_WM_SETCURSOR
@ -5628,6 +5606,7 @@ asm //cmd //opd
DEC [ESI].TControl.fClickDisabled
JMP @@exit
//**************************************************************
@@chk_WM_CTLCOLOR:
MOV EDX, EAX
SUB DX, WM_CTLCOLORMSGBOX
@ -5642,8 +5621,8 @@ asm //cmd //opd
CALL SendMessage
JMP @@pass2defproc
//**************************************************************
@@chk_WM_COMMAND:
//CMP word ptr [EDI].TMsg.message, WM_COMMAND
CMP AX, WM_COMMAND
JNE @@chk_WM_KEY
@ -5666,6 +5645,7 @@ asm //cmd //opd
CALL SendMessage
JMP @@pass2defproc
//**************************************************************
@@chk_WM_KEY:
MOV EDX, EAX
SUB DX, WM_KEYFIRST
@ -5760,7 +5740,7 @@ asm //cmd //opd
JMP @@pass2defproc
@@calldef:
XCHG EAX, ESI
MOV EAX, ESI
MOV EDX, EDI
CALL TControl.CallDefWndProc
JMP @@exit
@ -5778,18 +5758,24 @@ asm //cmd //opd
{$ENDIF USE_fNCDestroyed}
MOV ECX, ESP
XCHG EAX, ESI
MOV EAX, ESI
MOV EDX, EDI
CALL dword ptr[EAX].PP.fPass2DefProc
CALL EBP
@@popeax_exit:
POP EAX
@@exit:
{XCHG ESI, EAX
CALL TControl.RefDec
XCHG EAX, ESI}
POP EBP
POP EDI
POP ESI
POP EBX
@@ret:
end;
{$ENDIF no_USE_MDI}
{$ENDIF no NEW_MODAL}
{$ENDIF no USE_GRAPHCTLS}
@ -6086,6 +6072,7 @@ asm // //
end;
procedure TControl.Set_Visible( Value: Boolean );
const wsVisible = $10;
asm
{$IFDEF OLD_ALIGN}
PUSH EBX
@ -7108,23 +7095,6 @@ asm
@@exit:
end;
procedure TControl.CreateChildWindows;
asm
PUSH ESI
MOV ESI, [EAX].TControl.fChildren
MOV ECX, [ESI].TList.fCount
MOV ESI, [ESI].TList.fItems
JECXZ @@exit
@@loop: PUSH ECX
LODSD
CALL CallTControlCreateWindow
POP ECX
LOOP @@loop
@@exit: POP ESI
end;
function TControl.ProcessMessage: Boolean;
const size_TMsg = sizeof( TMsg );
asm
@ -13849,240 +13819,6 @@ asm //cmd //opd
POP EBX
end;
{$IFnDEF OLD_ALIGN}
procedure AlignChildrenProc(Sender: PObj);
const AlignModes = (1 shl byte(caBottom))+(1 shl byte(caTop))+
(((1 shl byte(caRight)) +(1 shl byte(caLeft)))shl 8)+
(((1 shl byte(caClient))+(1 shl byte(caNone)))shl 16);
asm //cmd //opd
TEST EAX,EAX
JZ @@21
CMP [EAX].TControl.fParent,0
SETZ DL
{$IFDEF USE_FLAGS}
TEST [EAX].TControl.fFlagsG3, (1 shl G3_IsForm)
SETNZ DH
OR DL, DH
{$ELSE}
OR DL,[EAX].TControl.fIsForm
{$ENDIF}
BTR dword ptr[EAX].TControl.fAligning,oaFromSelf
JA @@20
OR byte ptr[EAX].TControl.fAligning,(1 shl oaWaitAlign)
MOV EAX,[EAX].TControl.fParent
@@20: CALL @@ToBeAlign
JNZ @@DoAlign
@@21: RETN
@@ToBeAlign:
{$IFDEF USE_FLAGS}
TEST [EAX].TControl.fStyle.f3_Style, 1 shl F3_Visible
SETNZ DL
{$ELSE}
MOV DL,[EAX].TControl.fVisible
{$ENDIF}
{$IFDEF USE_FLAGS}
TEST [EAX].TControl.fFlagsG3, 1 shl G3_IsForm
SETNZ DH
OR DL, DH
TEST [EAX].TControl.fFlagsG4, (1 shl G4_CreateHidden)
SETNZ DH
OR DL, DH
{$ELSE}
OR DL,[EAX].TControl.fCreateHidden
{$ENDIF}
JE @@10
{$IFDEF USE_FLAGS}
TEST [EAX].TControl.fFlagsG3, 1 shl G3_IsForm
SETNZ DH
AND DL, DH
{$ELSE}
AND DL,[EAX].TControl.fIsForm
{$ENDIF}
JNE @@12
CMP dword ptr[EAX].TControl.fParent,0
JE @@11
PUSH EAX
MOV EAX,[EAX].TControl.fParent
CALL @@ToBeAlign
POP EAX
@@10: XOR DL,1
//!!! Important: oaWaitAlign=0
OR [EAX].TControl.fAligning,DL
@@11: XOR DL,1
@@12: RETN
@@DoAlign:
//CALL AlignChildrenProc_
//RET
PUSH EBP
PUSH EBX
PUSH ESI
PUSH EDI
PUSH AlignModes //00210A14h
SUB ESP,030h
MOV EBX,EAX
AND byte ptr[EBX].TControl.fAligning,not(1 shl oaWaitAlign)
OR byte ptr[EBX].TControl.fAligning,(1 shl oaAligning)
LEA EDX,[ESP+20h] //@CR
CALL TControl.ClientRect
@@Main:
MOV EAX,[EBX].TControl.fChildren
MOV EDI,[EAX].TList.fCount
MOV EBP,[EAX].TList.fItems
JMP @@entry
@@loop:
MOV ESI,[EBP]
{$IFDEF USE_FLAGS}
MOV AL,[ESI].TControl.fStyle.f3_Style
SHR AL, F3_Visible
OR AL,[ESI].TControl.fFlagsG4
AND AL, 1 shl G4_CreateHidden // G4_CreateHidden = 0 !!!
{$ELSE}
MOV AL,[ESI].TControl.fVisible
OR AL,[ESI].TControl.fCreateHidden
{$ENDIF}
JZ @@continue
MOVZX EAX,[ESI].TControl.fAlign
BT [ESP+30h],EAX //Allowed
JNC @@continue
{$IFDEF USE_FLAGS}
TEST [ESI].TControl.fFlagsG4, 1 shl G4_NotUseAlign
{$ELSE}
CMP byte ptr[ESI].TControl.fNotUseAlign,0
{$ENDIF}
JNE @@align
MOV EDX,ESP //@R
MOV EAX,ESI //C
CALL TControl.GetBoundsRect
MOV EAX,[ESP+0Ch] //R.Bottom
MOV [ESP+1Ch],EAX //H
MOV EAX,[ESP+08h] //R.Right
MOV [ESP+18h],EAX //W
MOV EAX,[ESP+04h] //R.Top
MOV [ESP+14h],EAX //R1.Top
SUB [ESP+1Ch],EAX //H
MOV EAX,[ESP] //R.Left
MOV [ESP+10h],EAX //R1.Left
SUB [ESP+18h],EAX //W
MOVSX EDX,[EBX].TControl.fMargin
MOVZX ECX,byte ptr[ESI].TControl.fAlign
//!!! Order of caXXX-constants is important
LOOP @@caTop
MOV EAX,[ESP+20h] //CR.Left
SUB EAX,[ESP] //R.Left
ADD EAX,EDX //+Margin
MOV ECX,[ESP+18h] //W
ADD ECX,EDX //+Margin
ADD [ESP+20h],ECX //CR.Left
JMP @@00
@@caTop:
LOOP @@caRight
MOV EAX,[ESP+24h] //CR.Top
SUB EAX,[ESP+04h] //R.Top
ADD EAX,EDX //+Margin
MOV ECX,[ESP+1Ch] //H
ADD ECX,EDX //+Margin
ADD [ESP+24h],ECX //CR.Top
JMP @@01
@@caRight:
LOOP @@caBottom
MOV EAX,[ESP+28h] //CR.Right
SUB EAX,[ESP+08h] //R.Right
SUB EAX,EDX //-Margin
MOV ECX,[ESP+18h] //W
ADD ECX,EDX //+Margin
SUB [ESP+28h],ECX //CR.Right
@@00: ADD [ESP],EAX //R.Left
ADD [ESP+08h],EAX //R.Right
MOV EAX,[ESP+2Ch] //CR.Bottom
SUB EAX,EDX //+Margin
MOV [ESP+0Ch],EAX //R.Bottom
ADD EDX,[esp+24h] //Margin+CR.Top
MOV [ESP+04h],edx //R.Top
JMP @@caNone
@@caBottom:
LOOP @@caClient
MOV EAX,[ESP+2Ch] //CR.Bottom
SUB EAX,[ESP+0Ch] //R.Bottom
SUB EAX,EDX //-Margin
MOV ECX,[ESP+1Ch] //H
ADD ECX,EDX //+Margin
SUB [ESP+2Ch],ECX //CR.Bottom
@@01: ADD [ESP+04h],EAX //R.Top
ADD [ESP+0Ch],EAX //R.Bottom
MOV EAX,[ESP+28h] //CR.Right
SUB EAX,EDX //-Margin
MOV [esp+08h],EAX //R.Right
ADD EDX,[ESP+20h] //Margin+CR.Left
MOV [ESP],EDX //R.Left
JMP @@caNone
@@caClient:
LOOP @@caNone
MOV EAX,[ESP+2Ch] //CR.Bottom
SUB EAX,EDX //-Margin
MOV [ESP+0Ch],EAX //R.Bottom
MOV EAX,[ESP+28h] //CR.Right
SUB EAX,EDX //-Margin
MOV [ESP+08h],EAX //R.Right
MOV EAX,[ESP+24h] //CR.Top
ADD EAX,EDX //+Margin
MOV [ESP+04h],EAX //R.Top
ADD EDX,[ESP+20h] //Margin+CR.Left
MOV [ESP],EDX //R.Left
@@caNone:
MOV EAX,[ESP] //R.Left
CMP EAX,[ESP+08h] //R.Right
JLE @@02 //CMOVG ???
MOV [ESP+08h],EAX //R.Right
@@02: MOV EAX,[ESP+04h] //R.Top
CMP EAX,[ESP+0Ch] //R.Bottom
JLE @@03 //CMOVG ???
MOV [ESP+0Ch],EAX //R.Bottom
@@03: MOV EDX,[ESP] //R.Left
SUB EDX,[ESP+10h] //R1.Left
MOV EAX,[ESP+04h] //R.Top
SUB EAX,[ESP+14h] //R1.Top
OR EDX,EAX //ChgPos
MOV ECX,[ESP+08h] //R.Right
SUB ECX,[ESP] //R.Left
SUB ECX,[ESP+18h] //W
MOV EAX,[ESP+0Ch] //R.Bottom
SUB EAX,[ESP+04h] //R.Top
SUB EAX,[ESP+1Ch] //H
OR EAX,ECX
JZ @@04
AND byte ptr[ESI].TControl.fAligning,not(1 shl oaWaitAlign)
OR byte ptr[ESI].TControl.fAligning,(1 shl oaFromSelf)
@@04: OR EAX,EDX
JZ @@align
MOV EDX,ESP //@R
MOV EAX,ESI //C
CALL TControl.SetBoundsRect
@@align:
TEST byte ptr[ESI].TControl.fAligning,(1 shl oaWaitAlign)
JZ @@continue
MOV EAX,ESI //C
CALL @@DoAlign
@@continue:
TEST byte ptr[EBX].TControl.fAligning,(1 shl oaAligning)
JZ @@exit
ADD EBP,4
@@entry:
DEC EDI
JGE @@loop
SHR dword ptr[ESP+30h],8 //Allowed
JNZ @@Main
AND byte ptr[EBX].TControl.fAligning,not(1 shl oaAligning)
@@exit:
ADD ESP,34h
POP EDI
POP ESI
POP EBX
POP EBP
end;
{$ENDIF OLD_ALIGN}
function WndProcUpdate( Sender: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
asm //cmd //opd
PUSH EBX
@ -14181,7 +13917,7 @@ asm
JECXZ @@retDL
{$IFDEF OLD_ALIGN}
CMP [EAX].TControl.fVisibleWoParent
CMP [EAX].TControl.fVisibleWoParent, 0
JZ @@1
MOV DL, DH
JMP @@retDL