ZX Review #11-12
26 ноября 1997

Форум - О русификации игровых программ.

<b>Форум</b> - О русификации игровых программ.
┌──────────────────────────────┐
│                              │
│            ФОРУМ             │
│                              │
└──────────────────────────────┘

Music by MITCHELL

(c) 1996 Алексей Пичугин, г.Са-
ратов

      И ЕЩЕ О РУСИФИКАЦИИ

            ВВЕДЕНИЕ

   История  Спектрума  в  России
уже перевалила за  десяток  лет.
Многое изменилось со времен  по-
явления  первых компьютеров "из-
за бугра"; сейчас многие  солид-
ные заводы  изготавливают  клоны
ZX-Spectrum-совместимых машин, и
многие программисты уже в России
пишут новые  программы  для  по-
любившегося компьютера.  Однако,
как  ни  странно, самая  главная
проблема,  которая  обрушивается
на начинающего программиста, ос-
ваивающего азы  бейсика, до  сих
пор  не  решена.  Конечно,  речь
идет о русификации.
   На сегодняшний день существу-
ет несколько способов  русифика-
ции, хорошо известных чуть более
искушенному пользователю. Совсем
неосведомленных можно отослать к
книгам (1) и  (2)  из  списка  в
конце статьи. Я  же  отмечу, что
все эти способы имеют два основ-
ных  недостатка, которые  делают
невозможным применение компьюте-
ра начинающими (в частности, это
актуально в образовании):
   1. Совершенно нечитаемый лис-
тинг. Как Вам, например, нравит-
ся такой характерный текст прог-
раммы:

   10 GO SUB rus: PRINT "Menq zowut";
   20 GO SUB eng: PRINT " ZX-Spectrum"

А ведь при наборе  русских  букв
эта программа выглядит еще хуже,
становясь  похожей  на  какой-то
ребус:

   10 ГО СУБ рус: ПРИНТ "Меня зовут";
   20 ГО СУБ енг: ПРИНТ "Зь-Спецтрум"

   Я уже не говорю о русификации
с помощью UDG:  хотя  листинг  и
выглядит прилично, но  ограниче-
ние в количестве букв превращает
набор текста в головоломку (циф-
ра 3 вместо буквы З и другие по-
добные  фокусы), не  позволяя  к
тому же менять регистр букв.
   2. Значительная  потеря  быс-
тродействия: при русификации до-
полнительными шрифтами это  зат-
раты времени на  GOSUB'ы  и  PO-
KE'и; метод же, описанный в кни-
ге (2), требует  умышленных  за-
держек (которые также  не  укра-
шают текст программы):

   10 CLS: PRINT AT SQR 1,0;"..."

   С  учетом   вышеперечисленных
фактов был разработан новый  ру-
сификатор  для  Спектрума, кото-
рый, во-первых,  позволяет  осу-
ществлять ввод и  редактирование
программ, использующих два шриф-
та, без всяких ухищрений, а  во-
вторых, поддерживает  работу ре-
дактора и интерпретатора бейсика
с русскими буквами без обремени-
тельных требований к  программи-
сту.
   Итак, перейдем к описанию са-
мой программы.

      РУСИФИКАТОР TypeEasy

   Сам  способ  русификации, ис-
пользованный в программе, далеко
не нов. Русификатор перенастраи-
вает каналы стандартного ввода и
вывода на себя и  добавляет  еще
два управляющих кода к уже суще-
ствующим: 4 - включение английс-
кого шрифта, 5 - включение  рус-
ского шрифта. Как  уже  писалось
в сборнике  ZX-FORUM 2, у  этого
прекрасного  способа  есть  один
существенный недостаток. Дело  в
том, что при своей работе интер-
претатор  бейсика   периодически
обновляет  настройку  каналов, и
поэтому работа такого  русифика-
тора продолжается  до выполнения
одной из команд:  RUN, CLS, CLE-
AR, или даже просто  до  нажатия
клавиши  <Enter>  при  получении
автоматического листинга.
   Изюминка нового способа руси-
фикации заключается  в  том, что
TypeEasy полностью перехватывает
управление  системой, и, по  су-
ти дела, является  интерпретато-
ром бейсика, "надстроенным"  над
стандартным (по такому  принципу
работает  серия  интерпретаторов
Beta Basic, Laser Basic и утили-
та Blast toolkit). Это позволяет
подменить практически все крити-
чные процедуры и добиться  очень
удобной русификации.

         "БЛИЖЕ К ДЕЛУ!"

   Чтобы получить  рабочую  вер-
сию программы, Вам придется  на-
бить дамп кодов.  Дамп  содержит
скомпрессированную версию  Type-
Easy (это позволит  Вам  сберечь
несколько минут), а все инструк-
ции даны  в  расчете  на  распа-
кованную версию, поэтому  деком-
прессируйте  программу  командой
RANDOMIZE USR  32000.  Сохраните
полученный блок  кодов  инструк-
цией  SAVE  "te" CODE 63000,2368
(или какой-либо другой, сообраз-
но требованиям вашего  накопите-
ля информации). Перед всеми эти-
ми манипуляциями не забудьте ус-
тановить RAMTOP ниже кода  прог-
раммы командой CLEAR 31999.  Те-
перь осталось лишь снабдить  ру-
сификатор загрузчиком:

   1 INK VAL "7": PAPER NOT PI: BORDER NOT PI: CLEAR VAL
    "62999": LOAD "te"CODE: RANDOMIZE USR VAL "63E3"

   Теперь Вы можете затаить  ды-
хание  и  запустить   программу.
Сразу поясню,  что  единственным
(?)  отличием  от   стандартного
бейсика  будет  замена   функций
клавиш <TrueVideo> и <InvVideo>.
Первая служит для включения  ан-
глийского шрифта, вторая  -  для
включения русского.  Хорошенько-
го понемножку, и сейчас  я  хочу
описать многочисленные...

      НЕДОСТАТКИ ПРОГРАММЫ

   Недостатков    предостаточно.
Основным является конфликт с не-
которыми версиями TR-DOS. Прояв-
ляется он в  полном  игнорирова-
нии команд TR-DOS при их  запус-
ке из бейсика. Программисты фир-
мы "Technology  Research"  очень
активно использовали подпрограм-
мы  из  ПЗУ  Спектрума, и  такая
"технология" привела к совершен-
но невероятной степени неуживчи-
вости TR-DOS. Единственным  спо-
собом борьбы с этим  недостатком
представляется  перехват  команд
для работы с  диском  на  уровне
интерпретатора и  их  реализация
на файловом уровне. Но эту  ста-
тью мне все-таки хотелось посвя-
тить проблемам русификации, а не
работы с диском.  Для  того  же,
чтобы обладатели дисководов смо-
гли работать с  TypeEasy  и  ис-
пользовать возможности TR-DOS, в
русификаторе перехвачена  коман-
лда NEW. Теперь эта  команда  не
уничтожает  программу, а  просто
передает  управление   основному
бейсику. Конечно, при  этом  ис-
портится внешний вид  программы,
но зато  снова  станут  доступны
команды TR-DOS. Вернуться в  ру-
сификатор можно в любой  момент,
используя RANDOMIZE USR 63000.
   Второй, гораздо менее серьез-
ный недостаток  состоит  в  том,
что алгоритмы листинга и  интер-
претации  по-разному   обрабаты-
вают текст  программы, и  сущес-
твует  ряд  ситуаций, в  которых
верно написанная программа  дает
неверный результат. Приведу при-
мер:

   10 PRINT "Меня зовут"'TAB 10;"ZX-Spectrum"

будет   печатать   "ZX-Spectrum"
русскими буквами. Не  углубляясь
в подробности, лишь  поясню, что
для устранения подобных  проблем
достаточно добавить  управляющий
код  соответствующего  шрифта  в
начале  неправильно   печатаемой
строки.
   Третьим (не  волнуйтесь, пос-
ледним) недостатком  можно  счи-
тать неполный перехват  прерыва-
ния печати символов, а  конкрет-
нее, не обрабатывается процедура
автоматического скроллинга. Поэ-
тому печать приглашения  Scroll?
приводит к потере  русификатором
контроля над нижним  (служебным)
экраном; разумеется, это не  фа-
тально, и любая из команд:  CLS,
CLEAR, INPUT, RUN, исправит  по-
ложение. Однако, все-таки  жела-
тельно избегать  появления  этой
ситуации вообще, для  чего  мож-
но порекомендовать использование
ячейки SCR_CT (23692). В ней со-
держится число, на единицу боль-
шее, чем  число  строк,  которые
осталось передвинуть до  запроса
"Scroll?". Поэтому, разбавив ва-
шу  программу  командами    POKE
23692,255, Вы  сможете  добиться
безостановочного скроллинга.

           ЗАМЕЧАНИЯ

   Кроме  недостатков, программа
имеет несколько полезных и  бес-
полезных свойств. Для того, что-
бы создавать программы, работаю-
щие независимо от TypeEasy, пре-
дусмотрен  специальный  вход  по
адресу 63062.  Запуск  по  этому
адресу приведет к автоматическо-
му исполнению команды  RUN  (уже
под управлением  русификатора) -
Вам лишь потребуется, чтобы пер-
вой строкой вашей программы  бы-
ла команда перехода  на  старто-
вую строку.
   Перехват бейсика дает возмож-
ность абсолютной защиты от нажа-
тия BREAK. Обнулив ячейки с  ад-
ресами  от  64263  до  64268, Вы
ликвидируете  проверку   нажатия
BREAK в  интерпретаторе.  Можете
считать, что эта клавиша  больше
не  существует.  Лучше  не   ис-
пользовать  эту  возможность   в
процессе отладки  -  это  спасет
Вам много времени на перезагруз-
ках не то чтобы зависшей, но яв-
но подвешенной машины.
   О шрифтах. Если Вас не устра-
ивает качество  стилизации  рус-
ского шрифта, то Вы можете  под-
грузить любой  другой  с  адреса
64600. Замена  же  стиля  потре-
бует более солидных переделок, а
именно - Вам  придется  высвобо-
дить еще 768 байт где-нибудь ни-
же TypeEasy, поместить туда  ан-
глийский  шрифт  и  записать   в
ячейки с адресами 63421 и  63422
адрес английского шрифта, умень-
шенный на 256. Используя  приве-
денный ниже  ассемблерный  текст
программы, чуть  более  искушен-
ные читатели  смогут  изготовить
специальную  двухшрифтовую  вер-
сию  (сам я использую именно та-
кую).
   Возможно, я сберегу несколько
секунд  счастливым   обладателям
компьютеров со  128  килобайтами
памяти, если замечу, что  работа
русификатора возможна лишь в ре-
жиме 48  basic.  Это  связано  с
тем, что  TypeEasy  активно  ис-
пользует  подпрограммы  ПЗУ   48
(равно  как  и  раскритикованная
выше TR-DOS).  Теоретически, мо-
гут существовать  прошивки  ПЗУ,
несовместимые с TypeEasy; у  ме-
ня не было возможности  исследо-
вать разнообразные  прошивки  на
совместимость, но те части  ПЗУ,
на которые  ссылается  русифика-
тор, редко бывают изменены. Наи-
более "опасными" в  смысле  сов-
местимости  являются  наворочен-
ные  русифицированные  прошивки,
наподобие той, что в  компьютере
Дельта-СА. Я не  могу  дать  ка-
кой-то  универсальный  совет  по
устранению  несовместимости  ва-
шей прошивки и  русификатора;  с
каждой такой прошивкой надо раз-
бираться индивидуально (а  лучше
всего разбирать такие  компьюте-
ры, и прошивать заново).
   В заключение  хочу  предосте-
речь всех (а  особенно  начинаю-
щих) программистов от одной  ха-
рактерной ошибки  при  работе  с
TypeEasy. Дело в том, что  руси-
фикация  производится  управляю-
щими кодами, и  не  стоит  удив-
ляться, если команда  PRINT  LEN
"строка" напечатает  число  7, а
то и больше.  Точно так же, без-
надежно надеяться, что  програм-
ма:

   10 LET a$=INKEY$: IF a$<>"Д" THEN GO TO 10

как-нибудь отреагирует на  нажа-
тие клавиши, отличной от  BREAK.
Это следует учитывать при  любых
манипуляциях со строками.

    "А КАК ЭТО ВСЕ РАБОТАЕТ?"

   Если  Вы  дочитали  до  этого
места, и, кроме того, умеете пи-
сать  программы  на  ассемблере,
то, наверное, Вам стало интерес-
но, как это все работает. Я пос-
тараюсь  в  самых  общих  чертах
прокомментировать   ассемблерный
текст программы. Замечу, что нет
смысла вдаваться в тонкости  ра-
боты интерпретатора, потому  что
это уже проделано в книгах  (3)-
(5). Поэтому все написанное  да-
лее  лишь  поясняет  отличия  от
ПЗУ.
   При написании программы я ис-
пользовал  ассемблер  Zeus  (мне
удобство  редактирования  дороже
удобств компиляции);  и  в  силу
его  врожденной  непереносимости
программа   компилировалась   со
смещением: она работоспособна  с
адреса  63000, а  размещается  с
49152.  Строки  30-220  содержат
команды, которые очищают экран и
печатают название программы. За-
тем, в  строках  230-410  строка
редактирования  инициализируется
с "введенным" значением "1"  ли-
бо "RUN" (код - 247).  В  первом
случае это служит  для  удаления
строки 1 программы, во втором  -
для "запуска с автостартом". Да-
лее чистится стек и  запускается
основная программа.
   В строках 420-1880  содержит-
ся практически полная копия про-
граммы MAIN  EXECUTION  из  ПЗУ.
Эта программа осуществляет  весь
цикл  ввода   и   редактирования
строки. В ней перехвачены  вызо-
вы тех подпрограмм, которые  мо-
гут изменять настройку каналов.
   Процедуры SETR и  SETE  уста-
навливают соответственно русский
либо  английский  шрифт.  Именно
здесь Вы  можете  задать  нужные
адреса шрифтов для версии с дву-
мя шрифтами.
   CHANR - это подпрограмма  для
обслуживания каналов  вывода  на
экран. Поясню загадочные манипу-
ляции в ее начале.  Строки 2090-
2170 проверяют, не осуществляет-
ся ли печать из процедуры  печа-
ти ключевых  слов  и  сообщений.
Благодаря такой проверке все то-
кены и сообщения об ошибках  пе-
чатаются английскими буквами  (и
никаких ГО  СУБ!).  Затем  CHANR
отлавливает и  обрабатывает  уп-
равляющие коды переключения шри-
фтов. При желании Вы можете  до-
бавить сюда и  другие  управляю-
щие коды, или даже создать  свои
токены (в Beta-Basic'е они заме-
няют символы псевдографики).
   Подпрограммы   ALIST,  CLSUP,
INIT, CLSDN и программа  команды
CLS  (CCLS)  содержали  команды,
которые  перенастраивали  каналы
на  ПЗУ.  Все  они   перехвачены
вплоть до упоминания  об  адресе
процедуры обслуживания  каналов,
адрес заменен на CHANR, а  затем
управление передается в ПЗУ.
   STRED -  программа  редактора
строки; она используется как при
редактировании программы, так  и
при вводе по  команде  INPUT.  В
ней пришлось  переработать  под-
программы обработки  управляющих
кодов 10 и  11  (курсор  вниз  и
вверх по листингу)  и  процедуру
READS (она читает очередной сим-
вол  с  клавиатуры).  В   строке
3590 устанавливается  английский
шрифт, это необходимо для одноз-
начной работы подпрограммы #111D
печати содержимого буфера  стро-
ки.
   Далее идет программа  команды
INPUT. Для обеспечения  правиль-
ной работы русификатора ее приш-
лось продублировать всю, несмот-
ря на существенные затраты памя-
ти. А требовалось это для перех-
вата обращений к редактору стро-
ки.
   Подпрограммы  команд  RUN   и
CLEAR  обращаются  к   процедуре
CCLS русификатора, тем самым  не
нарушая настройку каналов.
   Программы SYNTAX  и  INTER  -
синтаксический анализатор и  ин-
терпретатор - отделены  друг  от
друга довольно условно, по адре-
су вызова из MAIN EXECUTION.  На
самом деле эти  программы  имеют
множество взаимосвязей и  перек-
рестных ссылок.  Наиболее  инте-
ресны здесь строки  5630-5830, в
них реализована подмена стандар-
тных  команд  NEW,  REM,  INPUT,
RUN, IF, CLS, CLEAR. Таким мето-
дом и Вы можете подменять коман-
ды бейсика  или  даже  добавлять
новые на место символов псевдог-
рафики  (особенно  удобно  вклю-
чать обработку  таких  команд  в
строку  5850, здесь  #1C8A - ад-
рес перехода при  синтаксической
ошибке).
   CIF - программа  команды  IF.
Может показаться странным перех-
ват этой команды,  вроде  бы  не
имеющей отношения к очистке  ка-
налов. Перехват  потребовался  в
связи  с  тем, что  подпрограмма
команды IF содержит в  себе  ко-
манды  переходов  непосредствен-
но в  интерпретатор/синтаксичес-
кий анализатор. При  этом  Type-
Easy теряет контроль над  испол-
нением программы, и все  подмены
команд CLEAR, CLS, и т.п. стано-
вятся бездейственными. С этой же
целью была  перехвачена  команда
REM  (вся  ее  программа - метка
CREM в интерпретаторе).
   Последний  фрагмент  програм-
мы - процедура команды NEW.  Как
уже  упоминалось   раньше,  цель
этой команды  в  TypeEasy - воз-
врат в  стандартный  бейсик  без
уничтожения  программы.  Поэтому
CNEW  инициализирует  стек, очи-
щает экран (настраивая  програм-
мы потоков из ПЗУ), а затем  пе-
редает управление ПЗУ 48.
   Следующая после этого  табли-
ца  называется  таблицей  класса
команд, она содержит коды  типов
аргументов и адреса  подпрограмм
команд. Это довольно сложный ме-
ханизм, и для его понимания я бы
посоветовал обратиться  к  книге
(3). Я понимаю, что она есть  не
у всех, сам я пользовался гораз-
до более  общим  описанием  (4).
Уже после написания  TypeEasy  я
нашел  в  ZX-РЕВЮ  за  1991  год
прекрасный цикл статей  "Секреты
ПЗУ", и пожалел, что он  не  по-
пал ко мне  в  руки  раньше.  По
своему качеству материал  в  ZX-
РЕВЮ лежит где-то между  книгами
(3) и (4).  В любом случае, мак-
симум информации можно получить,
имея дизассемблер (любой) и  хо-
рошее описание  системных  пере-
менных  (например, такое, как  в
(1)).

           ЗАКЛЮЧЕНИЕ

   Итак, я закончил описание Ty-
peEasy.  Этот  русификатор,  как
мне думается, может стать отлич-
ным подспорьем для всех тех, кто
работает на бейсике.  Для  более
квалифицированных  программистов
эта  программа  может  послужить
основой для неограниченного рас-
ширения   функций   стандартного
бейсика, например полной  замены
команд для работы  с  магнитофо-
ном на команды для работы с дис-
ководом  (без  всяких  RANDOMIZE
USR 15619: REM : и т.д.)

          ЛИТЕРАТУРА

   1.  А.Ларченко,   Н.Родионов.
"ZX-Spectrum & TR-DOS для  поль-
зователей   и    программистов",
СПб.: Питер, 1994.
   2. Сборник  "ZX-FORUM 2", М.:
Инфорком, 1994.
   3. Logan I.,  O'Hara F.  "The
Complete Spectrum ROM  Disassem-
bly", UK: Melbourne House  Ltd.,
1983.
   4. Брошюра "Монитор 16К - ру-
ководство  пользователя".  Книга
не имеет никаких ссылок на авто-
ра или издателя.
   5. Журнал ZX-РЕВЮ, 1991  год.
Цикл  статей  "Секреты ПЗУ", М.:
Инфорком, 1991.

        ТЕКСТ ПРОГРАММЫ
1414.
00010         ORG 63000
00020        DISP 49152-$
00030 ;
00040 ;
00050 ; Команды инициализации
00060 ;
00070         LD (IY+49),2
00080         CALL CCLS
00090         LD BC,32
00100         LD DE,TEXT
00110         CALL #203C
00120  WAIT   BIT 5,(IY+1)
00130         JR Z,WAIT
00140         RES 5,(IY+1)
00150  DEL    LD A,"1
00160         JR SLF0
00170  TEXT   DEFB 4
00180         DEFM " TypeEasy
00190         DEFM " V1.0
00200         DEFB 32,127
00210         DEFM "1995 A.
00220         DEFM "Pichugin
00230 ;
00240 ;
00250 ; Вход для самозапуска
00260 ;
00270         LD A,247
00280  SLF0   LD HL,(23641)
00290         LD (HL),A
00300         INC HL
00310         CALL #16B3
00320         LD HL,(23730)
00330         LD (HL),62
00340         DEC HL
00350         LD SP,HL
00360         DEC HL
00370         DEC HL
00380         LD (23613),HL
00390         LD A,32
00400         LD (DEL+1),A
00410         JR START
00420 ;
00430 ;
00440 ; Main Execution
00450 ;
00460  L12A2  LD (IY+49),2
00470         CALL ALIST
00480         CALL #16B0
00490  L12AC  XOR A
00500         CALL #1601
00510         CALL STRED
00520  START  CALL SYNTAX
00530         BIT 7,(IY+0)
00540         JR NZ,L12CF
00550         BIT 4,(IY+48)
00560         JR Z,L1303
00570         LD HL,(23641)
00580         CALL #11A7
00590         LD (IY+0),255
00600         JR L12AC
00610  L12CF  LD HL,(23641)
00620         LD (23645),HL
00630         CALL #19FB
00640         LD A,B
00650         OR C
00660         JP NZ,L155D
00670         RST 24
00680         CP 13
00690         JR Z,L12A2
00700         BIT 0,(IY+48)
00710         CALL NZ,CLSUP
00720         CALL CLSDN
00730         LD A,25
00740         SUB (IY+79)
00750         LD (23692),A
00760         SET 7,(IY+1)
00770         LD (IY+0),255
00780         LD (IY+10),1
00790         CALL INTER
00800  L1303  HALT
00810         RES 5,(IY+1)
00820         LD A,(23610)
00830         INC A
00840  L1313  PUSH AF
00850         LD HL,0
00860         LD (IY+55),H
00870         LD (IY+38),H
00880         LD (23563),HL
00890         INC HL
00900         LD (23574),HL
00910         CALL #16B0
00920         RES 5,(IY+55)
00930         CALL CLSDN
00940         SET 5,(IY+2)
00950         POP AF
00960         CALL SETE
00970         LD B,A
00980         CP 10
00990         JR C,L133C
01000         ADD A,7
01010  L133C  CALL #15EF
01020         LD A,32
01030         RST 16
01040         LD A,B
01050         LD DE,#1391
01060         CALL #0C0A
01070         XOR A
01080         LD DE,#1536
01090         CALL #0C0A
01100         LD BC,(23621)
01110         CALL #1A1B
01120         LD A,":
01130         RST 16
01140         LD C,(IY+13)
01150         LD B,0
01160         CALL #1A1B
01170         CALL #1097
01180         LD A,(23610)
01190         INC A
01200         JR Z,L1386
01210         CP 9
01220         JR Z,L1373
01230         CP 21
01240         JR NZ,L1376
01250  L1373  INC (IY+13)
01260  L1376  LD BC,3
01270         LD DE,23664
01280         LD HL,23620
01290         BIT 7,(HL)
01300         JR Z,L1384
01310         ADD HL,BC
01320  L1384  LDDR
01330  L1386  LD (IY+10),255
01340         RES 3,(IY+1)
01350         JP L12AC
01360  L1555  LD A,16
01370         LD BC,0
01380         JP L1313
01390  L155D  LD (23625),BC
01400         LD HL,(23645)
01410         EX DE,HL
01420         LD HL,L1555
01430         PUSH HL
01440         LD HL,(23649)
01450         SCF
01460         SBC HL,DE
01470         PUSH HL
01480         LD H,B
01490         LD L,C
01500         CALL #196E
01510         JR NZ,L157D
01520         CALL #19B8
01530         CALL #19E8
01540  L157D  POP BC
01550         LD A,C
01560         DEC A
01570         OR B
01580         JR Z,L15AB
01590         PUSH BC
01600         INC BC
01610         INC BC
01620         INC BC
01630         INC BC
01640         DEC HL
01650         LD DE,(23635)
01660         PUSH DE
01670         CALL #1655
01680         POP HL
01690         LD (23635),HL
01700         POP BC
01710         PUSH BC
01720         INC DE
01730         LD HL,(23649)
01740         DEC HL
01750         DEC HL
01760         LDDR
01770         LD HL,(23625)
01780         EX DE,HL
01790         POP BC
01800         LD (HL),B
01810         DEC HL
01820         LD (HL),C
01830         DEC HL
01840         LD (HL),E
01850         DEC HL
01860         LD (HL),D
01870  L15AB  POP AF
01880         JP L12A2
01890 ;
01900 ;
01910 ; Вкл. русского шрифта
01920 ;
01930  SETR   PUSH HL
01940         LD HL,64600-256
01950         JR SEE0
01960 ;
01970 ;
01980 ; Вкл. латинского шрифта
01990 ;
02000  SETE   PUSH HL
02010         LD HL,15616-256
02020  SEE0   LD (23606),HL
02030         POP HL
02040         RET
02050 ;
02060 ;
02070 ; Обслуживание канала
02080 ;
02090  CHANR  LD HL,8
02100         ADD HL,SP
02110         LD E,(HL)
02120         INC HL
02130         LD D,(HL)
02140         LD HL,#0C28
02150         OR A
02160         SBC HL,DE
02170         JR NZ,CHLR0
02180         CALL SETE
02190  CHLR0  CALL #0B03
02200         CP 4
02210         JR NZ,CHLR1
02220         JR SETE
02230  CHLR1  CP 5
02240         JR NZ,CHLR2
02250         JR SETR
02260  CHLR2  CP 16
02270         JP C,#09FC
02280         CP 24
02290         JP NC,#09F7
02300         LD HL,CNTR1
02310         CP 22
02320         JR C,CHLR3
02330         LD HL,CNTR2
02340  CHLR3  PUSH HL
02350         JP #0B03
02360  CNTR1  LD DE,CNTR3
02370         JP #0A7D
02380  CNTR2  LD DE,CNTR4
02390         JP #0A7D
02400  CNTR3  LD DE,CHANR
02410         JP #0A8A
02420  CNTR4  LD DE,CNTR3
02430         JP #0A70
02440 ;
02450 ;
02460 ; Программа листинга
02470 ;
02480  ALIST  LD (23615),SP
02490         LD (IY+2),16
02500         CALL CLSUP
02510         JP #17A0
02520 ;
02530 ;
02540 ; Очистка верхнего экрана
02550 ;
02560  CLSUP  LD HL,0
02570         LD (23677),HL
02580         RES 0,(IY+48)
02590         CALL INIT
02600         LD A,254
02610         CALL #1601
02620         CALL #0D4D
02630         LD B,24
02640         CALL #0E44
02650         LD HL,(23633)
02660         LD DE,CHANR
02670         JP #0DCF
02680 ;
02690 ;
02700 ; Настройка потока
02710 ;
02720  INIT   LD A,253
02730         CALL #1601
02740         LD HL,(23633)
02750         LD DE,CHANR
02760         JP #0D9F
02770 ;
02780 ;
02790 ; Команда "CLS"
02800 ;
02810  CCLS   CALL CLSUP
02820 ;
02830 ;
02840 ; Очистка нижнего экрана
02850 ;
02860  CLSDN  LD HL,23612
02870         RES 5,(HL)
02880         SET 0,(HL)
02890         CALL #0D4D
02900         LD B,(IY+49)
02910         CALL #0E44
02920         LD HL,23232
02930         LD A,(23693)
02940         DEC B
02950         JR CLD2
02960  CLD0   LD C,32
02970  CLD1   DEC HL
02980         LD (HL),A
02990         DEC C
03000         JR NZ,CLD1
03010  CLD2   DJNZ CLD0
03020         LD (IY+49),2
03030         LD A,253
03040         CALL #1601
03050         LD HL,(23633)
03060         LD DE,CHANR
03070         JP #0D9F
03080 ;
03090 ;
03100 ; Строчный редактор
03110 ;
03120  STRED  LD HL,(23613)
03130         PUSH HL
03140  STE0   LD HL,STE4
03150         PUSH HL
03160         LD (23613),SP
03170  STE1   LD DE,READS
03180         CALL #1113
03190         CALL #15D4
03200         PUSH AF
03210         LD HL,200
03220         LD D,H
03230         LD E,(IY-1)
03240         CALL #03B5
03250         POP AF
03260         LD HL,STE1
03270         PUSH HL
03280         CP 11
03290         JR Z,STE2
03300         CP 10
03310         JP NZ,#0F4C
03320         BIT 5,(IY+55)
03330         JP NZ,#1001
03340         LD HL,23625
03350         CALL #190F
03360         JR STE3
03370  STE2   BIT 5,(IY+55)
03380         RET NZ
03390         LD HL,(23625)
03400         CALL #196E
03410         EX DE,HL
03420         CALL #1695
03430         LD HL,23626
03440         CALL #191C
03450  STE3   CALL ALIST
03460         JP #1071
03470  STE4   BIT 4,(IY+48)
03480         JP Z,#1026
03490         LD (IY+0),255
03500         LD D,0
03510         LD E,(IY-2)
03520         LD HL,6800
03530         CALL #03B5
03540         JP STE0
03550 ;
03560 ;
03570 ; Чтение из потока
03580 ;
03590  READS  CALL SETE
03600         BIT 3,(IY+2)
03610         CALL NZ,#111D
03620         OR A
03630         LD HL,23611
03640         BIT 5,(HL)
03650         RET Z
03660         LD A,(23560)
03670         RES 5,(HL)
03680         PUSH AF
03690         INC HL
03700         BIT 5,(HL)
03710         CALL NZ,CLSDN
03720         POP AF
03730         CP 32
03740         CCF
03750         RET C
03760         CP 16
03770         JP NC,#10FA
03780         CP 6
03790         JP NC,#10DB
03800         CP 4
03810         CCF
03820         RET C
03830         LD B,A
03840         AND 1
03850         JP #10D4
03860 ;
03870 ;
03880 ; Команда "INPUT"
03890 ;
03900  CINPUT CALL #2530
03910         JR Z,CIN0
03920         LD A,1
03930         CALL #1601
03940         CALL CLSDN
03950  CIN0   LD (IY+2),1
03960         CALL CINSUB
03970         CALL #1BEE
03980         LD BC,(23688)
03990         LD A,(23659)
04000         CP B
04010         JR C,CIN1
04020         LD C,33
04030         LD B,A
04040  CIN1   LD (23688),BC
04050         LD A,25
04060         SUB B
04070         LD (23692),A
04080         RES 0,(IY+2)
04090         CALL #0DD9
04100         JP CLSDN
04110  CINSUB CALL #204E
04120         JR Z,CINSUB
04130         CP "(
04140         JR NZ,CS00
04150         RST 32
04160         CALL #1FDF
04170         RST 24
04180         CP ")
04190         JP NZ,#1C8A
04200         RST 32
04210         JP CS13
04220  CS00   CP 202

1414.04230         JR NZ,CS01
04240         RST 32
04250         CALL #1C1F
04260         SET 7,(IY+55)
04270         BIT 6,(IY+1)
04280         JP NZ,#1C8A
04290         JR CS02
04300  CS01   CALL #2C8D
04310         JP NC,CS12
04320         CALL #1C1F
04330         RES 7,(IY+55)
04340  CS02   CALL #2530
04350         JP Z,CS13
04360         CALL #16BF
04370         LD HL,23665
04380         RES 6,(HL)
04390         SET 5,(HL)
04400         LD BC,1
04410         BIT 7,(HL)
04420         JR NZ,CS04
04430         LD A,(23611)
04440         AND #40
04450         JR NZ,CS03
04460         LD C,3
04470  CS03   OR (HL)
04480         LD (HL),A
04490  CS04   RST 48
04500         LD (HL),13
04510         BIT 1,C
04520         JR Z,CS05
04530         LD A,34
04540         LD (DE),A
04550         DEC HL
04560         LD (HL),A
04570  CS05   LD (23643),HL
04580         BIT 7,(IY+55)
04590         JR NZ,CS08
04600         LD HL,(23645)
04610         PUSH HL
04620         LD HL,(23613)
04630         PUSH HL
04640  CS06   LD HL,CS06
04650         PUSH HL
04660         BIT 4,(IY+48)
04670         JR Z,CS07
04680         LD (23613),SP
04690  CS07   LD HL,(23649)
04700         CALL #11A7
04710         LD (IY+0),255
04720         CALL STRED
04730         RES 7,(IY+1)
04740         CALL #21B9
04750         JR CS09
04760  CS08   CALL STRED
04770  CS09   LD (IY+34),0
04780         CALL #21D6
04790         JR NZ,CS10
04800         CALL #111D
04810         LD BC,(23682)
04820         CALL #0DD9
04830  CS10   LD HL,2366
04840         RES 5,(HL)
04850         BIT 7,(HL)
04860         RES 7,(HL)
04870         JR NZ,CS11
04880         POP HL
04890         POP HL
04900         LD (23613),HL
04910         POP HL
04920         LD (23647),HL
04930         SET 7,(IY+1)
04940         CALL #21B9
04950         LD HL,(23647)
04960         LD (IY+38),0
04970         LD (23645),HL
04980         JR CS13
04990  CS11   LD HL,(23651)
05000         LD DE,(23649)
05010         SCF
05020         SBC HL,DE
05030         LD B,H
05040         LD C,L
05050         CALL #2AB2
05060         CALL #2AFF
05070         JR CS13
05080  CS12   CALL #1FFC
05090  CS13   CALL #204E
05100         JP Z,CINSUB
05110         RET
05120 ;
05130 ;
05140 ; Команда "RUN"
05150 ;
05160  CRUN   CALL #1E67
05170         LD BC,0
05180         CALL #1E45
05190         JR CCL0
05200 ;
05210 ;
05220 ; Команда "CLEAR"
05230 ;
05240  CCLEAR CALL #1E99
05250  CCL0   LD A,B
05260         OR C
05270         JR NZ,CCL1
05280         LD BC,(23730)
05290  CCL1   PUSH BC
05300         LD DE,(23627)
05310         LD HL,(23641)
05320         DEC HL
05330         CALL #19E5
05340         CALL CCLS
05350         JP #1EC6
05360 ;
05370 ;
05380 ; Анализатор синтаксиса
05390 ;
05400  SYNTAX RES 7,(IY+1)
05410         CALL #19FB
05420         XOR A
05430         LD (23623),A
05440         DEC A
05450         LD (23610),A
05460         JR SYN1
05470  SYN0   RST 32
05480  SYN1   CALL SETE
05490         CALL #16BF
05500         INC (IY+13)
05510         JP M,#1C8A
05520         RST 24
05530         LD B,0
05540         CP 13
05550         JP Z,INT1
05560         CP ":
05570         JR Z,SYN0
05580         LD HL,SYN4
05590         PUSH HL
05600         LD C,A
05610         RST 32
05620         LD A,C
05630         CP 230
05640         LD HL,TNEW
05650         JR Z,SYN3
05660         CP 234
05670         LD HL,TREM
05680         JR Z,SYN3
05690         CP 238
05700         LD HL,TINPUT
05710         JR Z,SYN3
05720         CP 247
05730         LD HL,TRUN
05740         JR Z,SYN3
05750         CP 250
05760         LD HL,TIF
05770         JR Z,SYN3
05780         CP 251
05790         LD HL,TCLS
05800         JR Z,SYN3
05810         CP 253
05820         LD HL,TCLEAR
05830         JR Z,SYN3
05840         SUB 206
05850         JP C,#1C8A
05860         LD C,A
05870         LD HL,#1A48
05880         ADD HL,BC
05890         LD C,(HL)
05900         ADD HL,BC
05910         JR SYN3
05920  SYN2   LD HL,(23668)
05930  SYN3   LD A,(HL)
05940         INC HL
05950         LD (23668),HL
05960         LD BC,SYN2
05970         JP #1B5D
05980  SYN4   CALL #1F54
05990         JP NC,#1B7B
06000         BIT 7,(IY+10)
06010         JR NZ,INT6
06020         LD HL,(23618)
06030         BIT 7,H
06040         JR Z,INT0
06050 ;
06060 ;
06070 ; Интерпретатор
06080 ;
06090  INTER  LD HL,65534
06100         LD (23621),HL
06110         LD HL,(23649)
06120         DEC HL
06130         LD DE,(23641)
06140         DEC DE
06150         LD A,(23620)
06160         JR INT4
06170  INT0   CALL #196E
06180         LD A,(23620)
06190         JR Z,INT2
06200         AND A
06210         JR NZ,INT5
06220         LD B,A
06230         LD A,(HL)
06240         AND 192
06250         LD A,B
06260         JR Z,INT2
06270         RST 8
06280         DEFB 255
06290  CREM   POP BC
06300  INT1   CALL #2530
06310         RET Z
06320         LD HL,(23637)
06330         LD A,192
06340         AND (HL)
06350         RET NZ
06360         XOR A
06370  INT2   CP 1
06380         ADC A,0
06390         LD D,(HL)
06400         INC HL
06410         LD E,(HL)
06420         LD (23621),DE
06430         INC HL
06440         LD E,(HL)
06450         INC HL
06460         LD D,(HL)
06470         EX DE,HL
06480         ADD HL,DE
06490         INC HL
06500  INT4   LD (23637),HL
06510         EX DE,HL
06520         LD (23645),HL
06530         LD D,A
06540         LD E,0
06550         LD (IY+10),255
06560         DEC D
06570         LD (IY+13),D
06580         JP Z,SYN0
06590         INC D
06600         CALL #198B
06610         JR Z,INT6
06620  INT5   RST 8
06630         DEFB 22
06640  INT6   RST 24
06650         CP 13
06660         JR Z,INT1
06670         CP ":
06680         JP Z,SYN0
06690         RST 8
06700         DEFB 11
06710 ;
06720 ;
06730 ; Команда "IF"
06740 ;
06750  CIF    POP BC
06760         CALL #2530
06770         JR Z,CIF0
06780         RST 40
06790         DEFB #02,#38
06800         EX DE,HL
06810         CALL #34E9
06820         JR C,INT1
06830  CIF0   JP SYN1
06840 ;
06850 ;
06860 ; Команда "NEW"
06870 ;
06880  CNEW   LD HL,(23730)
06890         LD (HL),62
06900         DEC HL
06910         LD SP,HL
06920         DEC HL
06930         DEC HL
06940         LD (23613),HL
06950         CALL #0D6B
06960         JP #12A9
06970 ;
06980 ;
06990 ; Таблица классов команд
07000 ;
07010  TNEW   DEFB 0
07020         DEFW CNEW
07030  TREM   DEFB 5
07040         DEFW CREM
07050  TINPUT DEFB 5
07060         DEFW CINPUT
07070  TRUN   DEFB 3
07080         DEFW CRUN
07090  TIF    DEFB 6,203,5
07100         DEFW CIF
07110  TCLS   DEFB 0
07120         DEFW CCLS
07130  TCLEAR DEFB 3
07140         DEFW CCLEAR
07150 ;
07160 ;
07170 ; Конец программы
2
           *   *   *




Другие статьи номера:

Авторская разработка - С.Зонов, А.Ларченко. О контроллере SMUC (HDD и IBM периферия).

Компьютерная новелла - Воины Звезд (по игре Shadowfire).

Новые программы - Обзор Digital Studio v1.12, Digital Studio Compiler v1.01

Новые программы - Обзор Xas редактор-ассемблер 128К (v5.05).

Новые программы - Обзор Музыкального редактора Instrument v3.01

Новые программы - Обзор программ FASTzasm и @-zasm.

Новые программы - Обзор программы No Kempston.

Профессиональный подход - Алгоритмы построения и прохождения Лабиринтов.

Смех без причины... - Материалы из юмористического журнала SpectrofUn.

Советы экспертов - Игра FEUD.

Советы экспертов - Игра Killed Until Dead.

Советы экспертов - Игра War in Middle Earth.

Форум - Конверсия цветной спектрумовской картинки на IBM. Конверсия ч/б картинки с IBM на ZX Spectrum.

Форум - О русификации игровых программ.

Форум - Программа детекта эмулятора.

Форум - Процедура "цветные полосы на бордюре". Снижение шума FDD.

Форум - Процедура перевода числа в десятичный вид. Процедура - сканер пароля.

Форум - Снятие защиты Microprotector'а.

Форум - Эмуляторы, которые мы выбираем: 'UKV Spectrum Debugger', 'Z80TRDOS'.

Читатель-читателю - Драйвер ввода в режимах последовательного и прямого доступа из файлов системы TR-DOS.

Этюды - Графический эффект "плазма 2".

Этюды - Графический эффект "плазма 2".

Этюды - Графический эффект "плазма".

Этюды - Полезные советы. Быстрая переброска экрана.

Этюды - Ремейк процедур 93 года.

Этюды - Эффект "пламя".


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
ВсТупление - На дворе июль - чудный месяц: душно, печет, як в тропиках, короче кайф!
От авторов - о себе.
Застрял ? - Oписание игры "Castle Master 2 (The Crypt)".

В этот день...   15 июня