Интересно, а Вы с программами UL разбирались? Откуда такие измышления:
.CODE ; Сегмент кода
.386
Где Вы видели программы для контроллеров, программируемых с помощью UL (16, 32) для процессоров 386. Если все программы пишутся для .86, .186? В ADAM 5510 188 процессор.
<С переходом на 32-х разрядную среду надобность во всех этих сегментах отпадет - там одна плоская модель памяти FLAT.>
Какая может быть модель памяти FLAT в 16 разрядной среде исполнения?
Почитайте для начала раздел справки "Системные соглашения UltraLogik" из файла помощи UL.
Привожу пример минимальной программы для ADAM 5510 на чистом ASM. Единственно, я использовал библиотеку собственного написания ADAM5510.LIb в которой реализован протокол обмена PlcNet (взамен стандартной из 80x86.LIB)
; =======================================
DGROUP group CONST,VARLIST,DATA,STORED
; ======================================
includelib 80x86.LIB
includelib ADAM5510.LIb
; ===================================
extrn $_InitDivErr:near ;
extrn $_InitTimer5510:near ;
extrn $_InitRS5510_1:near ; $_$_InitRS5510_1:near
extrn $_InitRS5510_2:near ; $_InitRS5510_2:near
extrn $_DoneRS5510_1:near ; $_$_DoneRS5510_1:near
extrn $_DoneRS5510_2:near ; $_DoneRS5510_2:near
extrn $_DoneTimer5510:near ;
extrn $_DoneDivErr:near ;
;--------------------------------------------------------+++
extrn STimer_enable:near ; Активация сторожевого таймера (near)
extrn STimer_disable:near ; Отключение сторожевого таймера (near)
extrn STimer_clear:near ; Сброс сторожевого таймера (near)
;--------------------------------------------------------+++
; ==============================
SYSTEM segment byte public 'CODE' use16
assume ds:DGROUP, cs:SYSTEM
public P1_PROG
P1_PROG proc near ; CODE XREF: $_Cycle+7p
mov al, VX1_VAR
mov VIX1_VAR, al
mov al, VX2_VAR
mov VIX2_VAR, al
mov al, VX3_VAR
mov VIX3_VAR, al
retn
P1_PROG endp
public $_StartUp
$_StartUp proc near
call $_InitDivErr ; $_InitDivErr
call STimer_enable ; Активация сторожевого таймера (near)
call $_InitTimer5510
mov dx, 138h ; Записываем в dx адресс DIP-пеключателя (138h)
in al, dx ; Считываем бит код сетевого адреса из порта (138h)
mov $_NetNode, al ; Записываем в $_NetNode бит код сетевого адреса
mov bx, 7
call $_InitRS5510_1 ; $_$_InitRS5510_1
mov bx, 7
call $_InitRS5510_2 ; $_InitRS5510_2
retn
$_StartUp endp
public $_Cycle
$_Cycle proc near
cmp P1_STATUS, 0 ; Сравнение (статус программы P1) = 0 (отключена)
jz STATUS_P1_0 ; если ноль, то переход на метку STATUS_P1_0
call P1_PROG ; запуск программы P1
STATUS_P1_0:
call STimer_clear ; Сброс сторожевого таймера (near)
retn
$_Cycle endp
public $_DoneProg
$_DoneProg proc near
call $_DoneRS5510_1 ; $_$_DoneRS5510_1
call $_DoneRS5510_2 ; $_DoneRS5510_2
call $_DoneTimer5510
call STimer_disable ; Отключение сторожевого таймера (near)
call $_DoneDivErr ; $_DoneDivErr
retn
$_DoneProg endp
SYSTEM ends
; ==========================================
CONST segment byte public 'DATA' use16
assume ds:DGROUP ;, cs:CONST
public $_ProjectName
$_ProjectName db ' Masm 6.11 - K22_M.asm "Nazarov V.D."$' ; Название проекта
public $_CompileTime
$_CompileTime db 'Meu4' ;
public $_NetNode
$_NetNode db 1 ; Сетевой адресс с DIP-переключателя
CONST ends
; =====================================
; Segment type: Pure data
VARLIST segment byte public 'DATA' use16
assume ds:DGROUP ;, cs:VARLIST
;org 20h
public ERR_SEG_NAME
ERR_SEG_NAME db 7,'ERR_SEG' ;
public INTEGER_TYPE
INTEGER_TYPE db 7,'INTEGER' ;
public ERR_OFS_NAME
ERR_OFS_NAME db 7,'ERR_OFS' ;
public VX1_NAME
VX1_NAME db 3,'Vx1' ;
public BOOLEAN_TYPE
BOOLEAN_TYPE db 7,'BOOLEAN' ;
public UP_NAME
UP_NAME db 2,'Up' ;
public VIX1_NAME
VIX1_NAME db 4,'Vix1' ;
public VX2_NAME
VX2_NAME db 3,'Vx2' ;
public VIX2_NAME
VIX2_NAME db 4,'Vix2' ;
public VIX3_NAME
VIX3_NAME db 4,'Vix3' ;
public VX3_NAME
VX3_NAME db 3,'Vx3' ;
public $_CntNetworkVar
$_CntNetworkVar db 9 ;
db 0 ;
public $_LstNetworkVar
$_LstNetworkVar dw offset ERR_SEG_NAME
dw offset ERR_SEG_VAR
dw offset INTEGER_TYPE
db 1 ;
db 7 ;
dw offset ERR_OFS_NAME
dw offset ERR_OFS_VAR
dw offset INTEGER_TYPE
db 1 ;
db 7 ;
dw offset VX1_NAME
dw offset VX1_VAR
dw offset BOOLEAN_TYPE
db 0 ;
db 3 ;
dw offset UP_NAME
dw offset UP_VAR
dw offset BOOLEAN_TYPE
db 0 ;
db 2 ;
dw offset VIX1_NAME
dw offset VIX1_VAR
dw offset BOOLEAN_TYPE
db 0 ;
db 4 ;
dw offset VX2_NAME
dw offset VX2_VAR
dw offset BOOLEAN_TYPE
db 0 ;
db 3 ;
dw offset VIX2_NAME
dw offset VIX2_VAR
dw offset BOOLEAN_TYPE
db 0 ;
db 4 ;
dw offset VIX3_NAME
dw offset VIX3_VAR
dw offset BOOLEAN_TYPE
db 0 ;
db 4 ;
dw offset VX3_NAME
dw offset VX3_VAR
dw offset BOOLEAN_TYPE
db 0 ;
db 3 ;
VARLIST ends
; ====================================
; Сегмент 'DATA'
DATA segment byte public 'DATA' use16
assume ds:DGROUP ;, cs:_DATA
;org 0B0h
public ERR_SEG_VAR
ERR_SEG_VAR dw 0 ; ; DATA XREF: VARLIST:0062o
public ERR_OFS_VAR
ERR_OFS_VAR dw 0 ; ; DATA XREF: VARLIST:006Ao
public VX1_VAR
VX1_VAR db 1 ; DATA XREF: P1_PROGr VARLIST:0072o
public UP_VAR
UP_VAR db 1 ; ; DATA XREF: VARLIST:007Ao
public VIX1_VAR
VIX1_VAR db 0 ; DATA XREF: P1_PROG+3w VARLIST:0082o
public VX2_VAR
VX2_VAR db 1 ; DATA XREF: P1_PROG+6r VARLIST:008Ao
public VIX2_VAR
VIX2_VAR db 0 ; DATA XREF: P1_PROG+9w VARLIST:0092o
public VIX3_VAR
VIX3_VAR db 0 ; DATA XREF: P1_PROG+Fw VARLIST:009Ao
public VX3_VAR
VX3_VAR db 1 ; DATA XREF: P1_PROG+Cr VARLIST:00A2o
public P1_STATUS
P1_STATUS db 1 ; DATA XREF: $_Cycler
DATA ends
; ==============================
; Сегмент "Сохраняемые переменные"
STORED segment byte public 'DATA' use16
public StoredEnd
StoredEnd label byte
STORED ends
; ==========================
; Сегмент "Стек"
STACK segment para stack 'STACK' use16
assume ds:DGROUP ;, cs:STACK
db 1000h dup(?) ;
STACK ends
end
Такую же программу и генерирует UL 16.