(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 - адрес свободного пространства для текущего блока