DonNews #07
23 апреля 1999

Кодинг - Определение номера страницы верхней памяти.

──────────────────────────────────────────
Snake\OHG

                 Кодинг.

   Кодинг,это конечно,громко сказано.Здесь
будет  просто  одна  небольшая  програмка,
которая,   думаю,    кому-нибудь     может
пригодиться.
   Когда я писал одну небольшую прогу  под
кэш, с  помощью  которой  при  нажатии  на
Magic можно было запустить boot, или войти
в STS  (сначала  я  хотел  в  этот  раздел
поместить её, но потом передумал, но  если
кто-нибудь захочет, то в  следующий  номер
можно поместить и  её). При  входе  в  STS
сохранялись все регистры, адрес прерванной
программы, адрес стека, но номер  страницы
верхней  памяти   взять   было   неоткуда.
Поэтому пришлось определять её програмно.

   Вот и листинг этой программы:

FPG     LD      DE,(#C000)
        LD      BC,#7FFD
        LD      #C000,BC
        LD      A,#D7
FPG1    INC     A
        BIT     3,A
        JR      Z,FPG2
        ADD     A,#38
FPG2    OUT     A
        LD      HL,(#C000)
        AND     A
        SBC     HL,BC
        JR      NZ,FPG1
        LD      #C000,DE
        ...

   Немного   пояснений:  в   регистре   DE
запоминается 2  байта  с  адреса  #C000, в
регистре  A  номер  страницы   с   которой
начинается поиск, #D7 - чтобы  при  первом
сложении  получить  #10   (так   программа
занимает на  2  байта  меньше). По  адресу
#C000  заносятся  два  байта  #FD, #7F, по
которым  будем  искать  нужную   страницу.
Затем  начинаем  по  порядку   переключать
страницы и сравнивать два байта по  адресу
#C000 с содержимым регистра BC, как только
всё  совпало, то   страница   найдена.  На
выходе в регистре A будет находиться номер
страницы при  которой  была  запущена  эта
программа.
   Программа занимает  всего  34  байта  и
расчитана на 512кб с расширением  по  двум
старшим битам порта #7FFD.Строка ADD A,#38
предназначена для того, чтобы обнулить  3й
бит и увеличить  на  1  два  старших  бита
регистра  A, которые   будут   переключать
дополнительную память.
   Естественно, на 128й  машине  программа
будет так-же работать нормально.
   Недостатки: всётаки   может   получится
так,что байты #FD, #7F, по которым ведётся
поиск, могут быть  и  в  другой  странице.
Тогда, если её  номер  меньше, определение
происходит  неправильно,  и   в   странице
которую  надо  было  найти  испортится   2
байта.
   Ну и конечно, никак не определишь какой
был включен экран.

   P.S: OUT A = OUT (C),A
        LD #C000,BC = LD (#C000),BC
        XAS = RULEZ.




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

Похожие статьи:
Ремонт - История ремонта принтера DAEWOO DP-2210.
Отдохнем - Однажды на лекции.
С миру по биту - интервью с известным Белорусским программистом и музыкантом IMP.

В этот день...   22 сентября