|
Insanity
#01
20 июля 1999 |
|
RAM Project - соображения Zetter'a о RAM Disk'e.

(R) Surv!v0r
ЁёЄєЇїЎў°∙·√№¤■█ RAM PROJECT █■¤№√·∙°ўЎїЇєЄёЁ
Сегодня в нашем номере мы представляет вам возможность
ознакомиться с проектом Zetter'a (автора известной и популярной
программы SSO1.0) "Mенеджер верхней памяти". Система изложенного
материала довольно специфичина и потребует много времени для
ознакомления с ней. Опубликованная в SC#1 статья и программа
Flying'a о такой же проблеме поможет сравнить вам две эти
системы Ram Disk'a. Свою реализацию программа или, даже, можно
сказать "ядро" нашлo(a) пока только на бумаге. В принципе сами
идеи должны быть понятными.По словам самого Zetter'а, данный
инструментарий позволит сделать в ближайшее время новую версию
программы SSO.
(C) Zetter
Memory Manager for 128/1024k Mashines
Project Version 0.5 (c) Zetter 1999
Technical info:
Max Memory :1024k
Max Work Memory: 512k (inside VirtMem)
Max Special Memory :512k (used for special bloks and free use)
Max Bloks :256 bloks
Max Free Bytes : 512k bytes for programs and data + 480k for spe-
cial use
Max Continuous mem available : 16128 bytes
Max Continuous Mem available in special mode: 16384 bytes
════════════════════════════════════════════════════════════
Page Map
49152 65408 65535
┌───────────────────────────────────────────────────┬────┐
n│ 16256 │128 │
└───────────────────────────────────────────────────┴────┘
Каталог на странице
65408:START CATALOGUE
+0:b - unit (логический номер)
+1:\"MMv0.50"
+7:/
65416:BLOK TABLE F
(+0)+8 :b - номер блока (0 - free) /-^-\
(+1)+9 :b - blok flag: 0 - free ┌─┬─┬─┬─┬─┬─┬─┬─┐
1 - (M)emory │X│V│ │ │ │S│P│M│
2 - (P)rogram └─┴─┴─┴─┴─┴─┴─┴─┘
4 - (S)prite 7 6 5 4 3 2 1 0
7 - (F)ull blok
+128 - fi(X)ed Блок,фиксирован на этой
странице
+ 64 - (V)irtual memory blok
блоки Program фиксируются по фдресу и странице
блоки Fixed фиксируются только по странице
(+4)+10:w- addr in page
(+2)+12:w- blok lenght (if flag=4 then Xlen,Ylen)
(+6)+14:w- Start addr:
'родной' адрес для memory or program,
Xzn_scr,Yzn_scr для sprite
Типы памяти
RAM512 - память в компьютерах 128-1024к, размером до 512к,т.е.
32 страницы
не учитывая удаленные страницы (2,5 и т.д.)
RAM1024 - память в компьютерах с 1024к, оставшаяся после
создания RAM512
────────────────────────────────────────────────────────────────
In 48k Memory:
Memory Map : создающая функция :InitMem & AddPage
Mem_Map
+000:b Unit/Full - 256 раз
+...
+255:b Unit/Full
Unit/Full format: 7 6 5 4 3 2 1 0
┌─┬─┬─┬─┬─┬─┬─┬─┐
│F│V│U│U│U│U│U│U│
└─┴─┴─┴─┴─┴─┴─┴─┘
U - логический номер страницы 0-63
F - Full:этот блок занимает всю страницу (16K) 1/0
V - Virtual page 1 - yes 0 - no
#FF - к этому номеру блок не прикреплен
формат номеров блоков : по порядку.
таблица свободной памяти: (len 1024 bytes (512k available))
создающая функция:InitMem & AddBloks
FreeTab ;unit 0 - логическая страница 0
+0:w - start free bytes 1 ;начало свободного места в
unit 0,свободный
блок 0. '0' - нет этого блока
+2:w - lenght free bytes 1 ;длина свободного места в unit 0,свободный
блок 0. '0' -нет этого блока
...
+28:w - start free bytes 8
+30:w - lenght free bytes 8
;logical unit 1,2 ... 32 повтор для всех логических страниц.
Места под несуществующие страницы содержат #FF
Таблица логических страниц (временная)
создающая функция: TestMem
разрушается до 'таблиц существующих страниц': TestMem
PageTab (порядковый номер - логическая,содержимое - физическая)
+0:b - '0'
+1:b - '1'
...
+63:b - '63'
Таблица существующих страниц RAM512
создающая функция: TestMem.
PageTab512 (порядковый номер - логическая,содержимое-физическая)
+0:b - unit 0
+1:b - unit 1
...
**+?:b - последняя физическая страница(bit 7-ON:Virtual Page)
**+? - последняя логическая страница
+?:#FF - маркер конца RAM512
Таблица существующих страниц RAM1024
создающая функция: TestMem.
PageTab1024 (порядковый номер - логическая,содержимое - физичес-
кая страница)
+0:b - page 0 (если этот байт 0 - не найдена память RAM1024)
+1:b - page 1
...
+?:b - последняя физическая страница в памяти 512-1024k
+?:#FF - маркер конца RAM1024
Таблица FULL блоков (если есть RAM1024) 64 байта
+00:b - логический номер RAM1024 страниицы
+01:b - 0- пусто, 1- FULL blok,#FF - физическое отсутствие
страницы
....
+62:b
+63:b
════════════════════════════════════════════════════════════════
FUNCTIONS
────────────────────────────────────────────────────────────────
1. Saving functions: функции создания и записи блоков
Standart Input:
A - blok flag M P S F
HL- Start addr (Xzn_scr,Yzn_scr) NOR 001 002 004 007
BC- Lenght (Xlen,Ylen) FIX 129 130 132 -
Standart Output:
A - номер блока (0-out of memory) VIR 065 066 068 071
[DE - адрес блока в странице]* F+V 193 194 196 -
(на период отладки А=255 - error i/o)
*функция возвращает это значение
1.1 ClearPage
Input: none
Output: A=any - ok ; 0 - out of memory
Очищает какую-то страницу памяти от блоков. Следующая
за ClearPage команда Put??? положит блок именно на эту ,уже очи-
щенную страницу в адрес 49152. Необходима для загрузки программ
в память. Последовательность действий:1. Clear page 2. Put???
(заняли место под кодовый кусок программы) 3. PutTo A=(Put???)
(привязались к програмному блоку) 4. Put???,Put???... (подгружа-
ем данные в ту же страницу, где лежит программа) 5. PutTo A=0
(отключаем привязку)
1.2 PutTo
Input: A - номер блока, к которому осуществляется фик-
сация. 0 - отменить действие команды
Output: A = 0 - ok ;#FF - not found ;other - error i/o
Позволяет писать блоки в страницу, на которой лежит блок A
Действие команды долговременное, отменяется передачей 0 в ка-
честве параметра. При включенной привязке может резко упасть
скорость работы из-за необходимости частого выполнения ClearPage
т.к. память будет искаться в пределах одной 16к страницы. Для
вновь создаваемых блоков автоматически выполняет функцию FixBlok
1.3 Put start_adres,lenght,flag
Standart i/o*
создает блок и возвращает все параметры блока
1.4 PutReal
Standart i/o
создает блок и перемещает его в RAM512
────────────────────────────────────────────────────────────────
2. Load Functions: функции чтения блоков
Standart input : A - номер блока
Standart output: HL- адрес блока в странице
DE- параметр блока Start Addr
BC- длинна блока
A - 0 - ok, #FF - Not Found ,
Other - error i/o
2.1 Get
Standart i/o
возвращает все параметры блока
2.2 GetReal
Standart i/o
перемещает блок из памяти в 'Start Addr'
─────────────────────────────────────────────────────────────────
3.Other functions
3.1 DelBlok
Input : A - номер блока
Output: A - 0 - ok, #FF - Not Found , Other - error i/o
удаление блока. номер блока удаляется из карты памяти MemoryMap
3.2 FixBlok
Input : A - номер блока
Output: A - 0 - ok, #FF - Not Found , Other - error i/o
Фиксирует блок А на той странице, на которой он находится путем
проставления флага Fi(X)ed в BlokFlag. С этим блоком не будут
работать функции MoveMem и ClearPage
3.3 AutoFlush
Input : A=1 : ON; A=0 : OFF
Output: none
В состоянии ON пытается самостоятельно разобраться с
ошибкой команд Put??? - out of memory, не терроризируя приклад-
ную программу диким количеством вышеупомянутых сообщений. Рабо-
тает с функциями FlushMem и MoveMem, пытаясь найти место для
блока. В случае невозможности этого все-таки выдает ошибку, пре-
доставляя прикладной программе самостоятельно нажать на reset
;-) В этом случае программе рекомендуется освободить какие-то
ненужные блоки типа undo buffer и повторить попытку Put??? В
состоянии OFF система не делает никаких попыток освободить па-
мять, предоставляя эту почетную обязанность прикладной программе
────────────────────────────────────────────────────────────────-
ВНИМАНИЕ !!!!!
НЕ РЕКОМЕНДУЕТСЯ злоупотреблять фиксацией блоков
и программными блоками ! Помните , что ваша программа может быть
запущена и на 128к машине !!! Вероятность переполнения памяти
прямо пропорциональна количеству Program и Fixed блоков !!!! Ис-
пользуйте эту возможность ТОЛЬКО в случае необходимости !!!!
ПРИМЕНЕНИЕ VirtMem для увеличения количества доступной памяти
может вызвать шоковое состояние у пользователя вашей программы.
Если вы вс-таки решились на столь героический поступок, то не
забывайте использовать функции PutVirt??? ТОЛЬКО для тех блоков,
которые ПЛАНИРУЕТЕ помещать на VirtMem. Как правило это должны
быть блоки, используемые крайне редко, типа уровней, подгружае-
мых к игре или каких то внешних функций в системной программе
─────────────────────────────────────────────────────────────────
4. Memory Functions: функции работы с памятью блоков (RAM512)
Названия памати:RAM512 - 48-512k pages
RAM1024 - over 512k RAM pages
Virt - Virtual (disk) pages.
Если RAM >128k ,Virt mem НЕ ИСПОЛЬЗУЕТСЯ
4.1 FreeMem
Input : none
Output: HL - Всего свободной памяти
DE - свободной RAM512
BC - свободной RAM1024
IX - свободной VirtMem
4.2 MaxMem
Input : none
Output: HL - максимальная непрерывная область в RAM512
4.3 FlushMem
Input : none
Output: HL - максимальная непрерывная область в RAM512
Перемещает НЕ PROGRAM блоки в пределах одной страницы. Дает мак-
симальную непрерывную память в RAM512 Эта функция не работает с
Virt memory.
4.4 MoveMem
Input : none
Output: HL - максималиная непрерывная память в RAM512 Пе-
ремещает НЕ PROGRAM и НЕ FIXED блоки из странички в страничку
для получения реально возможной непрерывной памяти. Выполняется
в критической ситуации нехватки памяти либо при вызове ClearPage
Эта функция не работает с Virt memory.
4.5 FlushPage
Input : A - номер блока, чью страничку вы хотите очистить
Output: HL - максимальная непрерывная память в этой стра-
ничке Перемещает НЕ PROGRAM и НЕ FIXED блоки ,исключая блок А из
этой страницы на другие страницы. Дает максимальную память на
одной странице для размещения фиксированных блоков Эта функция
не работает с Virt memory.
A - 0 - ok, #FF - not found, other - error i/o
────────────────────────────────────────────────────────────────-
5. Initialise Functions: функции инициализации
Эти функции используются для начального старта программы
*5.1 TestMem ()
Input :HL - табличка PageTab (автоустановка)
Output:HL - табличка PageTab512
DE - табличка PageTab1024 (DE)=0 - RAM1024 нет
A - общее число доступных страниц,дубль в(ALLPAGES)
Определяет доступную память компьютера.Не разрушает дан-
ные в страничках.Устанавливает (MEMTYPE)
*5.2 DelPage pagetab???,page
Input : HL - Табличка RAM512 или RAM1024
A - физический номер страницы для удаления
Output: A - 0 : ok ;#FF - not found; other - error i/o
5.3 AddBloks
Input : A - логический номер страницы для добавления в
Структуру Каталогов блоков
Output: A = 0 : ok ;A =other-эта страница не содержит
Структуры Блоков A = #FF - не найдена страница или i/o error
Функция для программистов под Memory Manager. Добавляет создан-
ную вручную страницу с блоками в MemoryMap
*5.4 InitMem ()
Input : HL - табличка RAM512
Output: A = 0 : ok
a = #FF: error i/o
Создает структуру КАТАЛОГОВ на свободных страничках
RAM512 и помещает их в MemoryMap. Пропускает страницы, занятые
под блоки Занятые страницы определяются по сигнатуре "?MMv?." c
49152
5.6 CreateVirtMem
Input :HL - начало БАЗОВОГО ИМЕНИ:
- 8 символов имени файла
B - число добавляемых Virt Pages
Output:A - 0 - ok ,other- i/o error
Если НЕ существуют, записывает файлы Virtual Mem на диск.
5.5 AddVirtPage
Input :A - число добавляемых Virt pages
HL- адрес структуры:
0-7:name \
8 :Virtual page number |
9 :Start adres (49152) |
10 : \
11 :bytes len(16384) /16 bytes TR-DOS name
12 : |
13 :Sector len (64 |
14 :Start track |
15 :Start sector /
. . .
Output:A - 0 - ok ,other- i/o error
Очищает каталоги и добавляет Virt pages в MemoryMap.
────────────────────────────────────────────────────────────────
6. Внутренние функции
6.1 SearchByte : in - HL - старт
А - байт
out- HL - адрес
А - байт или #FF - не найден
corrupt:B
Поиск байта от HL до (A) или до первого #FF
────────────────────────────────────────────────────────────────
Переменные:
ALLPAGES.b - общее число доступных страниц
MEMTYPE.b - тип найденной памяти 0 - нет RAM1024 ,1 - есть
PageTab512.w - указатель на начало таблицы RAM512.
PageTab1024.w - указатель на начало таблицы RAM1024,если содер-
жит 0 - нет памяти RAM1024
BlokF.b - флаг текущего блока
BlokST.w - стартовый адрес текущего блока
BlokL.w - Длина текущего блока
BlokLOG.b - логическая страница для текущего блока
BlokNUM.b - номер текущего блока
BlokPAGE.w - Место текущего блока на странице
BlokFTab.w - адрес свободного пространства для текущего блока
Другие статьи номера:
Похожие статьи:
В этот день... 13 ноября