|
Этюды - процедура выгрузки/загрузки, не использующую системные переменные.
|
(с) Старков Павел, 1996.
Предлагаю вниманию читателей процедуру выгрузки/загрузки, не использующую системные переменные. С ее помощью на диск можно записать кодовый блок в виде файла. Драйвер записи/чтения сектора был взят из ZX РЕВЮ 95/4.
Чтобы записать кодовый блок, нужно вызвать процедуру SAVE. При этом в регистровой паре HL адрес начала файла в памяти, в DE длина файла, а с метки DATA должно находиться имя файла (8 байтов) и байт расширения файла.
При загрузке нужно вызвать процедуру LOAD. При этом, с метки DATA должны находиться аналогичные данные, что и при записи. Если при вызове процедуры загрузки в регистре А - 0, то
A.D
7
NZ
А,Е
А,32
Е,А
С
A.D
8
D.A D
A.D
7
7
NZ А,Е 32
E,А С
A.D А,8 D.A
стартовый адрес и длина файла будет взята из каталога, а если А не равен 0, то в регистре HL - адрес, в DE - длина файла.
Если при выходе из SAVE или LOAD, в регистре А содержится 0, то процедура отработала успешно, если не равно 0 - ошибка.
При работе с модулем существует несколько проблем:
1. Если в записываемый блок попадают ячейки #5С00-5С01 и #5CFE-5D01, то их содержимое будет записано неверно, т.к. процедура записи во время работы использует эти ячейки, восстанавливая их при. выходе. Чтобы эти ячейки записать правильно, надо сначала перебросить записываемый блок в другую область памяти и записывать его оттуда.
2. Если при записи диск будет неотформатирован или защищен от записи, программа попытается выдать сообщение Retry, Abort, Ignore, но если системные переменные уничтожены, то последствия будут печальны.
3. Если при загрузке не будет читаться какой-нибудь сектор, то программа зависнет.
В остальном программа работает устойчиво. Весь модуль вместе с переменными занимает 476 байт + буфер длиной 256 байт, расположенный следом за программой.
10 |
ORG |
50000 |
20 SAVE |
LD |
(START),HL |
30 |
LD |
(LEN).DE |
40 |
CALL |
ON DSK |
50 |
LD |
DE,8 |
60 |
CALL |
LOADL |
70 |
LD |
A,(BUFF+228) |
80 |
CP |
128 |
90 |
RET |
NC |
100 |
LD |
HL,(BUFF+225) |
110 |
LD |
(SECTRK).HL |
120 |
LD |
HL.(LEN) |
130 |
PUSH |
AF |
140 |
LD |
C,H |
150 |
INC |
L |
160 |
DEC |
L |
170 |
JR |
Z.S1 |
180 |
INC |
С |
190 S1 |
LD |
B,0 |
200 |
LD |
А,С |
210 |
LD |
(LENSEC),A |
220 |
LD |
HL,(BUFF+229) |
230 |
POP |
AF |
240 |
AND |
A |
250 |
SBC |
HL.BC |
260 |
RET |
С |
270 |
PUSH |
HL |
280 |
LD |
(NUM1 + 1),A |
290 |
LD |
D.B |
300 |
LD |
B.A |
310 |
AND |
15 |
320 |
ADD |
A,A |
330 |
ADD |
A.A |
340 |
ADD |
A.A |
350 |
ADD |
A,A |
360 |
LD |
E.A |
370 |
LD |
HL.BUFF |
380 |
ADD |
HL.DE |
390 |
PUSH |
HL |
400 |
LD |
А,В |
410 |
AND |
240 |
420 |
RRA |
|
430 |
RRA |
|
440 |
RRA |
|
450 |
RRA |
|
460 |
LD |
E.A |
470 |
LD |
(SYSTRK+1),DE |
480 |
CALL |
LOADL |
490 |
POP |
DE |
500 |
LD |
HL.DATA |
510 |
LD |
ВС, 16 |
520 |
LDIR |
|
530 |
LD |
A,(NUM1+1) |
540 |
CPL |
|
550 |
AND |
15 |
560 |
PUSH |
AF |
570 |
JR |
Z,S9 |
580 |
XOR |
A |
590 |
LD |
(DE),A |
zx-p<?«ho 97/1-2
ЭТЮДЫ
600 s9 |
LD |
DE.(SECTRK) |
1090 LOAD2 |
LD |
A.(DE) |
610 |
LD |
HL,(START) |
1100 |
CP |
(HL) |
620 |
LD |
A.(LENSEC) |
1110 |
JR |
Z.LOAD3 |
630 |
LD |
B,A |
1120 |
POP |
DE |
640 |
LD |
C,6 |
1130 |
DEC |
(IX+0) |
650 |
CALL |
DRIVER |
1140 |
RET |
Z |
660 |
POP |
AF |
1150 |
LD |
HL.16 |
670 |
PUSH |
DE |
1160 |
ADD |
HL.DE |
680 |
PUSH |
AF |
1170 |
EX |
DE,HL |
690 |
LD |
DE,(SYSTRK+1) |
1180 |
DJNZ |
LOAD1 |
700 |
CALL |
SAVEL |
1190 IS TRK |
LD |
DE,0 |
710 |
POP |
AF |
1200 |
JR |
LOADO |
720 |
JR |
NZ.S3 |
1210 LOAD3 |
INC |
DE |
730 systrk |
LD |
DE,0 |
1220 |
INC |
HL |
740 |
INC |
E |
1230 |
DEC |
С |
750 |
CALL |
LOADL |
1240 |
JR |
NZ.LOAD2 |
760 |
XOR |
A |
1250 |
POP |
IX |
770 |
LD |
(BUFF),A |
1260 |
LD |
HL,(START) |
780 |
DEC |
E |
1270 |
LD |
BC.(LEN) |
790 |
CALL |
SAVEL |
1280 |
LD |
A.(LENSEC) |
800 s3 |
LD |
DE,8 |
1290 |
AND |
A |
810 |
CALL |
LOADL |
1300 |
JR |
NZ.LOAD6 |
820 |
POP |
HL |
1310 |
LD |
L,(IX+9) |
830 |
LD |
(BUFF+225),HL |
1320 |
LD |
H,(IX+10) |
840 |
POP |
HL |
1330 |
LD |
C,(IX+11) |
850 |
LD |
(BUFF+229),HL |
1340 |
LD |
B,(IX+12) |
860 num1 |
LD |
A,0 |
1350 LOAD6 |
LD |
E,(IX+14) |
870 |
HMC |
A |
1360 |
LD |
D,(IX+15) |
880 |
LD |
(BUFF+228),A |
1370 LOAD5 |
INC |
В |
890 |
LD |
DE,8 |
1380 |
DEC |
В |
900 |
CALL |
SAVEL |
1390 |
JR |
Z.LOAD8 |
910 |
XOR |
A |
1400 |
PUSH |
ВС |
920 |
RET |
|
1410 LOAD7 |
LD |
С,5 |
930 load |
LD |
(LENSEC),A |
1420 |
CALL |
DRIVER |
940 |
LD |
(START),HL |
1430 |
POP |
ВС |
950 |
LD |
(LEN).DE |
1440 |
INC |
С |
960 |
CALL |
ON DSK |
1450 |
DEC |
С |
970 |
LD |
DE,8 |
1460 |
RET |
Z |
980 |
CALL |
LOADL |
1470 |
LD |
DE,(IS TRK+1) |
990 |
LD |
A,(BUFF+228) |
1480 LOAD8 |
PUSH |
HL |
1000 |
LD |
(NUM1 + 1),A |
1490 |
CALL |
LOADL |
1010 |
LD |
DE.O |
1500 |
POP |
DE |
1020 loado |
CALL |
LOADL |
1510 |
LD |
BC.(LEN) |
1030 |
LD |
DE.BUFF |
1520 |
LD |
B,0 |
1040 |
LD |
IX.NUM1 + 1 |
1530 |
LD |
HL.BUFF |
1050 |
LD |
B,16 |
1540 |
LDIR |
|
1060 load1 |
PUSH |
DE |
1550 |
LD |
А,В |
1070 |
LD |
HL.DATA |
1560 |
RET |
|
1080 |
LD |
C,9 |
1570 LOADL |
LD |
С,5 |
zx«fwp 97/1
ЭТЮДЫ
1580 |
JR |
CONT2 |
1590 SAVEL |
LD |
C,6 |
1600 CONT2 |
LD |
B,1 |
1610 |
LD |
HL.BUFF |
1620 DRIVER |
BIT |
o,c |
1630 |
JR |
NZ.M1 |
1640 |
EXX |
|
1650 |
PUSH |
HL |
1660 |
LD |
HL,(#5C00) |
1670 |
LD |
DE,(#5CFE) |
1680 |
LD |
BC,(#5D00) |
1690 |
EXX |
|
1700 |
XOR |
A |
1710 |
LD |
(#5C00),A |
1720 М1 |
Dl |
|
1730 L1 |
PUSH |
DE |
1740 |
PUSH |
ВС |
1750 |
LD |
A,D |
1760 |
OR |
A |
1770 |
RRA |
|
1780 |
LD |
C,A |
1790 |
LD |
A,#3C |
1800 |
JR |
NC.L2 |
1810 |
LD |
A,#2C |
1820 L2 |
LD |
IX,#2F4D |
1830 |
CALL |
DOS |
1840 |
POP |
ВС |
1850 |
POP |
DE |
1860 L3 |
BIT |
o.c |
1870 |
JR |
NZ.M2 |
1880 |
LD |
A,E |
1890 |
LD |
(#5CFF),A |
1900 |
LD |
(#5D00),HL |
1910 М2 |
PUSH |
HL |
1920 |
PUSH |
DE |
1930 |
PUSH |
ВС |
1940 |
LD |
IX,#2F1B |
1950 |
BIT |
o,c |
1960 |
JR |
NZ.M3 |
-1970 |
LD |
IX,#3F0A |
1980 МЗ |
CALL |
DOS |
1990 |
POP |
ВС |
2000 |
POP |
DE |
2010 |
POP |
HL |
2020 |
INC |
H |
2030 |
INC |
E |
2040 |
BIT |
4,E |
2050 |
JR |
NZ.L5 |
2060 |
BIT |
o,c |
2070 |
JR |
NZ.M4 |
2080 |
LD |
A,E |
2090 |
LD |
(#5CFF),A |
2100 M4 |
DJNZ |
L3 |
2110 |
JR |
EXIT |
2120 L5 |
LD |
E,0 |
2130 |
INC |
D |
2140 |
DJNZ |
L1 |
2150 EXIT |
LD |
(IS TRK+D.DE |
2160 |
BIT |
o,c |
2170 |
RET |
NZ |
2180 |
EXX |
|
2190 |
LD |
(#5D00),BC |
2200 |
LD |
(#5CFE),DE |
2210 |
LD |
(#5C00),HL |
2220 |
POP |
HL |
2230 |
EXX |
|
2240 |
RET |
|
2250 ON DSK |
Dl |
|
2260 |
LD |
IX,#2F65 |
2270 DOS |
PUSH |
IX |
2280 |
JP |
#3D2F |
2290 DATA |
DEFM |
"FileNameC" |
2300 START |
DEFW |
0 |
2310 LEN |
DEFW |
0 |
2320 LENSEC |
DEFB |
0 |
2330 SECTRK |
DEFW |
0 |
2340 BUFF |
DEFS |
256 |
СОДЕРЖАНИЕ:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Форум-Игры - в разделе рассмотрены: Dun Darach, Murray Mause (Supercop), Wild West Seymour, Sim City, Hero Quest, Dizzy-Y, Apollo, Cliffhanger, Laser Squad, Movie, Elite, Where Time Stood Still, Sceptre, Carrier Command, Math Day.
-
-
-
-
-
-
-
-
-
|
|