

//[2009.02.19.목][수정!!!]{------------------------------------
//VMOS 관련 정보를 완전히 분리 하므로 별도 문서로 만들어 준다.
//}------------------------------------------------------------


#ifndef vmos_def_h
#define vmos_def_h

//[2009.08.11.화][추가!!!]
#include  "vmos_api_def.h"
#include  "vmos_commap_def.h"
#include  "vmos_memmap_def.h"


//[가상머신 구조 관련]
//{
    //[CODE] 자체 내부를 제외하고 모든 정보 구조는 <8 Byte Align> 되어야 한다.

    //[형 크기]
    //{
        #define  DTU8     unsigned long long
        #define  DTS8     signed long long

        #define  DTU4     unsigned int
        #define  DTS4     signed int

        #define  DTU2     unsigned short
        #define  DTS2     signed short

        #define  DTU1     unsigned char
        #define  DTS1     signed char

    //}

    //[동작 스위치]
    //{
        #define  d_Wr       0
        #define  d_Rd       1

        #define  d_True     1
        #define  d_False    0

    //}

    //[피연산자 정보]
    //{
        //------------------------------------------------------------------------------------
        // 1bit    1bit     4bit     2bit      4bit       4bit   : 비트수.
        //  15      14     13:10     9:8        7:4       3:0    : 비트영역.
        // [i/f] . [s/u] . [size] . [kind] . [segment] . [byte]  : 이름.
        //------------------------------------------------------------------------------------

        #define  d_Bit16_fi          15  //1 bit 크기.
        //{
            #define  d_Mask_fi       0x01

        //}
        #define  d_Bit16_su          14  //1
        //{
            #define  d_Mask_su       0x01

        //}
        #define  d_Bit16_size        10  //4
        //{
            #define  d_Mask_size     0x0f

        //}
        #define  d_Bit16_kind        8   //2
        //{
            #define  d_Mask_kind     0x03

        //}
        #define  d_Bit16_segment     4   //4
        //{
            #define  d_Mask_segment  0x0f

        //}
        #define  d_Bit16_byte        0   //4
        //{
            #define  d_Mask_byte     0x0f

        //}

        //
        // [i/f]
        //
        // - 정수/실수를 구분한다.
        // - i(0) : 정수.
        //   f(1) : 실수.

        #define  d_Float    1
        #define  d_Integer  0

        //
        // [s/u]
        //
        // - signed 인지 unsigned 인지 구분한다.
        // - u(0) : unsigned.
        //   s(1) : signed.

        #define  d_Signed    1
        #define  d_Unsigned  0

        //
        // [size]
        //
        // - 실제 읽어 들일 [크기] 을 가진다(c-type 크기).
        // - 1, 2, 4, 8 로 직접 크기 값을 기술한다(바로 읽어서 사용할수 있도록 하기 위한 것).
        //
        // [kind]
        //
        // - 어떻게 접근할 것인가?
        // - pv(3) : 변수포인터.
        //   pc(2) : 상수포인터.
        //   v (1) : 변수.
        //   c (0) : 상수.

        #define  d_Kind_pv    3
        #define  d_Kind_pc    2
        #define  d_Kind_v     1
        #define  d_Kind_c     0

        //
        // [segment]
        //
        // - 참조 대상 기반자.
        // - #(0) : 상수.
        //   R(1) : 레지스터.
        //   C(2) : @CODE.
        //   G(3) : @DATA.
        //   L(4) : @LOCAL.
        //   T(5) : @TEMP.
        //   F(6) : @FUNC.

        #define  d_Seg_Constant    0
        #define  d_Seg_Reg         1
        #define  d_Seg_Code        2
        #define  d_Seg_Data        3
        #define  d_Seg_Local       4
        #define  d_Seg_Temp        5
        #define  d_Seg_Func        6

    //}

    //[명령]
    //{
        //[2009.01.14.수][추가!!!]{-------
        //현재 명령의 크기는 1 Byte 이다.
        //}-------------------------------

        #define  d_VMOS_OpcodeSize      1

        //[2009.02.24.화][추가!!!]
        //현재 [명령어] 총수는 [연산자] 를 모두 포함하여 56 개 이다.
        #define  d_VMOS_OpcodeCount     56

        //[2009.03.28.토][추가!!!]
        #define  d_VMOS_firstOpcode     1
        #define  d_VMOS_lastOpcode      56

    //}

    //[레지스터번호]
    //{
        //[2008.12.30.화][추가!!!]{--------------------------------------------------------
        //현재 [맷돌] 의 [레지스터] 는 10 개 밖에 없으며 실제 [1차번역] 시에 사용되는 것은
        //R0, R1 단 두개 밖에는 없다. 나머지는 전부 내부적으로만 사용된다.
        //}--------------------------------------------------------------------------------

        //R0, R1, R2 는 일반 [레지스터] 로 ALU 에서 연산시에도 사용되므로 가장 앞에 배치한다.
        //또한 R0 등 번호가 서로 일치 하여 직관적으로 쉽게 구별가능하므로 R0 를 0 번부터 배치한다.

        //각각 정부 8 Byte 크기를 갖는다.

        #define  d_VM_RegCount     11

        //[레지스터 구간] 전체의 Byte 단위 크기.
        #define  d_VM_RegSize      (8 * d_VM_RegCount)

        //           <name>       <index>
        #define  d_VM_Reg_R0       0
        #define  d_VM_Reg_R1       1
        #define  d_VM_Reg_R2       2

        #define  d_VM_Reg_PC       3
        #define  d_VM_Reg_MP       4
        #define  d_VM_Reg_SP       5

        //일반 [세그먼트 레지스터] 는 순서대로 배치한다.
        #define  d_VM_Reg_CODE     6
        #define  d_VM_Reg_DATA     7
        #define  d_VM_Reg_LOCAL    8
        #define  d_VM_Reg_TEMP     9
        #define  d_VM_Reg_FUNC     10 

    //}

    //[VM 선행정보]
    //{
        //[2009.02.19.목][추가!!!]{------------------------------------
        //VMEX 가 _RAM_[] 에 VM 으로 생성되면서 만들어 지는 관리 정보.
        //}------------------------------------------------------------

        #define  d_VM_HdrCount   7
        #define  d_VM_HdrSize    (8 * d_VM_HdrCount)

        //[구조]
        //{
            //각각 정부 8 Byte 크기를 갖는다.

            //               <name>       <index>
            #define  d_VM_Hdr_Mount        0
            #define  d_VM_Hdr_MemStart     1
            #define  d_VM_Hdr_MemEnd       2
            #define  d_VM_Hdr_RomStart     3
            #define  d_VM_Hdr_RomEnd       4
            #define  d_VM_Hdr_RamStart     5
            #define  d_VM_Hdr_RamEnd       6

        //}

    //}

    //[VECTOR]
    //{
        //[2009.02.24.화][추가!!!]{-----------
        //[VMOS] 상의 [이동주소] 를 정의한다.
        //{-----------------------------------

        //[이동주소] 의 @CODE:BASE 로한 [추가주소] 를 기록한다.
        #define  d_CODE_Vect_Reset       0
        #define  d_CODE_Vect_Event       8

    //}

//}

//[VMEX 구조 관련]
//{
    //[2009.02.19.목][생성!!!]{-----------
    //<*.gvmx> 의 자세한 정보를 기술한다.
    //}-----------------------------------

    //[VMEX-선행정보]
    //{
        //[크기 정보]
        //{
            //[2009.02.11.수][추가!!!]{-----------------------------------
            //최종적으로 생성되는 <*.gvmx> 의 [선행정보] 크기를 정의한다.
            //8 * 6 = 48 Byte 크기로 구성된다.
            //
            //[VMEX 구조] = [선행정보]:[가상기계 실행 CODE]
            //
            //}-----------------------------------------------------------

            #define  d_VMEX_HdrCount  6
            #define  d_VMEX_HdrSize   (8 * d_VMEX_HdrCount)

        //}

        //[구조]
        //{
            //각각 정부 8 Byte 크기를 갖는다.

            //[2021.01.15.금][설명추가]{****************************************************
            //GVMX, GVMS 한 개가 구동되는 경우를 기준으로.
            //
            //{ <d_VMEX_Hdr_MemSize> = <VMOS 설정 RAM 크기> - 64(선행정보크기) } 가 된다.
            //
            //즉, 가상기계 한개 구동시 이 가상기계의 [선행정보(64 바이트)] 를 제외하고
            //실제 사용할수 있는 RAM 의 총 크기가 된다.
            //
            //관련 부분의 수정에 임하여 기존 표기의 <MemSize> 의미 해석에 혼동이 발생하였던
            //관계로, 다시 그 의미를 확정한다.
            //}*****************************************************************************

            //                 <name>      <index>
            #define  d_VMEX_Hdr_Version     0
            #define  d_VMEX_Hdr_HdrSize     1
            #define  d_VMEX_Hdr_CodeSize    2
            #define  d_VMEX_Hdr_DataSize    3
            #define  d_VMEX_Hdr_MemSize     4
            #define  d_VMEX_Hdr_Option      5

        //}

    //}

//}


#endif







