|
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.
Другие статьи номера:
Похожие статьи:
В этот день... 1 февраля
Joint #01,
Spectrum Magazine #02,
Screamergy #02,
Scream #03,
ZX Time #07,
TargeT #08,
Black Crow #05,
X-Magazine #18,
KrNews #13,
Adventurer #12,
Micro #26,
C-Net Week #20,
X-Magazine #09,
Zodiac #01,
Think #25,
Default #01,
Hobby #01,
Adventurer #07,
Gorodok #03,
C-Net Week #10,
Cheat #01,
SpecInfo #04,
Echo #04,
X-Files #01,
X-Files #01,
Nicron #18,
ZX News #01,
Spectrofon #02