--------------------------------------------------------------------------------------------
                      [ENHANCED] VFP 9.0 FIX - THE MAXIMUM NUMBER OF FUNCTIONS FOR THE CALCULATE COMMAND
                                 January 2024
                 --------------------------------------------------------------------------------------------
                                    CCB



1. BUG:

     In vfp9 (and vfp6, vfp7, vfp8), the maximum number of functions for the CALCULATE command is 64,
     the maximum number of functions (and variables) for the CALCULATE command with the TO VarList clause is 32,
     now the maximum number of functions for the CALCULATE command is 256.


2. CAUSE:

     There are some BUGs in the following code.


3. RESOLUTION:

     We can write some code to fix the BUG.

     Fun44eb32 :: ; proc near
             push ebp                                                        ;0x0044eb32 :        55
             mov ebp , esp                                                   ;0x0044eb33 :        8bec
             sub esp , 024h                                                  ;0x0044eb35 :        83ec24
             push ebx                                                        ;0x0044eb38 :        53
             push esi                                                        ;0x0044eb39 :        56
             push edi                                                        ;0x0044eb3a :        57
             mov edi , eax                                                   ;0x0044eb3b :        8bf8
             mov eax ,  dword ptr [ Data9393ac ]                             ;0x0044eb3d :        a1ac939300
             cmp  byte ptr [eax] , 028h                                      ;0x0044eb42 :        803828
             mov ebx , ecx                                                   ;0x0044eb45 :        8bd9
             mov esi , edx                                                   ;0x0044eb47 :        8bf2
             jne Label44eb7b                                                 ;0x0044eb49 :        7530
             inc eax                                                         ;0x0044eb4b :        40
             cmp  byte ptr [eax] , 04h                                       ;0x0044eb4c :        803804
             mov dword ptr [ Data9393ac ] ,  eax                             ;0x0044eb4f :        a3ac939300
             je Label608007                                                  ;0x0044eb54 :        0f84ad941b00
             xor edi , edi                                                   ;0x0044eb5a :        33ff

     Label44eb5c ::
             pushd 0FFFFFFFFh                                                ;0x0044eb5c :        6aff
             mov edx , 0400h                                                 ;0x0044eb5e :        ba00040000
             mov ecx , esi                                                   ;0x0044eb63 :        8bce
             call Fun421184                                                  ;0x0044eb65 :        e81a26fdff
             mov eax ,  dword ptr [ Data9393ac ]                             ;0x0044eb6a :        a1ac939300
             inc  word ptr [ebx]                                             ;0x0044eb6f :        66ff03
             cmp  byte ptr [eax] , 07h                                       ;0x0044eb72 :        803807
             je Label4425a2                                                  ;0x0044eb75 :        0f84273affff

     Label44eb7b ::
             pop edi                                                         ;0x0044eb7b :        5f
             pop esi                                                         ;0x0044eb7c :        5e
             pop ebx                                                         ;0x0044eb7d :        5b
             leave                                                           ;0x0044eb7e :        c9
             ret                                                             ;0x0044eb7f :        c3

     Label4425a2 ::
             inc  dword ptr [ Data9393ac ]                                   ;0x004425a2 :        ff05ac939300
             inc edi                                                         ;0x004425a8 :        47
             add esi , 018h                                                  ;0x004425a9 :        83c618


     ;
     ;                 ---------------------------------------------------------------------------------
     ;                      VFP 9.0 FIX - THE MAXIMUM NUMBER OF FUNCTIONS FOR THE CALCULATE COMMAND
     ;                                December 2019
     ;                 ---------------------------------------------------------------------------------
     ;                                     CCB
     ;
     ; In vfp9, the maximum number of functions for the CALCULATE command is 64,
     ; the maximum number of functions (and variables) for the CALCULATE command with the TO VarList clause is 32,
     ; now the maximum number of functions for the CALCULATE command is 256.
     ;
     ; 2019/12/28, by ccb
     ;

     ;         cmp edi , 020h                                                  ;0x004425ac :        83ff20
             cmp edi , 0100h                                                  ;0x004425ac :        83ff20


             jnl Label44eb7b                                                 ;0x004425af :        0f8dc6c50000
             jmp Label44eb5c                                                 ;0x004425b5 :        e9a2c50000

     Label608007 ::
             inc eax                                                         ;0x00608007 :        40
             pushd 0FFFFFFFFh                                                ;0x00608008 :        6aff
             mov edx , 0400h                                                 ;0x0060800a :        ba00040000
             lea ecx ,  dword ptr [ ebp - 36 ]                               ;0x0060800f :        8d4ddc
             mov dword ptr [ Data9393ac ] ,  eax                             ;0x00608012 :        a3ac939300
             call Fun421184                                                  ;0x00608017 :        e86891e1ff
             test eax , eax                                                  ;0x0060801c :        85c0
             je Label60803d                                                  ;0x0060801e :        741d
             lea ebx ,  dword ptr [ ebp - 36 ]                               ;0x00608020 :        8d5ddc
             call Fun4ed9d7                                                  ;0x00608023 :        e8af59eeff
             pushd 018h                                                      ;0x00608028 :        6a18
             mov edx , ebx                                                   ;0x0060802a :        8bd3
             mov ecx , esi                                                   ;0x0060802c :        8bce
             call Fun42c19b                                                  ;0x0060802e :        e86841e2ff
             mov  eax , dword ptr [ esi + 12 ]                               ;0x00608033 :        8b460c
             mov  dword ptr [edi] , eax                                      ;0x00608036 :        8907
             jmp Label44eb7b                                                 ;0x00608038 :        e93e6be4ff

     Label60803d ::
             mov  eax , dword ptr [ ebp - 36 ]                               ;0x0060803d :        8b45dc
             or  dword ptr [ esi + 4 ] , 0FFFFFFFFh                          ;0x00608040 :        834e04ff
             mov  dword ptr [esi] , eax                                      ;0x00608044 :        8906
             xor eax , eax                                                   ;0x00608046 :        33c0
             inc eax                                                         ;0x00608048 :        40
             pushd 00h                                                       ;0x00608049 :        6a00
             mov  word ptr [ esi + 10 ] , ax                                 ;0x0060804b :        6689460a
             mov  dword ptr [edi] , eax                                      ;0x0060804f :        8907
             and  dword ptr [ esi + 16 ] , 00h                               ;0x00608051 :        83661000
             push esi                                                        ;0x00608055 :        56
             mov  dword ptr [ esi + 12 ] , eax                               ;0x00608056 :        89460c
             call Fun5007ab                                                  ;0x00608059 :        e84d87efff
             jmp Label44eb7b                                                 ;0x0060805e :        e9186be4ff


4. APPLIES TO:

     VFP 6.0.8167.0
     VFP 6.0.8961.0 (SP5)

     VFP 7.0.0.9262
     VFP 7.0.0.9465 (SP1)

     VFP 8.0.0.2521
     VFP 8.0.0.3117 (SP1)

     VFP 9.0.0.2412
     VFP 9.0.0.3504 (SP1)
     VFP 9.0.0.4611 (SP2)
     VFP 9.0.0.5015 (SP2)
     VFP 9.0.0.5411 (SP2)
     VFP 9.0.0.5721 (SP2)
     VFP 9.0.0.5815 (SP2)
     VFP 9.0.0.6303 (SP2)
     VFP 9.0.0.6602 (SP2)
     VFP 9.0.0.7423 (SP2)

     The bug has been fixed in VFP Advanced.


5. REFERENCE WEBSITES:

     1, baiyujia.com:
     http://www.baiyujia.com
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix86.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix243.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix244.asp

     2, mail-archive.com:
     https://www.mail-archive.com/profox@leafe.com/msg143918.html


6. OTHER:

     For reference only, there is no guarantees.

     Any questions or suggestions, please send me an email at ccb2000@163.com.