|
Читатель-читателю - нестандартная загрузка.
|
Нестандартная загрузка
© Павел Старков, г. Красноярск, 1995.
В 2Х-РЕВЮ-94, № 6 была напечатана статья о нестандартной загрузке. В дополнение к ней я решил выслать Вам две процедуры. Первая - загружает рисунок последовательно, линия за линией, а затем загружаются атрибуты, но не как обычно, сверху вниз, а вертикальными столбцами слева направо. Процедуры построены с использованием подпрограммы ПЗУ с точкой входа #05A9.
Замечу, что предварительно закодированный экран имеет длину такую же, как и обычный стандартный экран - 6912 байт.
1 |
|
ORG |
50000 |
2 |
|
ENT |
$ |
3 |
|
LD |
IX,16384 |
4 |
|
LD |
DE,32 |
5 |
|
XOR |
A |
6 |
|
SUB |
1 |
78 |
|
EX DI |
AF, AF' |
9 |
|
PUSH |
IX |
10 |
|
CALL |
#0562 |
11 |
L1 |
POP |
IX |
12 |
|
DEFB |
#DD |
13 |
|
INC |
H |
14 |
|
DEFB |
#DD |
15 |
|
LD |
A, H |
16 |
|
AND |
7 |
17 |
|
JR |
NZ, P1 |
18 |
|
DEFB |
#DD |
19 |
|
LD |
A, L |
20 |
|
ADD |
A, 32 |
21 |
|
DEFB |
#DD |
22 |
|
LD |
L, A |
23 |
|
JR |
C, P1 |
24 |
|
DEFB |
#DD |
25 |
|
LD |
A, H |
26 |
|
SUB |
8 |
27 |
|
DEFB |
#DD |
28 |
|
LD |
H, A |
29 |
P1 |
LD |
DE,32 |
30 |
|
PUSH |
IX |
31 |
|
CALL |
#05A9 |
32 |
|
DEC |
E |
33 |
|
INC |
E |
34 |
|
JR |
NZ,ERR |
35 |
|
DEFB |
#DD |
36 |
|
LD |
A, H |
37 |
|
CP |
88 |
38 |
|
JR |
C, L1 |
39 |
|
POP |
AF |
40 |
|
LD |
B, 32 |
41 |
M2 |
PUSH |
BC |
42 |
|
PUSH |
IX |
43 |
|
LD |
B, 24 |
44 |
M3 |
PUSH |
BC |
45 |
|
INC |
DE |
46 |
|
CALL |
#05A9 |
47 |
|
LD |
BC, 31 |
48 |
|
ADD |
IX, BC |
49 |
|
POP |
BC |
50 |
|
DJNZ |
M3 |
51 |
|
POP |
IX |
52 |
|
INC |
IX |
53 |
|
POP |
BC |
54 |
|
DJNZ |
M2 |
55 |
|
SCF |
|
56 |
|
JP |
#053F |
57 |
ERR |
POP |
IX |
58 |
|
OR |
A |
59 |
|
JP |
#053F |
При завершении процедуры загрузки флаг С будет установлен, если загрузка прошла успешно, или сброшен, если была зафиксирована ошибка.
Длина процедуры = |
97 байтов: |
|
|
|
|
|
|
|
C350 |
DD |
21 |
00 |
40 |
11 |
20 |
00 |
AF |
31 |
C358 |
D6 |
01 |
08 |
F3 |
DD |
E5 |
CD |
62 |
DE |
C360 |
05 |
DD |
E1 |
DD |
24 |
DD |
7C |
E6 |
26 |
C368 |
07 |
20 |
0E |
DD |
7D |
C6 |
20 |
DD |
7D |
C370 |
6F |
38 |
06 |
DD |
7C |
D6 |
08 |
DD |
F4 |
C378 |
67 |
11 |
20 |
00 |
DD |
E5 |
CD |
A9 |
0B |
C380 |
05 |
1D |
1C |
20 |
26 |
DD |
7C |
FE |
1E |
C388 |
58 |
38 |
D6 |
F1 |
06 |
20 |
C5 |
DD |
6A |
C390 |
E5 |
06 |
18 |
C5 |
13 |
CD |
A9 |
05 |
A9 |
C398 |
01 |
1F |
00 |
DD |
09 |
C1 |
10 |
F3 |
25 |
C3A0 |
DD |
E1 |
DD |
23 |
C1 |
10 |
E7 |
37 |
10 |
C3A8 |
C3 |
3F |
05 |
DD |
E1 |
B7 |
C3 |
3F |
E9 |
C3B0 |
05 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
78 |
Для кодирования экрана под нее предназначена программа-шифратор на Бейсике:
1 CLEAR 39999: FOR x=1 TO 60: |
READ a |
: POKE 49999+x,a: NEXT x |
10 LOAD "" SCREEN$ |
|
|
15 RANDOMIZE USR 5E4 |
|
|
20 SAVE "scr" CODE 40000,6912 |
|
|
30 GO TO 10 |
|
|
100 DATA 17,64,156,33,0,64,6, |
192,197 |
,229,1,32,0,237,176 |
110 DATA 225,36,124,230,7,32, |
10,125, |
198,32,111,56,4,124,214,8 |
120 DATA 103,193,16,229,33,0, |
88,6,32 |
,197,229,6,24,197,237,160 |
130 DATA 1,31,0,9,193,16,246, |
225,35, |
193,16,237,201 |
Дизассемблер кодового блока программы-шифратора:
1 |
ORG |
50000 |
2 |
ENT |
$ |
3 |
LD |
DE,#9C4 0 |
4 |
LD |
HL,#4000 |
5 |
LD |
B, #C0 |
6 LC358 PUSH |
BC |
|
7 |
PUSH |
HL |
|
8 |
LD |
BC,#0020 |
|
9 |
LDIR |
|
|
10 |
POP |
HL |
|
11 |
INC |
H |
|
12 |
LD |
A, H |
|
13 |
AND |
#07 |
|
14 |
JR |
NZ,LC370 |
|
15 |
LD |
A, L |
|
16 |
ADD |
A, #20 |
|
17 |
LD |
L, A |
|
18 |
JR |
C,LC370 |
|
19 |
LD |
A, H |
|
20 |
SUB |
#08 |
|
21 |
LD |
H, A |
|
22 |
LC370 |
POP |
BC |
23 |
DJNZ |
LC358 |
|
24 |
LD |
HL,#5800 |
|
25 |
LD |
B, #20 |
|
26 |
LC378 |
PUSH |
BC |
27 |
PUSH |
HL |
|
28 |
LD |
B, #18 |
|
29 |
LC37C |
PUSH |
BC |
30 |
LDI |
|
|
31 |
LD |
BC,#001F |
|
32 |
ADD |
HL, BC |
|
33 |
POP |
BC |
|
34 |
DJNZ |
LC37C |
|
35 |
POP |
HL |
|
36 |
INC |
HL |
|
37 |
POP |
BC |
|
38 |
DJNZ |
LC378 |
|
39 |
RET |
|
|
|
Вторая процедура загружает рисунок по прямоугольникам 6х8 знакомест (всего их - 16). |
Загружаются они в |
хаотичном |
(заранее определяемом) порядке. После загрузки каждого |
прямоугольника, сразу же загружаются его атрибуты. |
1 |
ORG |
50000 |
|
2 |
ENT |
$ |
|
3 |
CALL |
LD FL |
|
4 |
RET |
Z |
|
5 |
RST |
8 |
|
6 |
DEFB |
26 |
|
7 LD |
FL LD |
HL,LOAD1 |
|
8 |
LD |
(CAL+1) , HL |
9 |
XOR |
A |
|
10 |
SUB |
1 |
|
11 |
EX |
AF, AF' |
|
12 |
DI |
|
|
13 |
LD |
HL,DATA |
|
14 |
|
LD |
B, 16 |
15 |
L1 |
PUSH |
BC |
16 |
|
LD |
A,(HL) |
17 |
|
DEFB |
#DD |
18 |
|
LD |
L, A |
19 |
|
INC |
HL |
20 |
|
LD |
A,(HL) |
21 |
|
DEFB |
#DD |
22 |
|
LD |
H, A |
23 |
|
INC |
HL |
24 |
|
CALL |
LOAD |
25 |
|
POP |
BC |
26 |
|
DJNZ |
L1 |
27 |
|
XOR |
A |
28 |
|
EXX |
|
29 |
EXIT |
LD |
HL,10 072 |
30 |
|
EXX |
|
31 |
|
JP |
#053F |
32 |
LOAD |
LD |
B,4 8 |
33 |
|
PUSH |
IX |
34 |
L2 |
PUSH |
IX |
35 |
|
EXX |
|
36 |
|
LD |
DE, 8 |
37 |
CAL |
CALL |
LOAD1 |
38 |
|
INC |
E |
39 |
|
DEC |
E |
40 |
|
JR |
NZ,ERR1 |
41 |
|
EXX |
|
42 |
|
POP |
IX |
43 |
|
DEFB |
#DD |
44 |
|
INC |
H |
45 |
|
DEFB |
#DD |
46 |
|
LD |
A, H |
47 |
|
AND |
7 |
48 |
|
JR |
NZ, L3 |
49 |
|
DEFB |
#DD |
50 |
|
LD |
A, L |
51 |
|
ADD |
A, 32 |
52 |
|
DEFB |
#DD |
53 |
|
LD |
L, A |
54 |
|
JR |
C, L3 |
55 |
|
DEFB |
#DD |
56 |
|
LD |
A, H |
57 |
|
SUB |
8 |
58 |
|
DEFB |
#DD |
59 |
|
LD |
H, A |
60 |
L3 |
DJNZ |
L2 |
61 |
|
POP |
IX |
62 |
|
DEFB |
#DD |
63 |
|
LD |
A, H |
64 |
|
RRCA |
|
65 |
|
RRCA |
|
66 |
|
RRCA |
|
67 |
|
AND |
#03 |
68 |
|
OR |
#58 |
69 |
|
DEFB |
#DD |
70 |
|
LD |
H, A |
71 |
|
LD |
B, 6 |
72 |
L4 |
EXX |
|
73 |
|
LD |
DE, 8 |
74 |
|
CALL |
#05A9 |
75 |
|
I NC |
E |
76 |
|
DEC |
E |
77 |
|
JR |
NZ,ERR2 |
78 |
|
EXX |
|
79 |
|
LD |
DE, 24 |
80 |
|
ADD |
IX, DE |
81 |
|
DJNZ |
L4 |
82 |
|
RET |
|
83 |
LOAD1 |
CALL |
#0562 |
84 |
|
LD |
IX,#05A9 |
85 |
|
LD |
(CAL+1),IX |
86 |
|
RET |
|
87 |
ERR1 |
POP |
BC |
88 |
|
POP |
BC |
89 |
ERR2 |
POP |
BC |
90 |
|
POP |
BC |
91 |
|
JR |
EXIT |
92 |
DATA |
DEFW |
#4000,#4890 |
93 |
|
DEFW |
#4880,#5058 |
94 |
|
DEFW |
#4010,#40C8 |
95 |
|
DEFW |
#5048,#40D8 |
96 |
|
DEFW |
#5050,#40C0 |
97 |
|
DEFW |
#5040, #4888 |
98 |
|
DEFW |
#4008, #4018 |
99 |
|
DEFW |
#40D0,#4898 |
При выходе из программы флаг Z установлен, если не было ошибки и сброшен, если была. Длина процедуры = 175 байтов:
C350 |
CD |
56 |
C3 |
C8 |
CF |
1A |
21 |
CD |
98 |
C358 |
C3 |
22 |
89 |
C3 |
AF |
D6 |
01 |
08 |
DA |
C360 |
F3 |
21 |
DF |
C3 |
06 |
10 |
C5 |
7E |
32 |
C368 |
DD |
6F |
23 |
7E |
DD |
67 |
23 |
CD |
4C |
C370 |
7E |
C3 |
C1 |
10 |
F1 |
AF |
D9 |
21 |
DF |
C378 |
58 |
27 |
D9 |
C3 |
3F |
05 |
06 |
30 |
D0 |
C380 |
DD |
E5 |
DD |
E5 |
D9 |
11 |
08 |
00 |
B9 |
C388 |
CD |
CD |
C3 |
1C |
1D |
20 |
4A |
D9 |
24 |
C390 |
DD |
E1 |
DD |
24 |
DD |
7C |
E6 |
07 |
58 |
C398 |
20 |
0E |
DD |
7D |
C6 |
20 |
DD |
6F |
15 |
C3A0 |
38 |
06 |
DD |
7C |
D6 |
08 |
DD |
67 |
1C |
C3A8 |
10 |
D8 |
DD |
E1 |
DD |
7C |
0F |
0F |
88 |
C3B0 |
0F |
E6 |
03 |
F6 |
58 |
DD |
67 |
06 |
03 |
C3B8 |
06 |
D9 |
11 |
08 |
00 |
CD |
A9 |
05 |
EE |
C3C0 |
1C |
1D |
20 |
17 |
D9 |
11 |
18 |
00 |
F5 |
C3C8 |
DD |
19 |
10 |
ED |
C9 |
CD |
62 |
05 |
7B |
C3D0 |
DD |
21 |
A9 |
05 |
DD |
22 |
89 |
C3 |
8A |
C3D8 |
C9 |
C1 |
C1 |
C1 |
C1 |
18 |
98 |
00 |
18 |
C3E0 |
40 |
90 |
48 |
80 |
48 |
58 |
50 |
10 |
3B |
C3E8 |
40 |
C8 |
40 |
48 |
50 |
D8 |
40 |
50 |
F3 |
C3F0 |
50 |
C0 |
40 |
40 |
50 |
88 |
48 |
08 |
6B |
C3F8 |
40 |
18 |
40 |
D0 |
40 |
98 |
48 |
00 |
43 |
Бейсик-шифратор для кодирования экрана: 1 CLEAR 39999: FOR x=0 TO 132: READ a: POKE 5E4+x,a: NEXT x 10 LOAD ""SCREEN$ 15 RANDOMIZE USR 5E4 20 SAVE "scr"CODE 40000,6912 30 GO TO 10
100 DATA 17,64,156,6,16,33,181,195,197,126,221,111,35,126 110 DATA 221,103,35,229,205,106,195,225,193,16,239,201 120 DATA 6,48,221,229,197,221,229,221,229,225,1,8,0,237,176 130 DATA 221,225,221,36,221,124,230,7,32,14,221,125,198,32 140 DATA 221,111,56,6,221,124,214,8,221,103,193,16,218,221,225 150 DATA 221,124,15,15,15,230,3,246,88,221,103,6,6,197,221 160 DATA 229,225,1,8,0,237,176,1,32,0,221,9,193,16,239,201 170 DATA 0,64,144,72,128,72,88,80,16,64,200,64,72,80,216,64 180 DATA 80,80,192,64,64,80,136,72,8,64,24,64,208,64,152,72 Дизассемблер кодового блока шифратора:
1 |
ORG |
50000 |
2 |
ENT |
$ |
3 |
LD |
DE, #9C40 |
4 |
LD |
B, #10 |
5 |
LD |
HL,LC3B5 |
6 LC358 |
PUSH |
BC |
7 |
LD |
A,(HL) |
8 |
DEFB |
#DD |
9 |
LD |
L, A |
10 |
INC |
HL |
11 |
LD |
A,(HL) |
12 |
DEFB |
#DD |
13 |
LD |
H, A |
14 |
INC |
HL |
15 |
PUSH |
HL |
16 |
CALL |
LC3 6A |
17 |
POP |
HL |
18 |
POP |
BC |
19 |
DJNZ |
LC358 |
20 |
RET |
|
21 LC3 6A |
LD |
B,#30 |
22 |
PUSH |
IX |
23 LC3 6E |
PUSH |
BC |
24 |
PUSH |
IX |
25 |
|
PUSH IX |
26 |
|
POP HL |
27 |
|
LD BC,#0008 |
28 |
|
LDIR |
29 |
|
POP IX |
30 |
|
DEFB #DD |
31 |
|
INC H |
32 |
|
DEFB #DD |
33 |
|
LD A, H |
34 |
|
AND #07 |
35 |
|
JR NZ,LC391 |
36 |
|
DEFB #DD |
37 |
|
LD A, L |
38 |
|
ADD A,#2 0 |
39 |
|
DEFB #DD |
40 |
|
LD L, A |
41 |
|
JR C,LC391 |
42 |
|
DEFB #DD |
43 |
|
LD A, H |
44 |
|
SUB #08 |
45 |
|
DEFB #DD |
46 |
|
LD H, A |
47 |
LC391 |
POP BC |
48 |
|
DJNZ LC3 6E |
49 |
|
POP IX |
50 |
|
DEFB #DD |
51 |
|
LD A, H |
52 |
|
RRCA |
53 |
|
RRCA |
54 |
|
RRCA |
55 |
|
AND #03 |
56 |
|
OR #58 |
57 |
|
DEFB #DD |
58 |
|
LD H, A |
59 |
|
LD B,#06 |
60 |
LC3A3 |
PUSH BC |
61 |
|
PUSH IX |
62 |
|
POP HL |
63 |
|
LD BC,#0008 |
64 |
|
LDIR |
65 |
|
LD BC,#0020 |
66 |
|
ADD IX, BC |
67 |
|
POP BC |
68 |
|
DJNZ LC3A3 |
69 |
|
RET |
70 |
LC3B5 |
DEFW #4000,#4890 |
71 |
|
DEFW #4880,#5058 |
72 |
|
DEFW #4010,#4 0C8 |
73 |
|
DEFW #504 8,#4 0D8 |
74 |
|
DEFW #5050,#4 0C0 |
75 |
DEFW |
#5040, |
#4888 |
76 |
DEFW |
#4008, |
#4018 |
77 |
DEFW |
#4 0D0, |
#4898 |
|
|