┌──────────────────────────────┐
│ │
│ ФОРУМ │
│ │
└──────────────────────────────┘
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
* * *