ПРОБЛЕМЫ РАЗВИТИЯ ZX SPECTRUM.
Paul Smith, S.-Petersburg, September 1995._
Являюсь Вашим постоянным читателем, но пишу впервые. У меня на работе IBM, а дома Спектрум. Ситуация классическая. И вот, как-то сидя за IBM, вспомнив некоторые публикации в ZX РЕВЮ, подумал - а действительно, как выдержать Спектруму конкуренцию в момент нашествия игровых приставок и других компьютеров? (ИФК: ситуация классическая: человек сидит за IBM, а думает о Спектруме!). Всё, что придумал, набрал в MS DOS (ИФК: СПАСИБО ОГРОМНОЕ!) и вот что получилось._
I. Проблема прикладного программного обеспечения.
Спектрум имеет, цитирую: ".широкий спектр языков программирования, графических и музыкальных редакторов." (ZX FORUM, "От редакции"). Все это так, но. Вспомним, когда всё это программное обеспечение было написано. Хоть и не в прошлом веке, но в прошлом десятилетии, это точно. Особенно плохо дело обстоит с языками программирования высокого уровня - ни сервиса, ни качественной компиляции. Зато бурное развитие получили музыкальные редакторы - как говорится, спрос порождает предложения. Приветы и fuck-и, переданные программистами друг другу во всех MEGA-DEMO, можно исчислять гигабайтами.
Господа программисты! Спектруму срочно требуются высококачественные компиляторы языков программирования, желательно в стиле "turbo"! Хватит музыкалок, которые девать уже
некуда! Единственное, что появилось в последнее время, это ассемблер TASM. Допускаю, что у меня не самая лучшая версия, но название "турбо" дано программе либо по недоразумению, либо для рекламы.
От себя лично могу предложить вашему вниманию новую версию языка Форт. К сожалению, этот замечательный язык программирования мало известен в нашей стране. Но я уверен, что среди владельцев Спектрума найдутся не только поклонники этого языка, но и те, кого заинтересует новая версия. Главные её достоинства - русский интерфейс, поддержка ДОС и самое главное - автор (т.е. я), примет, к сведению пожелания и информацию об ошибках и неточностях, даст консультацию как общую, так и по внутренней работе и всем тонкостям (вплоть до машинного кода). Ни о каком другом языке такой информации вы не получите. В конце письма прилагаю заявку. Копию пока не посылаю, так как мой издосовский копировщик не копирует, а только портит дискеты.
Если заинтересует, напишу подробнее. Предупреждаю - это не адаптация других версий. Программа разработана с нуля, то бишь начиная с адресного интерпретатора. В связи с этим в программе есть свои, авторские, причуды. Лишь впоследствии я достал другие версии и смог их сравнить.
Можно бесконечно и без толку возвращаться к вопросу о стандартизации - никакого стандарта никогда не будет. Давно пора открывать рубрику с вышеуказанным или подобным названием и конкретно установить - что и как. Аппаратчики и программисты! Будьте любезны соблюдать стандарты и соглашения! А иначе будет продолжаться разброд, шатание и повальная несовместимость различных моделей и программных продуктов! Кроме журнала, взять на себя роль "стандартизатора" некому. (ИФК: готовы открыть новую рубрику - пишите Ваши предложения) Предлагаю некоторые темы для новой рубрики:
1. Порты ввода/вывода. Пора, наконец, разобраться, какие разряды адреса и данных для чего используются, что как выбирается. В конце письма привожу примеры описания стандарта KEMPSTON JOYSTIC и LPRINT-III
2. Порты ввода/вывода для новых устройств. При разработке новых устройств возникает проблема, куда их "цеплять". Предлагаю использовать для этого порты INTERFACE-I: #F7, #EF, #E7. Его в нашей стране всё равно нет, а на Западе наши разработки для Спектрума никого не заинтересуют. Для выборки портов используются разряды A3 и A4, что в сочетании со старшими разрядами даст 256*3=768 адресов. Хотя полная дешифрация аппаратно будет (выглядеть громоздко, это решит проблемы сосуществования разных устройств друг с другом. Адреса портов раздавать на усмотрение ZX-РЕВЮ.
3. Стандарт AY-STEREO. Применяются два способа микширования каналов музыкального сопроцессора для получения стереозвука: ABC и АСВ (левый, средний, правый). Последний используется, в Пентагоне-128 и принят за основной Спектрофоном. Возможно, его и следует объявить стандартным.
Стандарт интерфейса принтера. Два самых распространенных, параллельные LPRINT-III -порты #7В, #FB и ВВ55 - порты #1F, #3F, #5F, #7F. Имеет смысл стандартизировать интерфейс принтера, использующий музыкальный сопроцессор. Все остальные хоть и не объявлять вне закона, но не рекомендовать к использованию.
5. Стандарт раскладки русских букв на обычной, 40-клавишной, клавиатуре: •S Стандарт ЯВЕРТЫ - самый простой в реализации. Хотя ни на одном другом компьютере такого нет, на Спектруме он прижился и имеет право на существование. Однако надо решить проблему с "лишними" русскими буквами. Вешать их на []{}(§)... и вводить в режиме Ext Mode - неудобно, непрактично и несолидно (для хороших программистов, разумеется). Мое предложение, реализованное в программе K-FORTH - дополнительный русский регистр для "лишних" и, кстати, более редких букв. Я их подвесил на TYUIOP (ЧШЩЪЭЮ). Подробнее -описание языка K-FORTH. В результате, каждой русской букве соответствует только одна
клавиша, символы []{}~|. вводятся как обычно: через SymbolShift (если называть обычным для этих символов ввод не в режиме ExtMode). •f Стандарт ИЦУКЕН - используется везде. Но здесь тоже проблема, куда вешать "лишние" русские буквы.
6. Расширенные русифицированные, 48- и 56-клавишные, клавиатуры. Идея заключается не в добавлении новых клавиш с двумя, тремя и более контактов (было где-то такое идиотское предложение), а в использовании разрядов D5 и D7 порта #FE. Действительно, для чтения состояния клавиатуры используются D0.D4, разряд D6 - чтение с магнитофона. Используя D5 и D7 можно прицепить еще несколько клавиш. Идея была высказана в каком-то номере Радиолюбителя. Автор статьи утверждал, что всего можно добавить 15 клавиш, а я думаю, что все 16. В любом случае этого более чем достаточно для русификации. Отличная идея так и не получила развития. Я вижу две причины:
1. Не все владельцы Спектрума читают Радиолюбитель.
2. Нет стандарта, что на какие разряды подсоединять, как располагать клавиши, какой код каждой клавише присваивать. В результате программисты не пишут, а аппаратчики не делают.
Возможны два варианта клавиатуры: •S - с 8 дополнительными клавишами - используется только один дополнительный разряд D5
(русские буквы, регистры) - 48 клавиш; •S - с 16(15) дополнительными клавишами - используются оба дополнительных разряда D5 и D7 (русские буквы, регистры, знаки, функциональные клавиши) - 56 клавиш.
Клавиши с двумя контактами для ввода точек, запятых и т. д. я не считал. С ними клавиатура будет ещё более полной.
7. Стандарт расширений имен (типов) файлов в TR-DOS. К сожалению, расширение имени файла состоит только из одного, хотя и любого символа. Сейчас каждый уважающий себя программист использует свои расширения, мало заботясь, что другой также использует их, но для других целей. При отсутствии каталогов в ДОС это вызывает конфликты. Стандартные расширения:
B - BASIC-файл. Можно понимать и как BAT-файл. D-DATA.
C - CODE. Универсальный кодовый файл. Может содержать все что угодно, начиная с текста и заканчивая программой. Поэтому весьма неудобен для специализированных данных.
# - Файлы прямого и последовательного доступа. Предлагаю другие:
0-9 - Использовать вместо "C" для хранения блоков, всегда присутствующих вместе с основной программой -оверлейные блоки, дозагружаемые уровни и т.п. Таким блокам удобно давать имя, как и у основной программы.
E или X - Запускаемые кодовые файлы - аналог ЕХЕ и СОМ в IBM и СОМ в IS-DOS. Далее я ещё вернусь к этому.
T - Текстовые файлы. Неплохо бы стандартизировать и формат таких файлов. @ - MAGIC-файлы (см. далее).
* - Отзагрузочные блоки. Кстати, так как заранее известно, куда грузится блок и его длина, то 4 байта заголовка файла (адрес и длина) можно использовать для идентификации и поиска в каталоге. Для поиска вместо 9 использовать 13 символов -значение в (#5D06) ячейке ДОС. Эту идею могут использовать и другие программы. Например, для идентификации текстовых файлов использовать два байта адреса загрузки.
a,p,c,h (строчные) - Зарезервировать для языков программирования Ассемблер, Паскаль, Си на тот случай, если их кто-то когда-нибудь напишет. Нынешнее состояние языков высокого уровня, как уже говорилось, плачевное.
G - Предлагаю использовать для текстовых файлов в формате GENS-4. Если заменить байт 2803 от начала с 66("С") на 71("G") (сектор 11 начиная с 1, байт 243) все файлы будут типа G. Очень удобно - в каталоге сразу их видно, и ни с чем не спутаешь. Одна проблема - файлы, записанные командой "О" будут иметь тот же тип. Может, кто сможет решить и эту проблему? F,f - Используются программой K-FORTH.
8. Расширенный KEMPSTON-JOYSTIK за счёт использования разрядов D5, D6 и D7. Возможны варианты KEMPSTON-2 и KEMPSTON-3. В первом варианте добавляются две новые кнопки. Он может использоваться и как расширенный SINCLIAR-JOYSTIK, разумеется если интерфейс последнего сделан отдельно от клавиатуры (INTERFACE-II). Во втором варианте добавлены три кнопки. Непонятно, почему до этого никто не додумался!
Сэр Синклер, создавая этот замечательный компьютер, при всей своей гениальности, не смог предвидеть популярности своего детища. Скорее всего, стояла задача в минимальные сроки выбросить на рынок новую модель дешевого компьютера. В результате мы пожинаем недостатки неудачно "сляпанного" ПЗУ. Вот если бы одно-два RST было выделено под функции DOS, BIOS. He пришлось бы запрещать модификацию ПЗУ, система получила бы возможность развиваться, да и с дисковыми ОС проблем было бы меньше. А в результате, на текущий момент все застряло на уровне каменного века.
Задача всех поклонников Спектрума исправить ошибку К. Синклера. Ожидаю возражений -внесение изменений в ПЗУ повлечёт за собой повальную несовместимость - именно по этой причине и было наложено табу, тем более полно примеров неудачных русификации и т.д. К сожалению, несовместимость будет. Однако следует подумать, что можно сделать:
1. Идея стара, как сам Спектрум, если не старше - альтернативное ПЗУ (имено альтернативное, а не теневое). Но раньше пользователь с таким ПЗУ вынужден был мучаться в одиночку. А надо делать всё централизовано, чтобы любой пользователь смог получить новую версию ПЗУ. Здесь ИНФОРКОМ может стать дистрибьютором. С кем заключить договор на изготовление (прошивку), кому продать права, Вы знаете лучше меня.
Для начала предлагаю устроить Всеспектрумовское обсуждение ПРОЕКТа ZX-ROM-95 -каким оно должно быть. В результате Спектрум будет иметь два ПЗУ - старое (стандартное) и новое (альтернативное или уже основное?), плюс тумблер для их переключения.
2. Возвращаюсь к проблеме совместимости. Необходимо разобраться с наиболее часто используемыми процедурами и не изменять адреса их наиболее важных входных точек.
3. Некоторые ячейки ПЗУ используются в качестве адресов во втором режиме прерываний (IM 2). Не все адреса в ПЗУ имеют смысл, но остальные придётся обходить. Некоторые предложения по усовершенствованию DOS:
1. Добавление новых функций #3D13. Вызов функций ДОС через RST (об этом ниже).
2. Использование дискового пространства, занимаемого стёртыми файлами.
3. Обновление файлов - запись нового файла поверх старого с тем же именем.
4. Сегментированные файлы. Здесь TR-DOS не предоставляет простого решения, но кое-что можно попробовать.
5. Отмена тестирования дисковода (определения, сколько сторон и дорожек). Традиционно со Спектрумом используются только дисководы на 720 К Отмена тестирования приведёт к ускорению инициализации системы.
6. Прекратить "ёрзанье" головок дисковода туда-сюда при ошибке чтения. Если у кого-то разболтанный флоппер, то почему должны мучаться те, у кого хороший? Опыт работы с DCU показывает, что если сектор не читается, то никакое ёрзанье уже не помогает. Кроме того, если дело в точности позиционирования, не достаточно ли переместить головки на соседний трек и назад?
7. Удалить из ПЗУ ДОС всё, что имеет отношение к INTERFACE-! Освободится не много места.
8. Ещё один способ освободить место - удалить интерпретатор команд Бейсика-128. На мой взгляд, Бейсик-128 давно пора заменить чем-нибудь получше. Говорю как владелец 128 машины (см. далее).
9. Динамическое выделение временного буфера нельзя признать удачным. Предлагаю выделять буфер в области стека. Например:
; Помещаем в HL значение SP:
LD HL,0
ADD HL,SP ; Выделяем 256+1=257 байт
DEC H
DEC HL ; HL адрес буфера.
LD SP,HL ; Буфер выделен.
10. Работа Бейсика с файлами произвольного типа, а не только B, C, D и #. Потребуются и некоторые другие доработки, ведь Бейсик играет роль командного языка ДОС.
11. Усовершенствование MAGIC. Без порчи ячеек памяти, с определением IM 1 или IM 2, корректная работа с R. Кто не знает, как отличить IM 1 от IM 2 расскажу в другой раз. Новая MAGIC не будет совместима со старым. Желательно использовать для MAGIC-файлов специальный тип, например "@".
12. Грамотная обработка ситуаций "Disk error" и "Read only".
13. Запускаемые кодовые файлы типа "E".
14. Передача программе параметров через командную строку. Например: RUN "gens5" BIN ,"/a /с /n". Здесь запускается кодовый файл с расширением E, которому передаются параметры через символьную строку.
15. Ввести ограничения на используемые в именах и расширениях файлов символы.
16. С новым ПЗУ решится проблема с винчестером. Но это отдельная тема. Предложения по усовершенствованию SOS:
1. Разумеется, полная русификация.
2. Устранение ошибок в процедурах ввода/вывода, и незначительное их усовершенствование.
3. Вместо ZX-PRINTERa поддержка LPRINT-III.
4. Связь с TR-DOS через процедуру, обработки ошибок. Во-первых, это позволит вводить операторы в "нормальном" виде. Например: 100 SAVE *"MyFile" CHR$ "H",40000,100,"Y". Здесь приведён пример, как может выглядеть оператор записи на диск кодового файла с произвольным типом. Тип файла в примере "H". Ключ "Y" означает, что система запрос "Overwrite (y/n)?" задавать не будет.
Во-вторых, мы получим возможность вызова функций ДОС через RST! Для этого после RST 8 необходимо разместить байт кода функции ДОС (DEFB fun), отличный от кодов ошибок Бейсика - 0.26 и 255.
5. Пора разработать и "мышиный" стандарт с поддержкой интерфейса мыши через функции
ДОС.
Излагать в данном письме доводы по спорным вопросам и конкретные рекомендации не входит в мою задачу. Если такое новое ПЗУ будет разработано, считайте меня первым клиентом на его приобретение.
Следует признать, для уровня 90-х годов TR-DOS лишь по старой памяти претендует на то, чтобы называться операционной системой. По сути, это лишь имитация ленточных операций на дисководе, с некоторыми дополнительными возможностями. Даже место, занятое "стёртыми" файлами использовать не может и пишет как на ленту - последовательно. Вот только ленту можно перемотать и записывать с самого начала, а диск - нет. Кое-что я уже предложил выше. На самом же деле всё не так плохо - уже существует система IS-DOS, которая загружается с дискеты. Однако не следует забывать - главное достоинство Спектрума в том, что вся его ОС (Бейсик и
ДОС) находятся в ПЗУ и не требуют загрузки, то есть всегда под рукой. Значит, то же самое необходимо сделать и с IS-DOS.
Говорят, поддержку IS-DOS в ПЗУ собираются сделать в Скорпионе. Я предлагаю сделать это в обычном компьютере. Вначале речь пойдет о Спектру ме-128.
Идея проста. Два разряда - разряд D4 порта #FFFD Спектрума-128 (переключение ПЗУ 48/128) и сигнал выбора теневого ПЗУ в BETA-DISK, в различных комбинациях позволяют адресовать 4 16-ти килобайтные страницы ПЗУ. Три страницы заняты Бейсиком-48, Бейсиком-128 и ДОС. Получается, что мы сразу нашли 16 не используемых килобайт адресного пространства. Бейсик-128 - это ещё 16 килобайт. На мой взгляд, от этого довеска на Спектрум-128 одна морока с загрузкой программ. Лучше бы Синклер что-нибудь типа ВЕТА-MEGA-BASICa приспособил. Получается 32 килобайта, что достаточно для размещения небольшой оболочки.
Не вдаваясь в технические детали, скажу, что для подобного усовершенствования Спектрума-128, хотя и придётся взять в руки паяльник, не требуется" каких либо особых знаний электроники и дефицитных деталей.
Спектрум-48. Здесь несколько сложней - придётся паять порт #7FFD. Впрочем, проблема не столь велика, как кажется, тем более установка микросхем ОЗУ совсем не обязательна. Возможно, кто-то займётся распространением ПЗУ вместе с небольшой платой, на которой распаяны порты Спектрума-128 (всего три мелкосхемки плюс ПЗУ) и, кроме того, предусмотрено место для установки музыкального сопроцессора и дополнительной линейки ОЗУ (ещё две мелкосхемки) и ещё чего-нибудь (интерфейс принтера, например). Также не буду вдаваться в технические детали. Тем более, я уверен, что для каждой конкретной модели компьютера найдётся владелец, который сразу смекнёт, где что перерезать и что куда подпаять, а потом поделится опытом с остальными.
Надеюсь, что мое предложение все-таки кого-нибудь заинтересует.
Пусть извинят меня владельцы Спектрума без BETA-DISKa. В свое время я достаточно наигрался-напрограммировался с магнитофоном и считаю, что поднятые мною проблемы в целом для них не существенны. Ибо использовать компьютер без ДОС можно с грехом пополам только как игровую приставку.
Готов написать подробнее по некоторых проблемам, подискутировать по спорным вопросам.
Приложение 1.
Примеры описания портов ввода/вывода.
Разряды адреса:
X разряд не анализируется, но для совместимости должен быть установлен в 1; Z разряд не анализируется, но для совместимости должен быть установлен в 0;
- (минусы в старших разрядах адреса) разряды не анализируются и могут быть любыми;
Разряды данных: IN OUT
0 - всегда вчитается 0 всегда должен быть 0
1 - всегда читается 1 всегда должна быть 1
X- - состояние пассивной шины данных не используется и может быть любым
В скобках указан рекомендуемый адрес. 1. KEMPSTON JOYSTIK IN FEDCBA98 7 654 3210
--------ZZ0XXXXX
(#1F,31)
- чтение состояния контактов джойстика D7 = 0
D6 = 0 D5 = 0
D4 = стрельба
D3 = вниз D2 = вверх D1 = вправо D0 = влево
Особенности: Из старших разрядов всегда читаются нули. Это позволяет определить, подключен ли джойстик, что многие программы и делают. Однако в наших компьютерах этот номер часто не проходит.
Конфликты: Интерфейс на ВВ55 (#1F, #3F, #5F, #7F).
Дополнение: Используя старшие разряды можно получить джойстик с большим набором функций. Так как пассивное состояние разрядов порта - ноль, это не помешает определению наличия кемпстона.
2. INTERFACE LPRINT-III IN FEDCBA98 7 654 3210
--------SXXXX0XX
(#7В, 123, #FB, 251) A7 = селектор ПЗУ (0 - основное, 1 -теневое); D7 = "BUSY (0 - принтер занят, 1 - готов к приёму данных); D6.D0 - не используются (в параллельном интерфейсе). OUT FEDCBA98 7 654 3210
--------SXXXX0XX
(#7В, 123, #FB, 251) A7 = "STROBE (в момент изм.0->1 принтер принимает данные); D7.D0 = DATA (данные на принтер).
Адресный разряд A7 может быть как 0 так и 1, поэтому указаны два адреса. Особенности: Подпрограмма в ПЗУ, ответственная за ZX-PRINTER, перед любой операцией, в том числе и перед, записью в буфер, определяет подключен ли принтер чтением из порта #FB. Единица в разряде A7 служит переключателем на теневое ПЗУ. Для обратного переключения используется холостая команда чтения из порта #7B. Именно этот адрес рекомендуется использовать программистам, работающим с портами интерфейса напрямую. Внимание! Самодельный интерфейс может не иметь теневого ПЗУ. Конфликты: Интерфейс на ВВ55 (#1F, #3F, #5F, #7F), который выбирается при нуле в A7.
Алгоритм передачи данных:
; А = байт на принтер.
WAIT IN A,(#7B) ; Байт состояния принтера.
Бит готовности в флаг CF. Переход, если принтер готов. Принтер не готов: Опрос BREAK (CapsShift+Space), Цикл ожидания готовности. Сообщение об ошибке.
Принтер готов: Вывод байта. STROBE=0 Вывод байта. STROBE=1
*************************************************************************************
© П.В. и С.П. Макарычевы, Москва.