;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold макроинструкции для вставки таблиц импорта — в соответствии со спецификацией формата исполняемого модуля>
macro pelibrary [liblabel, libname] {
forward
local lnlabel
if((defined liblabel#.redundant) & ~(liblabel#.redundant))
dd rva(liblabel#.lookup)
dd $00000000
dd $00000000
dd rva(lnlabel)
dd rva(liblabel#.address)
end if
liblabel#.referred = 1
common
dd $00000000, $00000000, $00000000, $00000000, $00000000
forward
if((defined liblabel#.redundant) & ~(liblabel#.redundant))
lnlabel: db libname, $00
rb rva($) and $01
end if
}
macro peimport liblabel*, [funclabel, funcname] {
common
rb (-rva($)) and $07
if(defined liblabel#.referred)
liblabel#.lookup:
forward
local fnlabel
if(used funclabel)
if(funcname eqtype "")
dq rva(fnlabel)
else
dq $8000000000000000+(funcname)
end if
end if
common
if($ > liblabel#.lookup)
dq $0000000000000000
liblabel#.redundant = 0
else
liblabel#.redundant = 1
end if
liblabel#.address:
forward
if(used funclabel)
funclabel:
if(funcname eqtype "")
dq rva(fnlabel)
else
dq $8000000000000000+(funcname)
end if
end if
common
if(~(liblabel#.redundant))
dq $0000000000000000
end if
forward
if(used funclabel & funcname eqtype "")
fnlabel: dw $0000
db funcname, $00
rb rva($) and 1
end if
common
end if
}
; </fold>