!main.inc

Переключить прокрутку окна
Загрузить этот исходный код

;
  ; Реализация среды исполнения языка программирования
  ; Объектно-ориентированный продвинутый векторный транслятор
  ;
  ; Copyright © 2021, 2024 Малик Разработчик
  ;
  ; Это свободная программа: вы можете перераспространять ее и/или изменять
  ; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
  ; в каком она была опубликована Фондом свободного программного обеспечения;
  ; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
  ;
  ; Эта программа распространяется в надежде, что она будет полезной,
  ; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
  ; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
  ; общественной лицензии GNU.
  ;
  ; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
  ; вместе с этой программой. Если это не так, см.
  ; <https://www.gnu.org/licenses/>.
;

; <fold определения>
    ; <fold поддержка числовых имён регистров архитектуры x86-64 и различных псевдонимов регистров>
                    r0    equ rax
                    r1    equ rcx
                    r2    equ rdx
                    r3    equ rbx
                    r4    equ rsp
                    r5    equ rbp
                    r6    equ rsi
                    r7    equ rdi
                    r0q   equ rax
                    r1q   equ rcx
                    r2q   equ rdx
                    r3q   equ rbx
                    r4q   equ rsp
                    r5q   equ rbp
                    r6q   equ rsi
                    r7q   equ rdi
                    r8q   equ r8
                    r9q   equ r9
                    r0d   equ eax
                    r1d   equ ecx
                    r2d   equ edx
                    r3d   equ ebx
                    r4d   equ esp
                    r5d   equ ebp
                    r6d   equ esi
                    r7d   equ edi
                    r0w   equ ax
                    r1w   equ cx
                    r2w   equ dx
                    r3w   equ bx
                    r4w   equ sp
                    r5w   equ bp
                    r6w   equ si
                    r7w   equ di
                    r0b   equ al
                    r1b   equ cl
                    r2b   equ dl
                    r3b   equ bl
                    r4b   equ spl
                    r5b   equ bpl
                    r6b   equ sil
                    r7b   equ dil
                    r0l   equ al
                    r1l   equ cl
                    r2l   equ dl
                    r3l   equ bl
                    r4l   equ spl
                    r5l   equ bpl
                    r6l   equ sil
                    r7l   equ dil
                    r00   equ rax
                    r01   equ rcx
                    r02   equ rdx
                    r03   equ rbx
                    r04   equ rsp
                    r05   equ rbp
                    r06   equ rsi
                    r07   equ rdi
                    r08   equ r8
                    r09   equ r9
                    r00q  equ rax
                    r01q  equ rcx
                    r02q  equ rdx
                    r03q  equ rbx
                    r04q  equ rsp
                    r05q  equ rbp
                    r06q  equ rsi
                    r07q  equ rdi
                    r08q  equ r8
                    r09q  equ r9
                    r10q  equ r10
                    r11q  equ r11
                    r12q  equ r12
                    r13q  equ r13
                    r14q  equ r14
                    r15q  equ r15
                    r00d  equ eax
                    r01d  equ ecx
                    r02d  equ edx
                    r03d  equ ebx
                    r04d  equ esp
                    r05d  equ ebp
                    r06d  equ esi
                    r07d  equ edi
                    r08d  equ r8d
                    r09d  equ r9d
                    r00w  equ ax
                    r01w  equ cx
                    r02w  equ dx
                    r03w  equ bx
                    r04w  equ sp
                    r05w  equ bp
                    r06w  equ si
                    r07w  equ di
                    r08w  equ r8w
                    r09w  equ r9w
                    r00b  equ al
                    r01b  equ cl
                    r02b  equ dl
                    r03b  equ bl
                    r04b  equ spl
                    r05b  equ bpl
                    r06b  equ sil
                    r07b  equ dil
                    r08b  equ r8l
                    r09b  equ r9l
                    r00l  equ al
                    r01l  equ cl
                    r02l  equ dl
                    r03l  equ bl
                    r04l  equ spl
                    r05l  equ bpl
                    r06l  equ sil
                    r07l  equ dil
                    r08l  equ r8l
                    r09l  equ r9l
                    bsc0  equ al
                    bsc1  equ cl
                    bsc2  equ dl
                    bsc3  equ bl
                    bsc4  equ spl
                    bsc5  equ bpl
                    bsc6  equ sil
                    bsc7  equ dil
                    bsc8  equ r8l
                    bsc9  equ r9l
                    bsc00 equ al
                    bsc01 equ cl
                    bsc02 equ dl
                    bsc03 equ bl
                    bsc04 equ spl
                    bsc05 equ bpl
                    bsc06 equ sil
                    bsc07 equ dil
                    bsc08 equ r8l
                    bsc09 equ r9l
                    bsc10 equ r10l
                    bsc11 equ r11l
                    bsc12 equ r12l
                    bsc13 equ r13l
                    bsc14 equ r14l
                    bsc15 equ r15l
                    wsc0  equ ax
                    wsc1  equ cx
                    wsc2  equ dx
                    wsc3  equ bx
                    wsc4  equ sp
                    wsc5  equ bp
                    wsc6  equ si
                    wsc7  equ di
                    wsc8  equ r8w
                    wsc9  equ r9w
                    wsc00 equ ax
                    wsc01 equ cx
                    wsc02 equ dx
                    wsc03 equ bx
                    wsc04 equ sp
                    wsc05 equ bp
                    wsc06 equ si
                    wsc07 equ di
                    wsc08 equ r8w
                    wsc09 equ r9w
                    wsc10 equ r10w
                    wsc11 equ r11w
                    wsc12 equ r12w
                    wsc13 equ r13w
                    wsc14 equ r14w
                    wsc15 equ r15w
                    dsc0  equ eax
                    dsc1  equ ecx
                    dsc2  equ edx
                    dsc3  equ ebx
                    dsc4  equ esp
                    dsc5  equ ebp
                    dsc6  equ esi
                    dsc7  equ edi
                    dsc8  equ r8d
                    dsc9  equ r9d
                    dsc00 equ eax
                    dsc01 equ ecx
                    dsc02 equ edx
                    dsc03 equ ebx
                    dsc04 equ esp
                    dsc05 equ ebp
                    dsc06 equ esi
                    dsc07 equ edi
                    dsc08 equ r8d
                    dsc09 equ r9d
                    dsc10 equ r10d
                    dsc11 equ r11d
                    dsc12 equ r12d
                    dsc13 equ r13d
                    dsc14 equ r14d
                    dsc15 equ r15d
                    qsc0  equ rax
                    qsc1  equ rcx
                    qsc2  equ rdx
                    qsc3  equ rbx
                    qsc4  equ rsp
                    qsc5  equ rbp
                    qsc6  equ rsi
                    qsc7  equ rdi
                    qsc8  equ r8
                    qsc9  equ r9
                    qsc00 equ rax
                    qsc01 equ rcx
                    qsc02 equ rdx
                    qsc03 equ rbx
                    qsc04 equ rsp
                    qsc05 equ rbp
                    qsc06 equ rsi
                    qsc07 equ rdi
                    qsc08 equ r8
                    qsc09 equ r9
                    qsc10 equ r10
                    qsc11 equ r11
                    qsc12 equ r12
                    qsc13 equ r13
                    qsc14 equ r14
                    qsc15 equ r15
                    esc0  equ st0
                    esc1  equ st1
                    esc2  equ st2
                    esc3  equ st3
                    esc4  equ st4
                    esc5  equ st5
                    esc6  equ st6
                    esc7  equ st7
                    x0    equ xmm0
                    x1    equ xmm1
                    x2    equ xmm2
                    x3    equ xmm3
                    x4    equ xmm4
                    x5    equ xmm5
                    x6    equ xmm6
                    x7    equ xmm7
                    x8    equ xmm8
                    x9    equ xmm9
                    y0    equ ymm0
                    y1    equ ymm1
                    y2    equ ymm2
                    y3    equ ymm3
                    y4    equ ymm4
                    y5    equ ymm5
                    y6    equ ymm6
                    y7    equ ymm7
                    y8    equ ymm8
                    y9    equ ymm9
                    z0    equ zmm0
                    z1    equ zmm1
                    z2    equ zmm2
                    z3    equ zmm3
                    z4    equ zmm4
                    z5    equ zmm5
                    z6    equ zmm6
                    z7    equ zmm7
                    z8    equ zmm8
                    z9    equ zmm9
                    x00   equ xmm0
                    x01   equ xmm1
                    x02   equ xmm2
                    x03   equ xmm3
                    x04   equ xmm4
                    x05   equ xmm5
                    x06   equ xmm6
                    x07   equ xmm7
                    x08   equ xmm8
                    x09   equ xmm9
                    x10   equ xmm10
                    x11   equ xmm11
                    x12   equ xmm12
                    x13   equ xmm13
                    x14   equ xmm14
                    x15   equ xmm15
                    x16   equ xmm16
                    x17   equ xmm17
                    x18   equ xmm18
                    x19   equ xmm19
                    x20   equ xmm20
                    x21   equ xmm21
                    x22   equ xmm22
                    x23   equ xmm23
                    x24   equ xmm24
                    x25   equ xmm25
                    x26   equ xmm26
                    x27   equ xmm27
                    x28   equ xmm28
                    x29   equ xmm29
                    x30   equ xmm30
                    x31   equ xmm31
                    y00   equ ymm0
                    y01   equ ymm1
                    y02   equ ymm2
                    y03   equ ymm3
                    y04   equ ymm4
                    y05   equ ymm5
                    y06   equ ymm6
                    y07   equ ymm7
                    y08   equ ymm8
                    y09   equ ymm9
                    y10   equ ymm10
                    y11   equ ymm11
                    y12   equ ymm12
                    y13   equ ymm13
                    y14   equ ymm14
                    y15   equ ymm15
                    y16   equ ymm16
                    y17   equ ymm17
                    y18   equ ymm18
                    y19   equ ymm19
                    y20   equ ymm20
                    y21   equ ymm21
                    y22   equ ymm22
                    y23   equ ymm23
                    y24   equ ymm24
                    y25   equ ymm25
                    y26   equ ymm26
                    y27   equ ymm27
                    y28   equ ymm28
                    y29   equ ymm29
                    y30   equ ymm30
                    y31   equ ymm31
                    z00   equ zmm0
                    z01   equ zmm1
                    z02   equ zmm2
                    z03   equ zmm3
                    z04   equ zmm4
                    z05   equ zmm5
                    z06   equ zmm6
                    z07   equ zmm7
                    z08   equ zmm8
                    z09   equ zmm9
                    z10   equ zmm10
                    z11   equ zmm11
                    z12   equ zmm12
                    z13   equ zmm13
                    z14   equ zmm14
                    z15   equ zmm15
                    z16   equ zmm16
                    z17   equ zmm17
                    z18   equ zmm18
                    z19   equ zmm19
                    z20   equ zmm20
                    z21   equ zmm21
                    z22   equ zmm22
                    z23   equ zmm23
                    z24   equ zmm24
                    z25   equ zmm25
                    z26   equ zmm26
                    z27   equ zmm27
                    z28   equ zmm28
                    z29   equ zmm29
                    z30   equ zmm30
                    z31   equ zmm31
                    xmm00 equ xmm0
                    xmm01 equ xmm1
                    xmm02 equ xmm2
                    xmm03 equ xmm3
                    xmm04 equ xmm4
                    xmm05 equ xmm5
                    xmm06 equ xmm6
                    xmm07 equ xmm7
                    xmm08 equ xmm8
                    xmm09 equ xmm9
                    ymm00 equ ymm0
                    ymm01 equ ymm1
                    ymm02 equ ymm2
                    ymm03 equ ymm3
                    ymm04 equ ymm4
                    ymm05 equ ymm5
                    ymm06 equ ymm6
                    ymm07 equ ymm7
                    ymm08 equ ymm8
                    ymm09 equ ymm9
                    zmm00 equ zmm0
                    zmm01 equ zmm1
                    zmm02 equ zmm2
                    zmm03 equ zmm3
                    zmm04 equ zmm4
                    zmm05 equ zmm5
                    zmm06 equ zmm6
                    zmm07 equ zmm7
                    zmm08 equ zmm8
                    zmm09 equ zmm9
                    msk0  equ k0
                    msk1  equ k1
                    msk2  equ k2
                    msk3  equ k3
                    msk4  equ k4
                    msk5  equ k5
                    msk6  equ k6
                    msk7  equ k7
    ; </fold>

    ; <fold встроенные константы языка ПВТ-ОО>
                    false = 0
                    true  = -1
                    null  = 0
    ; </fold>

    ; <fold смещения полей области контекста тагированного стака>
                    ; Тагированный стак, используемый в среде исполнения программ, написанных на ПВТ-ОО, имеет четыре области:
                    ; 1. Область данных.
                    ;    Является массивом из 16-байтных элементов данных. Значения некоторых векторных типов (их всего 6: int8, long4, long8, float8, double4, double8) занимают 2 или 4 таких
                    ;    элемента, остальные значения занимают ровно 1 элемент данных. Если значение не полностью занимает весь элемент данных, то оно расширяется нулями до полного элемента данных.
                    ; 2. Область охраны.
                    ;    Занимает определённое количество 16-байтных элементов данных на вершине (в начале) области данных, но не более 256 элементов (4 КБ). При попытке записи данных в эту область
                    ;    возбуждается ошибка StackOverflowError.
                    ; 3. Область тагов.
                    ;    Следует за областью данных и является массивом из 1-байтных тагов. Количество тагов равно количеству элементов данных, поэтому размер области тагов составляет 1/16 от размера
                    ;    области данных. Каждому элементу данных соответствует свой таг, определяющий тип данных этого элемента.
                    ; 4. Область контекста.
                    ;    Следует за областью тагов и является дополнением к регистрам процессора. На эту область всегда ссылается регистр rbx в 64-битных программах, или ebx — в 32-битных. Эта область
                    ;    имеет размер 4 КБ и состоит из следующих 64-битных полей:
                    ctxt$zer = $0000 ; всегда равно нулю
                    ctxt$ehb = $0008 ; указатель на текущий блок обработки исключений
                    ctxt$dat = $0010 ; указатель на начало области данных, он же – указатель на начало области охраны
                    ctxt$grd = $0018 ; указатель на конец области охраны
                    ctxt$tag = $0020 ; указатель на начало области тагов, он же — указатель на конец области данных
                    ctxt$end = $0028 ; указатель на конец области контекста
                    ctxt$tsp = $0030 ; место для временного хранения дополнения к rsp/esp, которое ссылается на соответствующий таг, когда регистр rsi/esi используется
                    ctxt$tbp = $0038 ; место для временного хранения дополнения к rbp/ebp, которое ссылается на соответствующий таг, когда регистр rdi/edi используется
                    ctxt$tm2 = $0040 ; временные данные функций инструкций высокого уровня
                    ctxt$tm3 = $0048 ; временные данные функций инструкций высокого уровня
                    ctxt$tm4 = $0050 ; временные данные функций инструкций высокого уровня
                    ctxt$tm5 = $0058 ; временные данные функций инструкций высокого уровня
                    ctxt$tm6 = $0060 ; временные данные функций инструкций высокого уровня
                    ctxt$tm7 = $0068 ; временные данные функций инструкций высокого уровня
                    ctxt$tm8 = $0070 ; временные данные функций инструкций высокого уровня
                    ctxt$tm9 = $0078 ; временные данные функций инструкций высокого уровня
                    ctxt$sup = $0080 ; указатель на последний элемент данных с тагом TAG_SUPPRESS
                    ; Поля для хранения предыдущих значений регистров для возможности их восстановления:
                    ctxt$r01 = $0088 ; rcx
                    ctxt$r02 = $0090 ; rdx
                    ctxt$r03 = $0098 ; rbx
                    ctxt$r04 = $00a0 ; rsp
                    ctxt$r05 = $00a8 ; rbp
                    ctxt$r06 = $00b0 ; rsi
                    ctxt$r07 = $00b8 ; rdi
                    ctxt$r08 = $00c0 ; r08
                    ctxt$r09 = $00c8 ; r09
                    ctxt$r10 = $00d0 ; r10
                    ctxt$r11 = $00d8 ; r11
                    ctxt$r12 = $00e0 ; r12
                    ctxt$r13 = $00e8 ; r13
                    ctxt$r14 = $00f0 ; r14
                    ctxt$r15 = $00f8 ; r15
                    ; Остальное место (по смещению $0100) — это область xstorage для хранения предыдущих значений регистров FPU, SSE, AVX и AVX-512.
                    ctxt$xst = $0100 ; xstorage
    ; </fold>

    ; <fold таги элементов области данных тагированного стака>
                    TAG_EMPTY     =       $00
                    TAG_INT8      =     $1c18
                    TAG_LONG4     =     $2624
                    TAG_LONG8     = $2e2c2a28
                    TAG_FLOAT8    =     $fcf8
                    TAG_DOUBLE4   =     $d6d4
                    TAG_DOUBLE8   = $dedcdad8
                    TAG_OBJECT    =       $88
                    TAG_SUPPRESS  =       $99
                    TAG_SF_METHOD =     $5f8e
    ; </fold>
; </fold>

; <fold общие макросы>
    ; <fold выравнивание кода и данных>
        macro nopvar length* {
                        local       .rem
                        .rem = length
            while(.rem > 0)
                if(.rem = 1)
                                db          $90
                                break
                else if(.rem = 2)
                                db          $66, $90
                                break
                else if(.rem = 3)
                                db          $0f, $1f, $00
                                break
                else if(.rem = 4)
                                db          $0f, $1f, $40, $00
                                break
                else if(.rem = 5)
                                db          $0f, $1f, $44, $00, $00
                                break
                else if(.rem = 6)
                                db          $66, $0f, $1f, $44, $00, $00
                                break
                else if(.rem = 7)
                                db          $0f, $1f, $80, $00, $00, $00, $00
                                break
                else if(.rem = 8)
                                db          $0f, $1f, $84, $00, $00, $00, $00, $00
                                break
                else
                                db          $66, $0f, $1f, $84, $00, $00, $00, $00, $00
                                .rem = .rem-9
                end if
            end while
        }

        macro align_c algn* {
                        nopvar      (-$) and ((algn)-1)
        }

        macro align_d algn* {
            repeat((-$) and ((algn)-1))
                            db          $00
            end repeat
        }

        macro separator_c {
                        nopvar      $04-($ and $03)
        }

        macro separator_d {
                        align_d     $40
        }
    ; </fold>

    ; <fold код>
        macro proc procedureFullName* {
            procedureFullName:
        }

        macro end_proc {
            .D.IEND:    separator_c
                        separator_c
        }

        macro fast methodFullName*, [argumentName, argumentType] {
            common
                        local       .sizedata
                        local       .sizetags
                        proc        methodFullName
                        .sizedata = $00000000
                        .sizetags = $00000000
            reverse
            if ~ "" eq `argumentName
                if ~ "" eq `argumentType
                                label       .#argumentName at rbp+.sizedata+$10
                                label       .#argumentName#.tag at rsi+.sizetags+$00
                    if(argumentType in <long8, double8>)
                                    .sizedata = .sizedata+$40
                                    .sizetags = .sizetags+$04
                    else if(argumentType in <int8, long4, float8, double4>)
                                    .sizedata = .sizedata+$20
                                    .sizetags = .sizetags+$02
                    else
                                    .sizedata = .sizedata+$10
                                    .sizetags = .sizetags+$01
                    end if
                end if
            end if
            common
                        .arg.data = .sizedata
                        .arg.tags = .sizetags
                        .loc.data = $00000000
        }

        macro floc [localvarName, localvarType] {
            forward
            if(localvarType in <long8, double8>)
                            .loc.data = .loc.data+$40
            else if(localvarType in <int8, long4, float8, double4>)
                            .loc.data = .loc.data+$20
            else
                            .loc.data = .loc.data+$10
            end if
                        label       .#localvarName at rbp-.loc.data
        }

        macro method methodFullName*, [argumentName, argumentType] {
            common
                        local       .sizedata
                        local       .sizetags
                        proc        methodFullName
                        .sizedata = $00000000
                        .sizetags = $00000000
            reverse
            if ~ "" eq `argumentName
                if ~ "" eq `argumentType
                                label       .#argumentName at rbp+.sizedata+$20
                                label       .#argumentName#.tag at rdi+.sizetags+$02
                    if(argumentType in <long8, double8>)
                                    .sizedata = .sizedata+$40
                                    .sizetags = .sizetags+$04
                    else if(argumentType in <int8, long4, float8, double4>)
                                    .sizedata = .sizedata+$20
                                    .sizetags = .sizetags+$02
                    else
                                    .sizedata = .sizedata+$10
                                    .sizetags = .sizetags+$01
                    end if
                end if
            end if
            common
                        .arg.data = .sizedata
                        .arg.tags = .sizetags
                        .loc.data = $00000000
                        .loc.tags = $00000000
        }

        macro loc [localvarName, localvarType] {
            forward
            if(localvarType in <long8, double8>)
                            .loc.data = .loc.data+$40
                            .loc.tags = .loc.tags+$04
            else if(localvarType in <int8, long4, float8, double4>)
                            .loc.data = .loc.data+$20
                            .loc.tags = .loc.tags+$02
            else
                            .loc.data = .loc.data+$10
                            .loc.tags = .loc.tags+$01
            end if
                        label       .#localvarName at rbp-.loc.data
                        label       .#localvarName#.tag at rdi-.loc.tags
        }

        macro alias aliasFullName*, methodFullName* {
                        label       aliasFullName at methodFullName
                        label       aliasFullName#.D.IEND at aliasFullName
                        aliasFullName#.arg.data = methodFullName#.arg.data
                        aliasFullName#.arg.tags = methodFullName#.arg.tags
        }

        macro impl classFullName*, serviceFullName* {
            classFullName#$$impl$$#serviceFullName:
        }
    ; </fold>

    ; <fold данные>
        macro package packageFullName* {
                        align_d     $40
            packageFullName:
              .this:    dq          $0000000000000000, $0000000000000000
                        dq          -.this+avt.lang.Package, $0000000000000000
        }

        macro class classFullName* {
                        align_d     $40
            classFullName:
              .this:    dq          $0000000000000000, $0000000000000000
                        dq          -.this+avt.lang.Class, $0000000000000000
        }

        macro dsfld fieldAttributes*, fieldName*, classFullName*, fieldCapacity*, fieldFullName* {
                        dd          fieldAttributes, fieldFullName, fieldCapacity, fieldFullName#.struct
                        dq          -.$sfld$+classFullName
                        dq          -.$sfld$+dbgi$istr.#fieldName
        }

        macro dfild fieldAttributes*, fieldName*, classFullName*, fieldFullName* {
                        dd          fieldAttributes, fieldFullName, $00000000, $00000000
                        dq          -.$dfld$+classFullName
                        dq          -.$dfld$+dbgi$istr.#fieldName
        }

        macro dmeth methodAttributesAndArgumentsLength*, methodName*, classFullName*, methodFullName*, argumentsLabel* {
                        dd          methodAttributesAndArgumentsLength
                        dd          -.$dmth$+argumentsLabel
                        dq          -.$dmth$+methodFullName
                        dq          -.$dmth$+classFullName
                        dq          -.$dmth$+dbgi$istr.#methodName
        }

        macro dmeths methodAttributesAndArgumentsLength*, methodSpecName*, classFullName*, methodFullName*, argumentsLabel* {
                        dd          methodAttributesAndArgumentsLength
                        dd          -.$dmth$+argumentsLabel
                        dq          -.$dmth$+methodFullName
                        dq          -.$dmth$+classFullName
                        dq          -.$dmth$+dbgi$istr.$#methodSpecName#$
        }

        macro dprop propertyAttributes*, propertyName*, classFullName*, readSyntheticFullName*, writeSyntheticFullName*, storedSyntheticFullName* {
                        dd          propertyAttributes, $00000000
                        dq          -.$dprp$+storedSyntheticFullName
                        dq          -.$dprp$+classFullName
                        dq          -.$dprp$+dbgi$istr.#propertyName
                        dq          -.$dprp$+readSyntheticFullName
                        dq          -.$dprp$+writeSyntheticFullName
                        dq          $0000000000000000, $0000000000000000
        }

        macro glob globalvarFullName*, globalvarType* {
            if(globalvarType in <long8, double8>)
                            align_d     $40
            else if(globalvarType in <int8, long4, float8, double4>)
                            align_d     $20
            else
                            align_d     $10
            end if
            globalvarFullName:
        }

        macro iconst globalconstFullName*, value* {
                        globalconstFullName = value ; целочисленное значение
        }

        macro sconst globalconstFullName*, value* {
                        globalconstFullName = value ; индекс строки
        }

        macro oconst globalconstFullName*, value* {
                        globalconstFullName = value ; ссылка на данные о типе или пакете
        }

        macro field offset*, fieldFullName* {
                        fieldFullName = offset ; смещение поля в инстанции или в структуре
        }

        macro idxvirt index*, methodFullName* {
                        methodFullName#.idx.virt = index ; индекс виртуального метода
        }

        macro idxserv index*, methodFullName* {
                        methodFullName#.idx.serv = index ; индекс сервисного метода
        }
    ; </fold>

    ; <fold константы>
        macro cons constantBlockFullName*, algn* {
                        align_d     algn
            cons$#constantBlockFullName:
        }
    ; </fold>

    ; <fold ресурсы>
        macro avtrsrc fileRelaPath*, rsrcFullPath* {
                        local       hash
               hash:    dd          $00000000     ; контрольная сумма пути и названия ресурса
                        dw          .endn-.beginn ; длина пути и названия ресурса
            .beginn:    db          rsrcFullPath  ; путь и название ресурса
              .endn:    align_d     $04
                        dd          .endd-.begind ; размер данных ресурса
            .begind:    file        fileRelaPath  ; данные ресурса
              .endd:    align_d     $10
                        .result = 0
                        .base   = 1
            repeat(.endn-.beginn)
                            load        .char byte from .beginn+(%-1)
                            .result = $ffffffff and (.result+.base*.char)
                            .base   = $ffffffff and (.base*$1f)
            end repeat
                        store       dword .result at hash
        }
    ; </fold>

    ; <fold отладочная информация>
        macro dbinfob compilerNameAndVersion* { ; базовая отладочная информация: только данные для построения трассировки стака
                        local       .head
                        local       .cont
              .head:    db          "DBB", $00
                        dd          -.head+.cont
                        db          compilerNameAndVersion, $00
                        align_d     $08
              .cont:    dd          dbgi$istr-.cont
                        dd          dbgi$istr.$iend$-dbgi$istr ; строки — названия членов типов
                        dd          dbgi$isrc-.cont
                        dd          dbgi$isrc.$iend$-dbgi$isrc ; строки — относительные пути к текстам исходного кода
                        dd          dbgi$ient-.cont
                        dd          dbgi$ient.$iend$-dbgi$ient ; соответствия между методами, строками исходного кода и участками машинного кода
        }

        ; <fold > macro dbinfof compilerNameAndVersion* { ; полная отладочная информация: данные для построения трассировки стака + данные обо всех элементах программы
        ;     На данный момент полная отладочная информация не реализована, поскольку нет отладчиков, которые могли бы её использовать.
        ;                 local       .head
        ;                 local       .cont
        ;       .head:    db          "DBF", $00
        ;                 dd          -.head+.cont
        ;                 db          compilerNameAndVersion, $00
        ;                 align_d     $08
        ;       .cont:    dd          dbgi$istr-.cont
        ;                 dd          dbgi$istr.$iend$-dbgi$istr ; строки — названия членов типов
        ;                 dd          dbgi$isrc-.cont
        ;                 dd          dbgi$isrc.$iend$-dbgi$isrc ; строки — относительные пути к текстам исходного кода
        ;                 dd          dbgi$ient-.cont
        ;                 dd          dbgi$ient.$iend$-dbgi$ient ; соответствия между методами, строками исходного кода и участками машинного кода
        ;                 dd          dbgi$ipck-.cont
        ;                 dd          dbgi$ipck.$iend$-dbgi$ipck ; пакеты
        ;                 dd          dbgi$icls-.cont
        ;                 dd          dbgi$icls.$iend$-dbgi$icls ; классы и другие типы
        ;                 dd          dbgi$icns-.cont
        ;                 dd          dbgi$icns.$iend$-dbgi$icns ; глобальные переменные — константы
        ;                 dd          dbgi$igro-.cont
        ;                 dd          dbgi$igro.$iend$-dbgi$igro ; глобальные переменные — только для чтения
        ;                 dd          dbgi$igrw-.cont
        ;                 dd          dbgi$igrw.$iend$-dbgi$igrw ; глобальные переменные — для чтения и записи
        ;                 dd          dbgi$ifld-.cont
        ;                 dd          dbgi$ifld.$iend$-dbgi$ifld ; поля инстанций и структур
        ;                 dd          dbgi$iprp-.cont
        ;                 dd          dbgi$iprp.$iend$-dbgi$iprp ; свойства
        ;                 dd          dbgi$imth-.cont
        ;                 dd          dbgi$imth.$iend$-dbgi$imth ; методы, в том числе служебные методы и методы-операторы
        ;                 dd          dbgi$iloc-.cont
        ;                 dd          dbgi$iloc.$iend$-dbgi$iloc ; локальные переменные методов
        ; } </fold>

        macro distring name* {
                        local       .begin
                        local       .end
            if(used .#name)
                 .#name:    db          -.begin+.end
                 .begin:    db          `name
                   .end:
            end if
        }

        macro distring_s name* {
                        local       .begin
                        local       .end
            if(used .$#name#$)
                .$#name#$:  db          -.begin+.end
                 .begin:    db          '<'
                            db          `name
                            db          '>'
                   .end:
            end if
        }

        macro dientry sourceLabel*, classFullName*, methodName*, methodFullName*, [sourceLine, blockBegin, blockEnd] {
            forward     local       .entry
            if(methodFullName#blockEnd > methodFullName#blockBegin)
                 .entry:    dd          -.entry+methodFullName#blockBegin                  ; смещение начала участка машинного кода
                            dd          -methodFullName#blockBegin+methodFullName#blockEnd ; размер участка машинного кода, в байтах
                            dd          -.entry+dbgi$isrc#sourceLabel                      ; смещение относительного пути к тексту исходного кода
                            dd          sourceLine                                         ; порядковый номер строки исходного кода
                            dd          -.entry+classFullName                              ; смещение данных о родительском типе
                            dd          -.entry+dbgi$istr.#methodName                      ; смещение простого имени метода
                            dd          $00000000                                          ; зарезервировано
                            dd          $00000000                                          ; зарезервировано
            end if
        }

        macro dientry_s sourceLabel*, classFullName*, methodSpecName*, methodFullName*, [sourceLine, blockBegin, blockEnd] {
            forward     local       .entry
            if(methodFullName#blockEnd > methodFullName#blockBegin)
                 .entry:    dd          -.entry+methodFullName#blockBegin                  ; смещение начала участка машинного кода
                            dd          -methodFullName#blockBegin+methodFullName#blockEnd ; размер участка машинного кода, в байтах
                            dd          -.entry+dbgi$isrc#sourceLabel                      ; смещение относительного пути к тексту исходного кода
                            dd          sourceLine                                         ; порядковый номер строки исходного кода
                            dd          -.entry+classFullName                              ; смещение данных о родительском типе
                            dd          -.entry+dbgi$istr.$#methodSpecName#$               ; смещение простого имени метода
                            dd          $00000000                                          ; зарезервировано
                            dd          $00000000                                          ; зарезервировано
            end if
        }
    ; </fold>
; </fold>

; <fold макросы инструкций высокого уровня>
                include     "!inst.inc"
; </fold>