──────────────────────────────────────────
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.