ZX Review
#11-12
26 ноября 1997 |
|
Форум - О русификации игровых программ.
┌──────────────────────────────┐ │ │ │ ФОРУМ │ │ │ └──────────────────────────────┘ 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 * * *
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября