(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 │ Временный стек растет │ │ │ │ │ отсюда вниз │ └──────┴───────┴───────────┴──────────────────────────────┘ * * *