Сообщение от
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
А вот в том виде, в каком эта задача поставлена, она не решается вообще...
Никогда не говори Никогда