|
Секреты TR-DOS - Использование процедур TR-DOS без системных переменных.
|
Секреты TR-DOS
Использование процедур TR-DOS без системных переменных.
© Тимоти, С.Петербург, 1995.
Мне ужасно интересно, почему у нас в стране так мало программ в которых предусмотрена отгрузка состояния на диск. В основном, это относится к адвентюрам. Полностью дисковых адвентюр катастрофически нехватает. Только не говорите мне, что у нас нет людей, способных эту работу выполнить! Многие игры адаптируются к диску вообще по точке входа #3D13 (SPIDERMAN, SEAS OF BLOOD, OPERATION NIGHT и другие). А такие, как THE HULK, SHERLOCK, LORD OF RING 1,2 вполне спокойно адаптируются путем прямого управления контроллером. Процедуру чтения блока секторов без использования системных переменных TR-DOS и всяких там буферов можно взять хотя бы из 2Х-РЕВЮ-94 № 4, стр. 9, или ZX-FORUM 1, стр. 52 (см. также исправления в ZX-РЕВЮ-95, № 2, стр. 39). Процедуру записи я привожу в Листинге_1. Она, правда, имеет некоторые ограничения общего плана: В регистре IY должно быть #5C3A. При запуске из Бейсика проблем не будет (в IY и так #5C3A), а вот при запуске из глубины кодового блока игры это необходимо контролировать. Предлагаемая процедура использует-таки пять ячеек системных переменных, однако сама же их сохраняет и восстанавливает после завершения работы. Процедура записи работает на прошивках TR-DOS версий 5.03 и выше.
Листинг_1.
SAVE
L3
Теперь об использовании процедуры. На входе в нее в HL должен быть задан адрес в памяти, с которого необходимо начать запись. В регистре DE соответственно начальный трек (логический, 0-159) и сектор (0-15) для записи. В регистре B - количество записываемых подряд секторов.
AAA
DI |
|
L4 |
LD |
HL, 0 |
LD |
(L4 + 1) ,HL |
|
LD |
IX,#3F0A |
LD |
HL,(#5CFE) |
|
( * * * ) |
|
PUSH |
HL |
|
CALL |
DOS |
LD |
HL,(#5C00) |
|
LD |
HL,L4+2 |
PUSH |
HL |
|
INC |
(HL) |
LD |
HL,(#5D00) |
|
POP |
DE |
PUSH |
HL |
|
POP |
BC |
XOR |
A |
|
INC |
E |
LD |
(#5C00),A |
|
BIT |
4,E |
LD |
IX,#2F65 |
|
JR |
Z, L5 |
CALL |
DOS |
|
LD |
E, 0 |
LD |
A, D |
|
INC |
D |
AND |
A |
|
DJNZ |
L1 |
RRA |
|
|
JR |
EXIT |
LD |
C, A |
L5 |
LD |
A, E |
PUSH |
DE |
|
LD |
(#5CFF) ,A |
PUSH |
BC |
|
DJNZ |
L3 |
LD |
A, #3C |
EXIT |
POP |
HL |
JR |
NC, L2 |
|
LD |
(#5D00),HL |
LD |
A, #2C |
|
POP |
HL |
LD |
IX,#2F4D |
|
LD |
(#5C00),HL |
CALL |
DOS |
|
POP |
HL |
POP |
BC |
|
LD |
(#5CFE),HL |
POP |
DE |
|
EI |
|
LD |
A, E |
|
RET |
|
LD |
(#5CFF) ,A |
DOS |
PUSH |
IX |
PUSH |
BC |
|
LD |
(#5D00),HL |
PUSH |
DE |
|
JP |
#3D2F |
|
|