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



Другие статьи номера:

3d2f или 3d30 - TR-DOS путешествие в мир заблуждений.

CC'999 Report - отчет Петра Соболева о тусовке сцены.

Creditz - доска почета.

Land of Promotion - анонс готовящейся адвентюрной игры.

Light Future News - Новости группы.

Now & Forever - малоизвестные факты из жизни звезд.

RAM Project - соображения Zetter'a о RAM Disk'e.

Uni Hhrust Finder - рассказ об утилите Оrc'a для поиска файлов запакованных.

В номере - Содержание номера.

Колонка редактора - История создания газеты.

Лекция Филолога - повествование на тему "плыв англо-американской речушки" основанное на жизненном опыте и чувстве юмора.

Новелла по игре "Land of Dark" - авторская новелла.

Перлы - рубрика, рассказывающая о высказываниях известных людей.

Приложение - десерт на затравку.

С Битой по миру - критическое разоблачение "Компьютерная энциклопедия для мальчиков".


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Заключение - Пожалуй для первого раза достаточно.
И снова party 2 - результаты Paradox'2002 demoparty.
Новелла - Этa новeллa - мои пeрвыe шaги нa литeрaтурном поприщe...

В этот день...   23 июля