ЗАГРУЗЧИК ВИДЕОПРОЦЕССОРА
Загрузчик сразу после включения, видеопроцессора определяет объём памяти и выдает его в порт 127. Объём памяти выдается в блоках размером по 256 байт, то есть для полнели памяти 32 Кб, необходимой для дендиевских игрушек, число, считанное из порта 127, должно быть - 128. Информация в ОЗУ видеопроцессора записывается через порт 127 в таком формате:
1. Байт - определяет режим работы после запуска. При значении, отличном от #00, после окончания загрузки видеопроцессор работает в автономном режиме и управление со стороны Spectrum заблокировано. При #00 - основной режим, возможность управления сохраняется.
2. Байт - старший байт адреса загрузки драйвера. Младший байт всегда 0, то есть длина драйвера кратна 256 байт.
3. Последний байт драйвера записывается по адресу #FFFF.
Далее следует 8 Кб графической информации и, от 256 байт до 32 Кб - программа и данные. Запуск происходит автоматически после записи последнего байта.
Загрузчик вполне может быть размещен в масочном ПЗУ объёмом 256 байт.
Листинг загрузчика драйвера видеопроцессора или игры видеоприставки.
FLASH 1: POKE 23624,128: CLEAR 24999
REM: LOAD "LOADER" CODE REM: LOAD "VIDEO" CODE 49152
USR USR USR USR USR
15619 15619 25000 15619 25002
Листинг подпрограммы LOADER.
ORG |
25000 |
; загрузка программы и данных |
JR |
VIDEO |
; в ОЗУ видеопроцессора |
LD |
HL,#8000 |
; начало блока |
LD |
A,(HL) |
; пересылка |
OUT |
(127) ,А |
; блока |
I NC |
HL |
; из ОЗУ SPECTRUM |
LD |
A, H |
; впорт 12 7 |
CP |
0 |
|
RET |
Z |
; выход, если конец блока |
JR |
L1 |
; снова, если не все |
LD
LD
OUT
LD
OUT
LD
OUT
I NC
LD
CP
RET
JR
HL,#C000 A, #FF (127),A A, #80 (127),A A,(HL) (127) ,A HL A, H #E0 Z
L1V
загрузка видео-ОЗУ начало видеоблока #FF - блокировка #00 - без блокировки
RANDOMIZE RANDOMIZE RANDOMIZE RANDOMIZE RANDOMIZE
REM: LOAD "PROGRAM" CODE 32 7 68
Дамп загрузчика видеопроцессора (коды 6502)
F800 |
78 |
D8 |
A9 |
00 |
8D |
00 |
60 |
8D |
6B |
F808 |
00 |
20 |
8D |
01 |
20 |
AD |
02 |
20 |
9D |
F810 |
10 |
FB |
AD |
02 |
20 |
30 |
FB |
A9 |
B6 |
F818 |
3F |
8D |
06 |
20 |
A9 |
F0 |
8D |
06 |
2E |
F820 |
20 |
A9 |
0D |
8D |
07 |
20 |
A2 |
FF |
43 |
F828 |
9A |
A0 |
00 |
8C |
06 |
20 |
8C |
06 |
9E |
F830 |
20 |
98 |
99 |
00 |
00 |
C8 |
D0 |
FA |
0B |
F838 |
A0 |
00 |
B9 |
46 |
F8 |
99 |
00 |
03 |
63 |
F840 |
C8 |
D0 |
F7 |
4C |
00 |
03 |
A9 |
20 |
DF |
F848 |
8D |
01 |
60 |
A2 |
80 |
A9 |
00 |
85 |
7E |
F850 |
04 |
A8 |
86 |
05 |
8A |
91 |
04 |
C8 |
66 |
F858 |
D0 |
FB |
E8 |
D0 |
F5 |
AD |
00 |
80 |
F5 |
F860 |
49 |
FF |
38 |
69 |
00 |
85 |
06 |
8D |
59 |
F868 |
00 |
60 |
A0 |
00 |
B9 |
35 |
03 |
99 |
EA |
F870 |
FA |
FF |
C8 |
C0 |
06 |
D0 |
F5 |
58 |
0C |
F878 |
4C |
31 |
03 |
48 |
03 |
FF |
FF |
3B |
74 |
F880 |
03 |
AD |
00 |
60 |
85 |
00 |
A9 |
49 |
FF |
F888 |
8D |
FE |
FF |
8D |
00 |
60 |
40 |
AD |
E4 |
F890 |
00 |
60 |
85 |
03 |
A9 |
5B |
8D |
FE |
FF |
F898 |
FF |
A2 |
00 |
A0 |
00 |
8D |
00 |
60 |
BE |
F8A0 |
40 |
AD |
00 |
60 |
8D |
07 |
20 |
E8 |
81 |
F8A8 |
D0 |
0C |
C8 |
C0 |
20 |
D0 |
07 |
AO |
9B |
F8B0 |
00 |
A9 |
74 |
8D |
FE |
FF |
3D |
00 |
DC |
F8B8 |
60 |
40 |
AS |
03 |
C9 |
FF |
D0 |
T0 |
A0 |
F8C0 |
C0 |
FE |
D0 |
0C |
AC |
00 |
60 |
A9 |
07 |
F8C8 |
96 |
80 |
FE |
FF |
8D |
00 |
60 |
40 |
0D |
F8D0 |
AD |
00 |
60 |
91 |
02 |
C8 |
D0 |
DE |
DE |
F8D8 |
E 6 |
03 |
D0 |
DA |
AD |
00 |
60 |
8D |
FD |
F8E0 |
FF |
FF |
8D |
00 |
60 |
8C |
FE |
FF |
4C |
F8E8 |
A5 |
00 |
F0 |
05 |
A9 |
E0 |
8D |
01 |
91 |
F8F0 |
60 |
6C |
FC |
FF |
FF |
FF |
FF |
FF |
AB |
F8F8 |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
E8 |
F900 |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
F1 |
заполнено кодом #FF