ホーム 道しるべ 憩いの広場 濃緑空間 濃緑研の日記

エントリの手引き
ホーム ] 上へ ] 参戦にあたって ] [ エントリの手引き ]

 

SDKに添付されるプログラムテンプレートの変更方法を以下に示します。

まず、DLLの作者・作成日付を宣言します。
次に、エントリの数を宣言します。

後は、エントリコードの記述です。

// vcppsdk.cpp : DLL アプリケーション用のエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "amd3d.h"
#include "round1.h"
#include <stdlib.h>
#include <math.h>

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
                    )
{
return TRUE;
}

// ****************************** 以下で、DLLのパラメータを決めます ********************************

// CREATORSIGNATURE には、名前や日付を文字列で記録します。
#define CREATORSIGNATURE "Horie, Seiichi. 1999.May.8"

// ENTRYCOUNTは、DLLにいくつエントリーがあるかを示します。
#define ENTRYCOUNT 2



// *********************
// DESCRIPTION00 には、entry00 の説明を文字列で行ってください。
#define DESCRIPTION00 "VC++ Standard, Generated Code"

// REQFEATURES00 には、entry00の必要とする機能をフラグで表します。複数必要ならビット論理和でつなげます。
// 3DNow!コードの場合 #define REQFEATURES00 RF_3DNOW と指定します。

#define REQFEATURES00 RF_FPU
void entry00(struct TSAT * sat, float dt, int count)
{
    float    GMdt,R,w;
    int        i;
   
    GMdt = - GM*dt;
    for ( i=1; i<=count; i++ )
    {
        R = sat->P.X * sat->P.X
            + sat->P.Y*sat->P.Y
            + sat->P.Z*sat->P.Z;

        w = float(GMdt/(sqrt(R)*R));
        sat->V.X += sat->P.X * w;
        sat->P.X += sat->V.X * dt;
        sat->V.Y += sat->P.Y * w;
        sat->P.Y += sat->V.Y * dt;
        sat->V.Z += sat->P.Z * w;
        sat->P.Z += sat->V.Z * dt;
    }
}


// *********************
#define DESCRIPTION01 "i486 Optimized Code"
#define REQFEATURES01 RF_FPU
void entry01(struct TSAT * sat, float dt, int count)
{
    float    GMdt;

    GMdt = - GM*dt;

    __asm{
        mov             esi,sat
        fld [esi].V.Y // Vy
        fld [esi].V.X // Vx Vy
        fld dt // dt Vx Vy
        fld [esi].P.Z // Z dt Vx Vy
        fld [esi].P.Y // Y Z dt Vx Vy
        fld [esi].P.X // X Y Z dt Vx Vy

        mov             ecx,count
i486loopHere:
        // R = sat.P.X*sat.P.X+sat.P.Y*sat.P.Y+sat.P.Z*sat.P.Z;
        fld st(0) // X X Y Z dt Vx Vy
        fmul ST,ST // XX X Y Z dt Vx Vy
        fld st(2) // Y XX X Y Z dt Vx Vy
        fmul ST,ST // YY XX X Y Z dt Vx Vy
        fadd // YY+XX X Y Z dt Vx Vy
        fld st(3) // Z YY+XX X Y Z dt Vx Vy
        fmul ST,ST // ZZ YY+XX X Y Z dt Vx Vy
        fadd // R X Y Z dt Vx Vy

// w = float(GMdt/(sqrt(R)*R))//
        fld st // R R X Y Z dt Vx Vy
        fsqrt // R^0.5 R X Y Z dt Vx Vy
        fmul // R^1.5 X Y Z dt Vx Vy
        fdivr GMdt // newW X Y Z dt Vx Vy
        fld st // w w X Y Z dt Vx Vy

// sat.V.X += w*sat.P.X
        fmul ST,st(2) // w*X w X Y Z dt Vx Vy
        fadd st,st(6) // Vx+wX w X Y Z dt Vx Vy
        fst st(6) // Vx+wX w X Y Z dt newVx Vy
// sat.P.X += sat.V.X*dt
        fmul st,st(5) // (Vx+wX)dt w X Y Z dt Vx Vy
        faddp st(2),st // w newX Y Z dt Vx Vy
        fld st // w w X Y Z dt Vx Vy
// sat.V.Y += w*sat.P.Y
        fmul ST,st(3) // w*Y w X Y Z dt Vx Vy
        fadd st,st(7) // Vy+wY w X Y Z dt Vx Vy
        fst st(7) // Vy+wY w X Y Z dt Vx newVy
// sat.P.Y += sat.V.Y*dt
        fmul st,st(5) // (Vy+wY)dt w X Y Z dt Vx Vy
        faddp st(3),st // w X newY Z dt Vx Vy
// sat.V.Z += w*sat.P.Z
        fmul ST,st(3) // w*Z X Y Z dt Vx Vy
        fadd [esi].V.Z // Vz+wZ X Y Z dt Vx Vy
        fst [esi].V.Z // Vz+wZ X Y Z dt Vx Vy
// sat.P.Z += sat.V.Z*dt//
        fmul st,st(4) // (Vz+wZ)dt X Y Z dt Vx Vy
        faddp st(3),st // X Y newZ dt Vx Vy
        loop         i486loopHere

        fstp [esi].P.X
        fstp [esi].P.Y
        fstp [esi].P.Z
        fstp         dt
        fstp         [esi].V.X
        fstp         [esi].V.Y
    }
}