
#include  "API_VStrBuf.h"

#include  "vmos_def.h"
#include  "vmos.h"
#include  "c_define.h"

#include  "VClass\VStrBuf\VStrBuf.h"


void __fastcall _API_VStrBuf_Create(void)
{
  //[2021.02.06.토][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pCreator;  //주소.
          
      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{----------------------------
  //void _VStrBuf_생성_(void  *p생성자);
  //}------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[void  *p생성자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pCreator)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //MCU 내부적으로처리 하므로 실제 물리주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pCreator, &pCreator);

  //}

  //[명령처리]
  //{
      VStrBuf_Create((void *)pCreator);

  //}

}

void __fastcall _API_VStrBuf_Delete(void)
{
  //[2021.02.06.토][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pCreator;  //주소.
          
      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{----------------------------
  //void _VStrBuf_삭제_(void  *p생성자);
  //}------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[void  *p생성자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pCreator)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //MCU 내부적으로처리 하므로 실제 물리주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pCreator, &pCreator);

  //}

  //[명령처리]
  //{
      VStrBuf_Delete((void *)pCreator);

  //}

}

void __fastcall _API_VStrBuf_Assign(void)
{
  //[2021.02.06.토][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pCreator;
          DTU8  pStr;

      //}

      //[대상 개체]
      //{
          class VSTRBUF  *VStrBuf_;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{----------------------------
  //void _VStrBuf_할당_(void  *p생성자,
  //                    char  *p문자열);
  //}------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[void  *p생성자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pCreator)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //MCU 내부적으로처리 하므로 실제 물리주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pCreator, &pCreator);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p문자열]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pStr)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //MCU 내부적으로처리 하므로 실제 물리주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pStr, &pStr);

  //}

  //[명령처리]
  //{
      //[생성자] 정보로 해당 개체 얻기.
      VStrBuf_ = (class VSTRBUF *)(*((DTU8 *)pCreator));

      VStrBuf_->Assign((char *)pStr);

  //}

}

void __fastcall _API_VStrBuf_Add(void)
{
  //[2021.02.06.토][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pCreator;
          DTU8  pStr;

      //}

      //[대상 개체]
      //{
          class VSTRBUF  *VStrBuf_;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{----------------------------
  //void _VStrBuf_추가_(void  *p생성자,
  //                    char  *p문자열);
  //}------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[void  *p생성자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pCreator)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //MCU 내부적으로처리 하므로 실제 물리주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pCreator, &pCreator);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[char  *p문자열]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pStr)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //MCU 내부적으로처리 하므로 실제 물리주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pStr, &pStr);

  //}

  //[명령처리]
  //{
      //[생성자] 정보로 해당 개체 얻기.
      VStrBuf_ = (class VSTRBUF *)(*((DTU8 *)pCreator));

      VStrBuf_->Add((char *)pStr);

  //}

}

void __fastcall _API_VStrBuf_Get_BufSize(void)
{
  //[2021.02.06.토][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pCreator;
          
          //반환값.
          DTS4  rReturn;

      //}

      //[대상 개체]
      //{
          class VSTRBUF  *VStrBuf_;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{--------------------------------------
  //int _VStrBuf_저장소크기_얻기_(void  *p생성자);
  //}----------------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[void  *p생성자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pCreator)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //MCU 내부적으로처리 하므로 실제 물리주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pCreator, &pCreator);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      //[생성자] 정보로 해당 개체 얻기.
      VStrBuf_ = (class VSTRBUF *)(*((DTU8 *)pCreator));

      rReturn = VStrBuf_->Get_BufSize();

  //}

  //[결과 반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (4), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_VStrBuf_Get_StrLength(void)
{
  //[2021.02.06.토][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pCreator;
          
          //반환값.
          DTS4  rReturn;

      //}

      //[대상 개체]
      //{
          class VSTRBUF  *VStrBuf_;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{--------------------------------------
  //int _VStrBuf_문자열길이_얻기_(void  *p생성자);
  //}----------------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[void  *p생성자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pCreator)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //MCU 내부적으로처리 하므로 실제 물리주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pCreator, &pCreator);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      //[생성자] 정보로 해당 개체 얻기.
      VStrBuf_ = (class VSTRBUF *)(*((DTU8 *)pCreator));

      rReturn = VStrBuf_->Get_StrLength();

  //}

  //[결과 반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (4), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}

}

void __fastcall _API_VStrBuf_Get_Str(void)
{
  //[2021.02.06.토][생성]

  //[VAR]
  //{
      //[기본]
      //{
          class  VMOS  *vmos;

          //<@LOCAL> 을 기본으로 한 [절대주소](대문자로 절대주소임을 구분하자).
          DTU8   ADR;

      //}

      //[API]
      //{
          //주소는 전부 MCU 상의 주소다.
          DTU8  pCreator;
          
          //반환값.
          DTU8  rReturn; //주소.

      //}

      //[대상 개체]
      //{
          class VSTRBUF  *VStrBuf_;

      //}

  //}

  //[VMOS 위치 얻기]{--
  VMOS_GetPtr(&vmos);
  //}------------------

  //[함수형]{--------------------------------
  //char * _VStrBuf_문자열_(void  *p생성자);
  //}----------------------------------------

  //[기본주소 얻기]
  //{
      //[!]{--------------------------------------------------------
      //<@LOCAL> 과 같은 [절대주소] 값.
      //함수 [인수] 등 모든 지역변수는 <@LOCAL> 부터 시작되기 때문.
      //첫번째 [지역변수(인수포함)] 의 [절대주소] 가 된다.
      //}-----------------------------------------------------------

      ADR = (vmos->regREG_[d_VM_Reg_LOCAL]);

  //}

  //[void  *p생성자]
  //{
      //[절대주소] 읽기.
      if(vmos->VMOS_WrRd(d_Rd, ADR, (8), (DTU1 *)(&pCreator)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

      //MCU 내부적으로처리 하므로 실제 물리주소로 바꾼다.
      vmos->VMOS_Conv_AdrToSysAdr(pCreator, &pCreator);

      //[다음 주소 계산]{----------
      //현재 [인수] 크기를 더한다.
      ADR += (8);
      //}--------------------------

  //}

  //[명령처리]
  //{
      //[!]{------------------------------------------------------------------
      //생성후 주소 반환은 [맷돌C] 에서 바로 접근할수 있도록 <F:주소> 로
      //<64 비트> 의 VMOS 주소로 확장하여 반환.
      //
      //VMOS 에서는 <F:0 - F:F> 까지는 장치주소(실제물리주소, BCB 의 주소) 에
      //매핑되어 직접 접근 가능하다.
      //}---------------------------------------------------------------------
      
      //[생성자] 정보로 해당 개체 얻기.
      VStrBuf_ = (class VSTRBUF *)(*((DTU8 *)pCreator));

      rReturn = (0xffffffff00000000|((DTU8)(VStrBuf_->Get_Str())));

  //}

  //[결과 반환]
  //{
      //[값] 쓰기.
      if(vmos->VMOS_WrRd(d_Wr, ADR, (8), (DTU1 *)(&rReturn)) != true)
      { vmos->regSysFuncCallResult = d_False; return; }

  //}
  
}






