Цитата Сообщение от nzeemin Посмотреть сообщение
Как сделать так чтобы секция DSECT могла использоваться в программе как и сейчас -- т.е. чтобы под неё выделялась память, но чтобы она НЕ включалась в готовый SAV-файл?
Поздно увидел... Ну, может ещё пригодится. Я делал примерно так:
Код:
.MACRO $COMMON NAME=<.$$$$.>
  .PSECT 'NAME', RW, D, OVR, GBL
.ENDM $COMMON
 
.MACRO $CODE
  .PSECT $CODE$, I, RO
.ENDM $CODE
 
.MACRO $IDATA
  .PSECT $IDATA, D, RW
.ENDM $IDATA
 
.MACRO $PDATA
  .PSECT $PDATA, D, RO
.ENDM $PDATA
 
.MACRO $ASCII
  .PSECT $ASCII, D, RO
.ENDM $ASCII
 
.MACRO $VBOT
  .PSECT .99997, D, RW
.ENDM $VBOT
 
.MACRO $VIRT
  .PSECT .99998, D, RW
.ENDM $VIRT
 
.MACRO $VTOP
  .PSECT .99999, D, RW
.ENDM $VTOP
 
.MACRO $USER
.ENDM $USER
 
.MACRO VINIT
  .SAVE
     $VIRT
  .IF NDF ..VB.
    ..VB. =: .
    ..VC. = ^O<0>
    .MACRO $VSET
      .BLKW
      .MACRO $VSET
      .ENDM $VSET
    .ENDM $VSET
  .IFF
    .IF NE ..VC.
      ..VB. =: .
      .WORD ..VC.
      ..VC. = ^O<0>
    .ENDC
    .MACRO $VSET
    .ENDM $VSET
  .ENDC
  .RESTORE
.ENDM VINIT
 
.MACRO V.EVEN
  ..VC.=<..VC.+^O<1>>&^C<1>
.ENDM V.EVEN
 
.MACRO V.ODD
  ..VC.=<..VC.&^C<1>>+^O<1>
.ENDM V.ODD
 
.MACRO V.BLKW LAB LEN=<1>
  VALLOC LAB LEN WORDS
.ENDM V.BLKW
 
.MACRO V.BLKB LAB LEN=<1>
  VALLOC LAB LEN BYTES
.ENDM V.BLKB
 
.MACRO VALLOC LAB LEN UNIT
  .SAVE
    $VIRT
    LAB =: ..VB.+..VC.
    .IF NB LEN
      .IF IDN <LEN>, <BYTE>
        $VSET
        ..VC.=..VC.+^O<1>
        .RESTORE
        .MEXIT
      .ENDC
      .IF IDN <LEN>, <WORD>
        .IIF NE ..VC.&^O<1> .ERROR ; ODD count
        V.EVEN
        $VSET
        ..VC.=..VC.+^O<2>
        .RESTORE
        .MEXIT
      .ENDC
      ..VM.=^O<0>
      .IIF IDN <UNIT>, <BYTES> ..VM.=^O<1>
      .IIF IDN <UNIT>, <WORDS> ..VM.=^O<2>
      .IF EQ ..VM.
        .ERROR ; Invalid units - 'UNIT'
        .RESTORE
        .MEXIT
      .ENDC
      .IF EQ ..VM.-^O<2>
        .IIF NE ..VC.&^O<1> .ERROR ; ODD count
        V.EVEN
      .ENDC
      $VSET
      ..VC.=<'LEN'>*..VM.+..VC.
    .ENDC
  .RESTORE
.ENDM VALLOC
 
.MACRO $ORDER
  .SAVE
    $CODE
    $ASCII
    $PDATA
    $IDATA
    $USER
    $VBOT
    $VIRT
    $VTOP
 
    VINIT
  .RESTORE
.ENDM $ORDER
 
.MACRO ADJUST
  .SAVE
    $PDATA
    .EVEN
    $IDATA
    .EVEN
    $ASCII
    .EVEN
    $VIRT
    V.EVEN
  .RESTORE
.ENDM ADJUST
Библиотечные функции

Код:
; 00009
.INCLUDE /LB:[MACROS]MACROS.MAC/
 
MODULE VM0, VER=03, LIBR=YES, COMM=<Подпрограммы виртуальной памяти>
 
  .IIF DF R$$T11 FROM SYSMAC IMPORT .SETTOP
  .IIF DF R$$11M FROM SYSMAC IMPORT GREG$S, EXTK$S
 
  EXPORT QUALIFIED VTOP, INIVM, CLRVM, CLRMEM
 
  ;+
  ;
  ; INIVM - Инициализация системы вирт. памяти
  ;   Вход:
  ;   Выход:
  ;     VTOP - Первый неиспользуемый байт памяти
  ;
  ;
  ; CLRVM - Обнуление вирт. памяти
  ;   Вход:
  ;   Выход:
  ;
  ;
  ; CLRMEM- Обнуление области памяти
  ;   Вход:
  ;     R1 - Стартовый адрес
  ;     R2 - Длина в байтах
  ;   Выход:
  ;
  ;-
 
  $IDATA
    VTOP: .BLKW
 
  $VBOT
    BOT:
 
  $VTOP
    TOP:
      MOV  #240, INIVM     ; !!!   NOP  !!!
      MOV  #207, INIVM+2   ; !!! RTS %7 !!!
 
      MOV  #BOT, VTOP
      PUSH R0
      MOV  #TOP, R0
      SUB  #BOT, R0
      IF RESULT IS EQ THEN
        POP  R0
        RETURN
      END
      .SAVR1
      ASR  R0
      MOV  #BOT, R1
      CLR  R2
      THRU R0
        ADD  (R1)+, R2
      END
      .IF DF R$$T11
        ADD  #TOP-2, R2
        .SETTOP R2
        IF R2 HIS R0 THEN
          ADD  #2, R2
          MOV  R2, VTOP
        END
      .ENDC
      .IF DF R$$11M
        ADD  #TOP, R2
        MOV  #TOP, R3           ; получить размер задачи в памяти
        GREG$S , R3             ; от Executive'а
        MOV  G.RGRS(R3), R3
        ASH  #6, R3             ; в байты
        SUB  R2, R3
        NEG  R3
        ADD  #100, R3           ; выравнивание
        ASH  #-6, R3            ; в кол-во 100(8) байтных блоков
        EXTK$S R3               ; расширить
        MOV  #TOP, R3           ; получить новый размер задачи
        GREG$S , R3             ; от Executive'а
        MOV  G.RGRS(R3), R3     ; в R1
        ASH  #6, R3             ; в байты
        CMP  R3, R2             ;
      .ENDC
      POP R0
      RETURN
 
  PROCEDURE INIVM
  BEGIN
    JMP TOP
  END INIVM
 
  PROCEDURE CLRVM
  BEGIN
    PUSH <R1, R2>
    MOV #BOT, R1
    MOV VTOP, R2
    SUB R1, R2
    ADD #2, R2
    CALL CLRMEM
    POP <R2, R1>
    RETURN
  END CLRVM
 
  PROCEDURE CLRMEM
  BEGIN
    PUSH <R1, R2>
 
    IF #1 SET.IN R1 THEN
      CLRB (R1)+
      DEC R2
    END
 
    ASR R2
    ROL -(SP)
 
    THRU R2
      CLR (R1)+
    END
 
    ROR (SP)+
    IF RESULT IS CS THEN
      CLRB (R1)+
    END
 
    POP <R2, R1>
    RETURN
  END CLRMEM
 
END VM0
 
.END

Пример использования

Код:
  ;
  ;  MODULE VM0
  ;
 
  PROCEDURE  INIVM    EXTERNAL
  PROCEDURE  CLRVM    EXTERNAL

  $VIRT
 
    V.BLKW ELDEST REST
    V.BLKW ELD    NCODES
 
    V.BLKB CHARS  REST
    V.BLKB CHAR   NCODES
      V.EVEN

  ...

  PROCEDURE MAIN
 
  BEGIN
    CALL INIVM
    ON.ERROR THEN
      PRINT$ #PRFX, #'$
      PRINT <Не хватает памяти>, #'+
      EXIT$S
    END
    LOOP
      CALL CLRVM
      ...
    END
  END MAIN
- - - Добавлено - - -

Ещё мне память подсказывает, что вроде начиная с какой версии MACRO-11 появилась .VSECT, с аналогичным поведением (место в готовой проге не выделяется), но.. надо вспоминать - так ли это и как работать...

- - - Добавлено - - -

Или это было с прицелом на FORTRAN с VIRTUAL объявлением под RSX...

- - - Добавлено - - -

Не, похоже такое мог делать только компилятор с FORTRAN. MACRO послал

- - - Добавлено - - -

Цитата Сообщение от AFZ Посмотреть сообщение
А вот в том виде, в каком эта задача поставлена, она не решается вообще...
Никогда не говори Никогда