(c) В.Сироткин
SPECTRUM 128 -
НОВЫЕ ВОЗМОЖНОСТИ,
НОВЫЕ ПРОБЛЕМЫ
Дальнейшим развитием 'СПЕК-
ТРУМ'а стала модель с объемом
памяти 128 килобайт. Так как
процессор Z-80 является 8-и раз-
рядным процессором, и адресное
пространство у него физически не
может простираться выше значения
#FFFF (65535), то расширение па-
мяти компьютера было сделано по
методу перекрытия 16-килобайт-
ных страниц памяти в верхних ад-
ресах компьютера.
Пользователь получил в свое
распоряжение 8 страниц памяти,
которые он мог по желанию перек-
лючать в любой момент времени.
Основное же адресное прос-
транство компьютера осталось для
пользователя как бы без видимых
изменений.
Наличие 128 килобайт еще не
означало, что для Спектрума ста-
ло возможно писать программы
длиною больше, чем 48 килобайт,
но если программу разбивали на
части и загружали их по частям в
дополнительные страницы ОЗУ, а
потом в определенные моменты
времени вызывали эти страницы,
то, естественно, создавалась ил-
люзия огромного рабочего прос-
транства компьютера (такой ме-
тод работы называется ОВЕРЛЕЕМ).
128 килобайт позволили пере-
вести многие программы (у кото-
рых были подгружаемые уровни или
многостадийная, многоуровневая
загрузка) в режим: "загрузка за
один раз - все сразу".
Владельцы Спектрума-128, ко
всему прочему, стали обладателя-
ми мощного редактора для ввода
программ на языке Бейсик и, что
самое главное, в компьютере поя-
вился музыкальный процессор, с
помощью которого звуковые воз-
можности Спектрума увеличились
на несколько порядков.
РАСПРЕДЕЛЕНИЕ ПАМЯТИ
Итак, у вас появился СПЕКТРУМ
128. Появилось неоспоримое преи-
мущество - наличие дополнитель-
ной памяти, но одновременно поя-
вилось и множество проблем... А
как всем этим управлять???
С точки зрения адресного про-
странства - все осталось так,
как и в старом компьютере. По
тем же адресам экран, систем-
ные переменные и все остальное.
Правда, теперь у вас появилась
еще одна область системных пере-
менных для режима 128 и располо-
жена эта область с адреса #5B00
(23296) (да, да, да, в буфере
принтера. И не дай Бог, если при
включенном режиме 128 ваши игро-
вые или системные программы ис-
пользуют буфер принтера - нарве-
тесь на неприятности!!! А так
как очень многие программы СПЕК-
ТРУМа-48 используют эту область,
то для их нормального запуска
необходимо или выходить из режи-
ма 128 Кб в режим 48 Кб, или пе-
ределывать программы).
Память ОЗУ компьютера (так
же, как и в старом) простирает-
ся с #4000 до #FFFF. Верхняя об-
ласть ОЗУ - с адреса #C000 и до
конца - называется оверлейной, и
вот в эту-то область как раз и
может включаться любая из 8
страниц ОЗУ (естественно, лишь
одна!)
Сразу после включения компью-
тера в эту область включена
страница 0.
За всем остальным простран-
ством ОЗУ компьютера ЖЕСТКО за-
креплены следующие страницы: с
#4000 до #7FFF - страница 5, с
#8000 до #BFFF - страница 2.
Из всего этого следует, что
можно получить ситуацию, когда в
рабочем пространстве компьютера
одновременно по разным адресам
будет:
1) страница 5 - и с адреса #4000
(жестко) и с адреса #C000
(оверлей)
ИЛИ !
2) страница 2 - и с адреса #8000
(жестко) и с адреса #C000
(оверлей)
ИЛИ !
3) страница 7 - и с адреса #4000
(замещение) и с адреса #C000
(оверлей)
Дополнительные возможности
предоставляет страница 7 (или
дополнительное видео-ОЗУ). Эта
страница может замещать страни-
цу 5 (основное видео-ОЗУ), что
дает богатую пищу для програм-
мных трюков с выводом видеоизоб-
ражения.
Необходимо только помнить,
что все системные процедуры пе-
чати, вывода графики и т.п. в
любом случае работают со стра-
ницей 5, т.е. с основным видео-
ОЗУ!
Для того, чтобы работать с
дополнительным видео-ОЗУ, стра-
ницу 7 впечатывают с адреса
#C000, строят (или загружают) по
этим адресам видеоинформацию, а
затем включают страницу 7 вмес-
то страницы 5, и все, что было с
адреса #C000, мгновенно проявит-
ся на экране (с адреса #4000).
Распределение адресов экрана в
7-й странице в этом случае будет
таким:
пикселы экрана с #C000 до #D7FF
(49152) (55295)
атрибуты (цвет) с #D800 до #DAFF
(55296) (56063)
Все переключения страниц ОЗУ,
а также переключение ПЗУ-48/ПЗУ-
128 и режим ЗАЩЕЛКА 48Кб возмож-
ны через системный порт с адре-
сом:
#7FFD (32765)
Соответственно, командой OUT
32765,xx можно управлять конфи-
гурацией компьютера. Ниже дана
раскладка битов этого порта:
СИСТЕМНЫЙ ПОРТ #7FFD (32765)
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │
│ │ │ │ │ │ │ │ │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
^ ^ ^ ^ ^ ^
│ │ │ └─────┴─────┘
│ │ │ Номер страницы ОЗУ
│ │ │ с адреса #C000
Защелка │ │
48 Кб │ └─- Страница Видео-ОЗУ
│ 0 - рабочая (5-я)
│ 1 - дополнительная
│ (7-я)
│
└──── 0 - ПЗУ 128 Кб
1 - ПЗУ 48 Кб
6 и 7 биты в Спектруме-128 не
используются. Могут применяться
для расширения ОЗУ компьютера до
512 Кбайт.
Правила работы в системе 128
Кб и с системным портом #7FFD
(32765).
Если вы работаете с системным
портом из БЕЙСИКа-128, то вам
необходимо помнить, что:
- перед переключением страниц
ОЗУ желательна команда CLEAR
32767, чтобы не сбить систем-
ный стек.
- прежде, чем занести байт в
системный порт, он должен
дублироваться в системной
ячейке BANK_M с адресом #5B5C
(23388)
- управлять переключением стра-
ниц из Бейсика можно путем
занесения байта в системную
ячейку BANK_M (подавать байт
в порт в этом случае не нуж-
но).
- если для своих нужд вы перек-
лючились на дополнительное
ВИДЕО-ОЗУ, то при выходе из
вашей программы система авто-
матически активизирует ОСНОВ-
НОЕ видео-ОЗУ.
- при включении 7-й страницы на
экран (вместо 5-й) 7-я стра-
ница может оставаться на эк-
ране при любых других перек-
лючениях страниц ОЗУ.
- занесение информации в допол-
нительное видео-ОЗУ (7 стра-
ница) возможно только тогда,
когда она включена с адреса
#C000.
- если вы из Бейсика вызываете
процедуру, написанную в ко-
дах, которая работает с сис-
темным портом, то первой ко-
мандой этой процедуры должна
быть команда 'DI' - запрет
прерывания.
- так как все команды Бейсика
автоматически включают на
время своей работы бит 4 сис-
темного порта, т.е. включают
ПЗУ 48 Кб, то при работе из
Бейсика с системным портом
или с переменной BANK_M же-
лательно принудительно вклю-
чать бит 4 (значит, байт опе-
рации по переключению стра-
ниц ОЗУ должен быть суммой
числа #10 (16) с нужным бай-
том). При окончании работы
вашей Бейсик-программы систе-
ма сама активизирует ПЗУ-128.
- если вы запускаете программу
(неважно, с ленты или с дис-
ка), которая ранее работала в
Спектруме-48, смотрите, чтобы
во время загрузки не запор-
тился буфер принтера, иначе
система зависнет.
- если у вас программа, на-
писанная в машкодах, после
старта не собирается больше
выходить в Бейсик, то все вы-
шеперечисленные правила нео-
бязательны (с условием, если
эта программа написана гра-
мотно).
Бейсик-128 почти ничем не от-
личается от Бейсика-48, разве
что мощным экранным редактором,
да тем, что операторы надо наби-
рать побуквенно (что очень сни-
жает скорость набора программ,
да и возможность набора цвето-
вых атрибутов в строке Бейсика у
этого редактора отсутствует).
По сути, ПЗУ-128 постоянно
обращается к ПЗУ-48 за процеду-
рами выполнения Бейсик-програм-
мы. В самом ПЗУ-128 почти ничего
интересного нет: программа-ре-
дактор, процедуры, обслуживающие
музыкальный процессор по опера-
тору 'PLAY', да программа рабо-
ты с виртуальным диском (опера-
торы CAT!, SAVE!, LOAD!, MERGE!,
ERASE!)
Тем, кто спит и видит, как бы
покопаться в ПЗУ-128 - совет: в
ПЗУ-128 нельзя войти ни отладчи-
ками, ни дизассемблерами. Даже
на диск и ленту простыми спосо-
бами ее не запишешь.
Выход один - написать прос-
тенькую программу в кодах типа
этой и запустить ее из Бейсика-
128:
140.
org ???? ; область запуска
start di ; запретим прерывания
ld a,0 ; байт для системного порта
ld bc,#7ffd ; системный порт
out (c),a ; ВКЛЮЧИМ ПЗУ-3128
ld hl,0 ; и теперь перекинем
ld bc,#3fff ; все содержимое ПЗУ
ld de,3#???? ; в свободное место
ldir
ei ; разрешим прерывание
ret ; выйдем
2
Перекинув содержимое ПЗУ-128
в свободное место ОЗУ, можно те-
перь оттуда сохранить его на
диск или ленту.
Кто выписывал или покупал
журналы ZX РЕВЮ за прошлые годы,
тот может узнать много интерес-
ного о СПЕКТРУМЕ-128... Ну нап-
ример:
- как выходить в Бейсик-48 из
режима 128, не останавливая
программу и сохраняя возмож-
ность переключать страницы
ОЗУ и возвращаться обратно;
- как работать с виртуальным
диском методом "канального"
управления;
- что можно выжать из систем-
ных переменных 128К и многое,
многое другое.
Нас же, в первую очередь,
должен волновать вопрос: "А как
обстоят дела с дисковой систе-
мой?" А точно так же, как и в
старом компьютере! Только появи-
лось огромное преимущество -
есть куда загружать файлы, есть
много свободного места под прог-
раммы работы с диском. Знай
только переключай страницы ОЗУ.
Все это так, но как только у
вас программа пойдет по пути
загрузки через дополнительные
страницы ОЗУ, так сразу же може-
те забыть о своих приятелях, ко-
торые еще не смогли приобрести
Спектрум-128 и работают на 48
килобайтах.
Нормальным выходом из такой
ситуации является метод настрой-
ки программы на архитектуру
компьютера. Если компьютер
'128-й' - включается одна под-
программа, и загрузка происхо-
дит через дополнительные страни-
цы ОЗУ (включается фоновая му-
зыка для музпроцессора и т.д.)
Если же компьютер '48-й', то все
происходит по-другому (пример
такой настройки - это такие ши-
роко известные программы, как
"RICK DANGEROUS 2", "SNOW.STREA-
KER", системная оболочка "CONVER
COMMANDER" Ковалевского и много
других).
Программно определять архи-
тектуру компьютера можно разны-
ми путями:
- сканировать область буфера
принтера на наличие системных
переменных для '128-го';
- попытаться 'включить' ПЗУ-128
и считать из него информацию;
- записать информацию в адрес с
#C000, а потом, подав в сис-
темный порт байт переключе-
ния страниц ОЗУ, проанализи-
ровать - произошло ли пере-
ключение.
Но если вы выбрали путь для
своей программы "только 128 ки-
лобайт" (а таких программ уже
достаточно много), то хотя бы в
заставке программы выводите:
"128 ONLY".
А теперь поговорим о "МАГИК"-
файлах в свете имеющихся 128 ки-
лобайт.
Если вы сбрасываете програм-
му, которая не использует до-
полнительные страницы ОЗУ, то в
этом случае МАГИК-сброс ничем не
отличается от МАГИКА-48. Если же
программа, которую вы сбрасывае-
те, использовала дополнительные
страницы ОЗУ, то наряду с основ-
ным файлом @, на диске образовы-
ваются файлы с именами @0, @1,
@2, @3, @4, @5, @6, @7 по номеру
страницы. Не все, конечно, а
только те страницы, которые бы-
ли задействованы в программе
(т.е. те, в которых была какая-
то информация на момент сброса).
Эти файлы всегда имеют длину
#4000 (16384) и стартовый адрес
#C000 (49152). Также сбрасыва-
ется файл с именем '@8' - это
файл, который содержит страницу
дополнительного видео-ОЗУ.
Основной файл с именем '@' -
это рабочая область компьютера с
адреса #4000 по #FFFF (как в
обычном МАГИК-файле).
Запустить МАГИК-сборку прос-
той командой "GO TO" уже не по-
лучится. Для запуска вам будет
необходимо сначала загрузить
файлы в соответствующие страни-
цы, а потом уже командой "GO TO"
запускать основной файл.
Предположим, что после нажа-
тия МАГИКа у вас на диске обра-
зовались следующие файлы:
@ - основной файл
@1 - 1-я страница
@7 - 7-я страницa
Тогда в Бейсике запуск МАГИК-
сборки может иметь следующий
вид:
10 CLEAR 32767
20 POKE 23388,7+16
(включим страницу 7 и основное ПЗУ)
30 RANDOMIZE USR 15619:REM:LOAD "@7" CODE
(загрузим страницу 7)
20 POKE 23388,1+16
(включим страницу 1 и основное ПЗУ)
30 RANDOMIZE USR 15619:REM:LOAD "@1" CODE
(загрузим страницу 1)
20 POKE 23388,16
(включим страницу 0 и основное ПЗУ)
30 RANDOMIZE USR 15619:REM: GOTO "@" CODE
(загрузим и запустим основной файл)
Все файлы МАГИК-сборки можно
переименовать и дать им другие
имена, не забывая, конечно, ка-
кой файл какой странице ОЗУ при-
надлежит. И, естественно, не за-
бывайте, что программа, работаю-
щая во втором прерывании, дол-
жна иметь в имени основного
МАГИК-файла первый символ '$'!
И в заключение приведем таб-
лицу всех системных переменных
"128-го" компьютера.
Системные переменные Sinclair ZX Spectrum 128
┌──────┬───────┬───────────┬──────────────────────────────┐
│ HEX │ DEC │ len/name │ НАЗНАЧЕНИЕ │
├──────┼───────┼───────────┼──────────────────────────────┤
│ 5B00 │ 23296 │ 20 SWAP │ Страничная подпрограмма │
│ 5B14 │ 23316 │ 9 AYOUNGER│ Страничная подпрограмма │
│ 5B1D │ 23325 │ 18 ONERR │ Страничная подпрограмма │
│ 5B2F │ 23343 │ 5 PIN │ Подпрограмма ввода RS232 │
│ 5B54 │ 23348 │ 22 POUT │ Подпрограмма вывода метки │
│ │ │ │ RS232 │
│ │ │ │ Можно применить для обхода │
│ │ │ │ фильтра кода управления │
│ 5B4A │ 23370 │ 14 POUT2 │ Подпрограмма вывода символа │
│ │ │ │ RS232 │
│ 5B58 │ 23384 │ 2 TARGET │ Адрес подпрограммы в ПЗУ-1 │
│ 5B5A │ 23386 │ 2 RETADR │ Адрес возврата в ПЗУ-0 │
│ 5B5C │ 23388 │ 1 BANKM │ Копия последнего байта │
│ │ │ │ вывода в банк │
│ 5B5D │ 23389 │ 1 RAMRST │ Команда RST 8 │
│ 5B5E │ 23390 │ 1 RAMERR │ Номер ошибки ПЗУ-1 │
│ 5B5F │ 23391 │ 2 BAUD │ RS232: период бита в │
│ │ │ │ Т-состоянии/26 │
│ 5B61 │ 23393 │ 2 SEREL │ Флаг возврата 2-го символа │
│ │ │ │ и данные │
│ 5B63 │ 23395 │ 1 COL │ Текущий столбец от 1 до │
│ │ │ │ ширины │
│ 5B64 │ 23396 │ 1 WIDTH │ Ширина столбца бумаги │
│ 5B65 │ 23397 │ 1 TVPARS │ Число параметров в строке, │
│ │ │ │ ожидаемое RS232 │
│ 5B66 │ 23398 │ 1 FLAGS3 │ Различные флаги │
│ 5B67 │ 23399 │ 10 NSTR1 │ Имя файла │
│ 5B71 │ 23409 │ 1 HD00 │ Код типа файла │
│ 5B72 │ 23410 │ 2 HD0B │ Длина блока │
│ 5B74 │ 23412 │ 2 HD0D │ Начало блока │
│ 5B76 │ 23414 │ 2 HD0F │ Длина программы │
│ 5B78 │ 23416 │ 2 HD11 │ Номер строки │
│ 5B7A │ 23418 │ 1 SC00 │ Второй набор - код типа │
│ │ │ │ файла │
│ 5B7B │ 23419 │ 2 SC08 │ Второй набор - длина блока │
│ 5B7D │ 23421 │ 2 SC0D │ Второй набор - начало блока │
│ 5B7F │ 23423 │ 2 SC0F │ Второй набор - длина │
│ │ │ │ программы │
│ 5B81 │ 23425 │ 2 OLDSP │ Старое SP, когда использу- │
│ │ │ │ ется T TACK │
│ 5B83 │ 23427 │ 2 SFNEXT │ Указатель на первый пустой │
│ │ │ │ вход справочника │
│ 5B85 │ 23429 │ 3 SPSPACE │ Число оставленных байтов │
│ │ │ │ (17 бит) │
│ 5B88 │ 23432 │ 1 ROW01 │ Флаги планшета и образ │
│ │ │ │ ряда 1 │
│ 5B89 │ 23433 │ 1 ROW23 │ Образы строк 2 и 3 клавиа- │
│ │ │ │ туры │
│ 5B8A │ 23434 │ 1 ROW45 │ Ряды 4 и 5 клавиатуры │
│ 5B8B │ 23435 │ 2 SYNRET │ Адрес возврата для ONERR │
│ 5B8D │ 23437 │ 5 LASTV │ Последнее значение, напеча- │
│ │ │ │ танное калькулятором │
│ 5B92 │ 23442 │ 2 RNLINE │ Текущая запомненная строка │
│ 5B94 │ 23444 │ 2 RNFIRST │ Номер строки начала для │
│ │ │ │ RENUMBER │
│ 5B96 │ 23446 │ 2 RNSTEP │ Величина приращения для │
│ │ │ │ RENUMBER │
│ 5B98 │ 23448 │ 8 STRIP1 │ Карта бит полосы 1 │
│ 5BA0 │ 23456 │ 8 STRIP2 │ Карта бит полосы 2 │
│ 5BFF │ 23551 │XX TSTASK │ Временный стек растет │
│ │ │ │ отсюда вниз │
└──────┴───────┴───────────┴──────────────────────────────┘
* * *