Использование процедур 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
L1
L2
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 |