Бейсик
(#4)
(C) Дм. Рудовский
________________________________
Basic, как и все языки высо-
кого уровня имеет несколько не-
достатков. И самый главный из
них - медлительность.
Вот самый простой пример. На-
берите программу:
10 FOR I=0 TO 65535
20 NEXT I
30 CLEAR 29999
40 PRINT "STOP TIME"
50 FOR K=30000 TO 30009
60 READ B: POKE K,B
70 NEXT K
80 STOP
100 RANDOMIZE USR 30000
110 GO TO 30
120 DATA 1,255,255,11,120,177
130 DATA 194,51,117,201
Запустите ее командой RUN,
засекая время до появления над-
писи STOP TIME. Теперь запустите
программу вторично, но на этот
раз командой RUN 100, проведя
аналогичные операции.
Теперь сравните. Как правило,
первый результат раз в сто боль-
ше второго. Для тех, кто не по-
нял, объясняю: первый запуск -
Basic-интерпретатор "прокрутил"
пустой цикл 65536 раз, во второй
раз то же самое было сделано из
машинных кодов.
Итак, Вы убедились, что Basic
слишком медлителен. Что же де-
лать, если Ваши познания в ас-
семблере не позволяют Вам соз-
дать в нем какой-нибудь шедевр?
Ответ прост: надо совместить
возможности Basic со скоростью
ассемблера.
Вспомнив прошлую статью, Вы
восклицаете "Эврика!" и бросае-
тесь искать компилятор, но проч-
тя его описание, приходите к вы-
воду - "Для калькулятора может
быть подойдет".
Но все-таки не торопитесь чи-
тать раздел по ассемблеру, а до-
читайте до конца эту статью, так
как речь в ней пойдет именно об
описанной выше проблеме.
Функция USR число возвращает
содержимое регистровой пары BC,
оставшееся там после выполнения
подпрограммы в машинных кодах,
расположенной по адресу, указан-
ному как параметр функции.
Возникает вопрос - неужели
элементарные процедуры, вроде
скроллинга, придется писать са-
мому?
Конечно, нет смысла изобре-
тать велосипед, - элементарные
программы уже придуманы, написа-
ны и собраны в библиотеки под
названиями:
SUPERCODE и NEWSUPERCODE.
Все, что Вам нужно, так это
найти нужную Вам процедуру, за-
писать ее на диск и вставить в
свою программу. О том, как вы-
полнить эти три пункта и пойдет
речь в дальнейшем.
Описывать подпрограммы в этих
пакетах я буду по порядку их но-
меров в Supercode 3.5, давая в
скобках номер соответствующей
процедуры в Newsupercode. Но пе-
ред этим я должен несколько слов
сказать о системе управления
этими пакетами.
Supercode 3.5:
Сей пакет состоит из двух
частей (подпрограммы 1-74, 75-
150). После загрузки и вводного
слова на польском Вы попадаете в
меню. Дам расшифровку пунктов,
кои выбираются нажатием первой
буквы команды. С самого начала
Вас подстерегает странная строч-
ка внизу экрана:
DEMO/PRNTR/QUIT/ANY OTHER KEY
где DEMO - демонстрация возмож-
ностей программы в целом,
PRNTR - распечатка на принтере,
QUIT - выход в Basic,
ANY OTHER KEY - продолжить.
Продолжив, мы попадаем в
главное меню:
NUMBER - описание процедуры с
номером, который Вас попросят
ввести.
DEMO - см. выше.
PRNTR - см. выше.
LOCATE - объяснения, как ис-
пользовать процедуры по адресам,
отличным от тех, которые даны в
Supercode.
INDEX - на страницу назад.
JUMP PAGE# - Переход на страни-
цу n(1-4).
CONTINUE - переход на следующую
страницу.
SAVE - запись нужной Вам под-
программы на диск.
QUIT - см. выше.
Нажав "N" и набрав нужный Вам
номер подпрограммы, Вы увидите
ее описание и очередное меню:
EXAMPLE/PRNTR/QUIT/ANY OTHER KEY
Из всех пунктов новый только
один - EXAMPLE. Для слабо знако-
мых с английским объясняю -
EXAMPLE - пример,
это означает, что выбирая этот
пункт Вы увидите пример работы
этой подпрограммы.
Пакет Newsupercode отличается
от Supercode только меньшим ко-
личеством подпрограмм и лучшим
интерфейсом. Здесь выбор осущес-
твляется лишь курсорными клави-
шами и "ENTER". Выбираешь нужную
процедуру, наводишь на нее кур-
сор и нажимаешь "ENTER".
Теперь перейдем непосред-
ственно к самим подпрограммам. Я
приведу пример работы с ними.
Итак, Вы хотите чтобы в слу-
чае ошибки программа не вывали-
валась в Basic с никому не нуж-
ной надписью, а переходила на
строку Вашей программы, где Вы
ее проанализируете.
Посмотрим, что нам для этого
нужно:
1. Подпрограмма перехвата ошиб-
ки.
2. Подпрограмма подачи звуково-
го сигнала.
Теперь загружаем Supercode и
ищем подпрограмму с номером 65.
После ее запуска при любом пре-
рывании программы (даже О.К.)
управление будет передаваться на
определенную строку Basic прог-
раммы, адрес которой будет задан
нами в ячейках памяти 60878/79.
С помощью опции SAVE записываем
эту процедуру на диск. Если у
Вас кассетный вариант,то запиши-
те на бумаге адрес и длину этой
подпрограммы и, нажав QUIT, вый-
дите в Basic. Запишите ее обыч-
ным способом, а затем вернитесь
в пакет командой GO TO 0 и пов-
торите все вышеприведенные мани-
пуляции с процедурой номер 42.
Теперь, выйдя в Basic, набе-
рите нижеприведенную программу:
10 CLEAR 60825
20 RANDOMIZE USR 15619: REM :
LOAD "65" CODE
30 RANDOMIZE USR 15619: REM :
LOAD "42" CODE
40 POKE 63951,20
50 RANDOMIZE USR 60826
60 INPUT "INPUT N(1-5):";N
70 RESTORE: LET SUM=0
80 FOR I=1 TO N
90 READ A
100 LET SUM=SUM+A
110 NEXT I
" 120 PRINT "SUMMA ";N;"NUMBER
=";SUM
130 GO TO 60
9495 LET A=USR 63950
9500 LET A=PEEK 23681
9510 IF A=CODE "E" THEN GO TO
9700
9520 PRINT "ERROR, CODE ";A
9530 GO TO 60
9700 PRINT "READ TEXT, PIG!"
9710 PRINT "EXIT?"
9720 LET K$=INKEY$: IF K$=""
THEN GO TO 9720
9730 IF K$="D" THEN LET A=USR 0
9740 IF K$="N" THEN GO TO 60
9750 GO TO 9720
Некоторые пояснения. В строке
40 устанавливается длительность
звукового сигнала, в строке 50
активизируется подпрограмма пе-
рехвата ошибки, в строке 9495,
куда происходит переход после
ошибки, выдается звуковой сиг-
нал.
Если Вас не устраивает такой
метод,то ждите следующей статьи,
где будет объяснено, что делать,
когда возможности стандартного
Basica Вас не удовлетворяют.