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.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября