Integer BASIC — это интерпретатор BASIC , написанный Стивом Возняком для компьютеров Apple I и Apple II . Первоначально доступный на кассете для Apple I в 1976 году, а затем включенный в ПЗУ Apple II с момента его выпуска в 1977 году, это была первая версия BASIC, которую использовали многие первые владельцы домашних компьютеров . [2]
Единственным числовым типом данных было целое число; числа с плавающей запятой не поддерживались. Использование целых чисел позволило хранить числа в гораздо более компактном 16-битном формате, который можно было читать и обрабатывать быстрее, чем 32- или 40-битные форматы с плавающей запятой, которые использовались в большинстве BASIC того времени. Это сделало его настолько быстрым, что Билл Гейтс пожаловался, когда он превзошел Microsoft BASIC в тестах. Однако это также ограничивало его применимость в качестве языка общего назначения. [а]
Еще одно отличие от других BASIC того времени состоит в том, что Integer BASIC рассматривал строки как массивы символов, подобно системе в C или Fortran 77 . Доступ к подстрокам осуществлялся с использованием срезов массива , а не строковых функций. Этот стиль был представлен в HP Time-Shared BASIC , а также его можно найти в других современных BASIC, созданных по образцу HP, таких как North Star BASIC и Atari BASIC . Это контрастировало со стилем BASIC, производным от DEC , включая Microsoft BASIC .
Первоначально язык был разработан под названием GAME BASIC и назывался просто Apple BASIC , когда он был представлен на Apple I. Он стал Integer BASIC, когда был портирован на Apple II и поставлялся вместе с Applesoft BASIC , портом Microsoft BASIC , который включена поддержка чисел с плавающей запятой. Начиная с Apple II Plus в 1979 году , Integer BASIC был заменен на Applesoft BASIC .
Когда Стив Возняк учился в старшей школе , учитель электроники организовал для лучших учеников класса работу в местных компаниях по производству электроники. Возняка отправили в Сильванию , где он программировал на FORTRAN на IBM 1130 . [4] В том же году General Electric установила в средней школе терминал, который был подключен к одному из их мейнфреймов, на котором работал сервис BASIC с разделением времени , который они в то время активно продвигали. После трехдневного доступа учеников попросили написать письма о том, почему школа должна получить терминал навсегда, но их усилия в конечном итоге не увенчались успехом. [1]
Несколько лет спустя Возняк работал в Hewlett-Packard (HP), моделируя конструкции микросхем и схему логики калькуляторов. [1] HP добилась значительных успехов на рынке миникомпьютеров , выпустив машины серии HP 2000 , на которых использовалась специальная версия BASIC с разделением времени . Примерно за 100 000 долларов можно было построить достаточно оснащенную машину, которая могла бы поддерживать от 16 до 32 пользователей, работающих с программами BASIC. [5] Хоть это и дорого, но все же это часть стоимости мэйнфреймов [ b] и для активных пользователей меньше, чем услуги разделения времени. [c] HP последовала за этим, выпустив HP 9830 , настольную машину за 10 000 долларов США (что эквивалентно 75 000 долларов США в 2022 году), которая также работала под управлением BASIC, к которому у Возняка был доступ. [9]
Я принюхался и понял, что ключом к тому, чтобы сделать мой компьютер хорошим (популярным), является включение в него языка высокого уровня, и что он должен быть BASIC.
Стив Возняк [1]
В январе 1975 года был анонсирован Altair 8800 , который положил начало революции в области микрокомпьютеров . В марте Возняк посетил первое собрание Домашнего компьютерного клуба и начал разрабатывать дизайн собственного компьютера. Одним из наиболее важных программных продуктов для «Альтаира» и одним из наиболее сильно пиратских был Altair BASIC от недавно созданной компании Microsoft . [10] Возняк пришел к выводу, что его машина должна иметь собственный BASIC, который, как мы надеемся, станет первым процессором MOS Technology 6502 . Поскольку для языка требовалось 4 КБ ОЗУ, он сделал это минимальным объемом памяти для проекта. [1]
Справочными материалами Возняка по BASIC были копия книги «101 компьютерная игра BASIC» и руководство HP по BASIC. [1] Он не знал, что BASIC HP сильно отличался от разновидности BASIC DEC , используемой в 101 Games , которая также была основой Microsoft BASIC для Altair. Основываясь на этих источниках, Возняк начал набрасывать синтаксическую схему языка. Первоначально проект включал поддержку операций с плавающей запятой, но все еще надеясь, что он сможет опубликовать первый BASIC на 6502 и стать «звездой», он решил отказаться от операций с плавающей запятой и написать отдельную систему целочисленных вычислений, чтобы сэкономить несколько недель времени на программирование. [1]
Позже Возняк описал свой язык как «предназначенный в первую очередь для игр и образовательных целей». [11] На протяжении всей разработки он называл его «GAME BASIC», Возняк писал код вручную, переводя инструкции ассемблерного кода в их эквиваленты машинного кода , а затем загружая результат на свой компьютер. [12] Не имея никакой подготовки в написании компьютерного языка, он использовал свой опыт работы с калькулятором HP для реализации стековой машины для интерпретации выражений. После того как основные процедуры были готовы к работе, он начал работать над другими командами одну за другой по модульному принципу. При каждом посещении клуба Homebrew он демонстрировал еще несколько функций, добавленных за последний месяц. [1]
Это был самый приятный день в моей жизни... Я продемонстрировал Breakout [на Homebrew], полностью написанный на BASIC... После разработки аппаратных аркадных игр я понял, что возможность программировать их на BASIC изменит мир.
Стив Возняк [9]
В начале 1976 года в рекламе своего компьютера Apple I компания Apple Inc заявила, что «наша философия состоит в том, чтобы предоставлять программное обеспечение для наших машин бесплатно или по минимальной цене» [13] и «да, ребята, Apple BASIC бесплатен». [14] Это было напечатано вскоре после печально известного Открытого письма Билла Гейтса любителям , в котором говорилось, что люди грабят его, копируя версии Altair BASIC . [15]
Возняк помог Стиву Джобсу , работавшему в Atari , с редизайном Breakout . [16] Позже он решил посмотреть, можно ли написать игру на BASIC. Он добавил команды для чтения манипуляторов и после серии быстрых изменений создал и запустил версию игры. Чтобы улучшить удобство игры, он добавил динамик, который издает щелчки, когда мяч ударяется о предметы. Показывая ее Джобсу, Возняк продемонстрировал, что может быстро менять цвета, используемые в его игре, просто изменив исходный код . Позже Возняк написал, что он доказал, что «программное обеспечение гораздо более гибкое, чем аппаратное обеспечение», и что он и Джобс поняли, что «теперь любой может создавать аркадные игры без необходимости разрабатывать их на аппаратном уровне». [1]
Возняк завершил работу над библиотекой операций с плавающей запятой для 6502 и опубликовал ее в августовском выпуске журнала Dr. Dobb's Journal за 1976 год . [17] Позже эта библиотека стала частью ПЗУ для Apple II . [18] Возняк начал работу по обратному портированию кода с плавающей запятой в Apple BASIC, но отвлекся на задачу разработки контроллера гибких дисков для того, что впоследствии стало Disk II . Майк Марккула сказал, что компания поедет на выставку потребительской электроники в Лас-Вегасе , если дисковая система будет готова вовремя, поэтому Возняк и Рэнди Виггинтон работали над ней без перерыва в течение праздников 1977 года. [19]
Когда Джобс вернулся к теме операций с плавающей запятой в BASIC, он пожаловался, что это занимает слишком много времени. Без ведома Возняка компания уже договорилась с Microsoft о лицензии на получение недавно завершенной версии 6502 кода Альтаира. Изучая код MS, Возняк решил, что было проще добавить поддержку графики в их код, чем добавлять операции с плавающей запятой в свой собственный BASIC, поскольку последний требовал ручного исправления исходного машинного кода, в то время как код MS был написан на ассемблере и его было легче модифицировать. Разработка Apple BASIC закончилась в пользу того, что стало Applesoft BASIC . Позже Возняк заметил: «Мое самое большое разочарование заключалось в ужасных строковых функциях, подобных и, вместо моих собственных». [19] [д]LEFT$(VAR, 5)
MID$(VAR2,5,3)
Когда летом 1977 года вышел Apple II, Integer BASIC поставлялся в ПЗУ, а Applesoft BASIC — на кассете. Ситуация изменилась с появлением Apple II Plus в 1979 году, когда Applesoft была включена в ПЗУ. [20]
Как и большинство реализаций BASIC той эпохи, Integer BASIC выступал как в качестве языкового интерпретатора, так и в качестве среды редактирования строк. Когда BASIC работал, отображалась >
командная строка , в которой пользователь мог вводить инструкции. [21] [e] В отличие от более поздних платформ домашних компьютеров , BASIC не был средой по умолчанию при запуске Apple I, он обычно запускался на мониторе . BASIC запускался нажатием Ctrl+ . [22]BReturn
Операторы, которые были введены с ведущими номерами, вводятся в память программы для «отложенного выполнения» [23] либо как новые строки, либо заменяют любые, которые ранее могли иметь тот же номер. [24] Операторы, которые вводились без номера строки, назывались командами и выполнялись немедленно. [f] Номера строк могут быть от 0 до 32767, [25] [g] и строки могут содержать до 128 символов. [27]
Integer BASIC также включал AUTO
команду для автоматического ввода номеров строк с заданным начальным номером, например AUTO 100
, добавляя 10 к последнему номеру с каждой новой строкой. AUTO 300,5
нумерация начнется со строки 300 пятерками; 300, 305 и т. д. Автоматическую нумерацию отключали вводом MAN
. [28]
Одной из интересных особенностей редактора было то, что часть экрана можно было выделить как «окно», где происходили обновления в реальном времени. Обычно это был весь экран, но его можно было ограничить меньшей областью, занеся POKE
значения в ячейки памяти с 32 по 35. [29] Эту функцию можно было использовать для создания редактируемой текстовой области, пока остальная часть экрана находилась в графическом режиме. . [30]
Как и в большинстве BASIC, программы запускались с помощью этой RUN
команды и, как обычно, могли быть направлены на определенный номер строки, например RUN 300
. [31] Выполнение можно остановить в любой момент с помощью + [32] , а затем возобновить с помощьюtinue, в отличие от более типичного . [33]CtrlCCON
CONT
Для пошагового выполнения TRACE
инструкцию можно использовать в командной строке или поместить в саму программу. Когда он был включен, номера строк распечатывались для каждой строки, которую посетила программа. Эту функцию можно снова отключить с помощью NOTRACE
. [34]
Несколько необычной особенностью была DSP
команда (для «отображения»). При обнаружении в программе с этого момента будут отображаться любые изменения значения переменной. Например, DSP X
будет отображать значение X каждый раз, когда оно изменяется, вместе с номером строки, в которой произошло изменение. [35] Как и в случае с TRACE, DSP отключался с помощью NODSP
. [26]
Там, где Dartmouth BASIC и HP-BASIC ограничивали имена переменных не более чем двумя символами (либо одной буквой, либо буквой, за которой следует одна цифра), и где MS-BASIC допускал букву, за которой следовала необязательная буква или цифра (игнорируя последующие символы), Integer BASIC необычно поддерживал имена переменных любой длины (например, SUM, GAMEPOINTS, PLAYER2). Единственное предостережение заключалось в том, что имена переменных не могли содержать зарезервированные слова; например, THISCOLOR и COLORFUL были недопустимыми именами переменных, поскольку они содержали ключевое слово COLOR
— системную команду. [36] Кроме того, длина строк была ограничена 128 символами, поэтому имена переменных не могли превышать эту длину. [27]
Integer BASIC, как следует из названия, использует целые числа в качестве основы для своего математического пакета. Они хранились внутри как 16-битные числа с прямым порядком байтов (как и 6502). Это позволяло максимальное значение для любого расчета между -32767 и 32767; хотя формат также мог хранить значение -32768, BASIC не мог отображать это число. Расчеты, в результате которых были получены значения, выходящие за пределы этого диапазона, дали >32767 ERR
. [37]
Инфиксные операторы включали +
(сложение), -
(вычитание), *
(умножение), /
(деление), MOD (остаток) и показатель степени с использованием ^
символа. Включены бинарные операторы AND
и OR
. NOT
Двоичные сравнения включали стандартный набор =
, >
, <
, >=
, <=
и <>
вдохновленный HP #
, который был эквивалентен <>. [38]
Разрешались только одномерные массивы, размер которых ограничивался только доступной памятью. [39] Математических функций было мало; поддерживались только ABS
(абсолютное значение), SGN
(знак) и (случайное число). [40] В отличие от версий, производных от MS, где параметр игнорировался и всегда возвращал значение 0..<1, Integer BASIC использовал этот параметр; вернул целое число от 0 до 5. [41]RND
RND
RND(6)
Обработка строк в Integer BASIC была основана на системе HP BASIC. При этом строковые переменные рассматривались как массивы символов, которые необходимо было DIM
редактировать перед использованием. Это похоже на модель на C [42] или Fortran 77 . [43] В этом отличие от MS-подобных BASIC, где строки представляют собой внутренний тип переменной длины. [44] До того, как BASIC, основанный на MS, стал фактическим стандартом, этот стиль не был редкостью; North Star BASIC [45] и Atari BASIC [46] использовали ту же концепцию, как и другие.
Строки в Integer Basic использовали фиксированный объем памяти независимо от количества используемых в них символов, максимум до 255 символов. [47] Это имело то преимущество, что позволяло избежать необходимости в сборке мусора из кучи , которая была заведомо медленной в MS BASIC [h], но означала, что строки короче заявленной длины были потрачены впустую.
Доступ к подстроке обеспечивался посредством синтаксиса среза массива . Например, были напечатаны первые шесть символов , символы от 0 до 5. [49] [49] [i] Конкатенация была обеспечена с использованием той же системы, все символы, начинающиеся с позиции 5, заменялись строкой «ABC». [50] Это контрастирует с обработкой строк в стиле DEC/MS, в которой используются строковые функции, например, для доступа к подстрокам и конкатенации. [51] [й]PRINT A$(0,5)
A$
A$(5)="ABC"
MID$
+
Поскольку многие функции, которые должны были предоставляться строковыми функциями, вместо этого предоставлялись срезами массива, выбор строковых функций был сокращен. LEN
вернул длину строки [47] и ASC
вернул числовой код ASCII для первой буквы строки. [52] Ему не хватало эквивалента, CHR$
который возвращал символ ASCII с заданным числовым кодом. [53]
На момент запуска единственным игровым контроллером для Apple был манипулятор , который имел два контроллера на одном разъеме. Положение контроллера можно прочитать с помощью PDL
функции, передав номер контроллера 0 или 1, например , возвращая значение от 0 до 255. [54] [k]A=PDL(0):PRINT A
Машины Apple не имели специального звукового оборудования, только простой «бипер». Воспроизведение звуков осуществлялось путем PEEK
определения местоположения динамика, нанесенного на карту памяти, -16336. [l] Неоднократный просмотр этого значения приводил к появлению тонов, и в руководстве предлагалось использовать для этого математическое выражение, например . [56]S=PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)
Поддержка графики стала более детальной. Графический режим был включен с помощью GR
оператора и выключен с помощью TEXT
. [57] Рисование было модальным и обычно начиналось с подачи команды на изменение цвета, что достигалось установкой псевдопеременной; COLOR=12
установит цвет рисунка на 12, светло-зеленый. Затем можно было PLOT 10,10
создать одно пятно этого цвета, [58] HLIN 0,39 AT 20
нарисовать горизонтальную линию в строке 20, охватывающую экран, или VLIN 5,15 AT 7
нарисовать более короткую вертикальную линию вниз по столбцу 7. [59] A=SCRN X,Y
вернул цвет экрана в точке X. , Ю. [52] [м]
В Integer BASIC отсутствовали какие-либо пользовательские команды ввода/вывода, а также DATA
оператор и связанный с ним файл READ
. Чтобы вводить данные в программу и из нее, функция ввода/вывода перенаправлялась в выбранный слот карты с помощью PR#x
и IN#x
, которые перенаправляли вывод или ввод (соответственно) в пронумерованный слот. С этого момента данные можно было отправлять на карту с помощью обычных PRINT
команд и считывать с нее с помощью INPUT
. [52]
Целочисленный BASIC включал TAB
функцию, которая располагала курсор в заданном столбце от 0 до 39. Он отличался от версий, встречающихся в большинстве BASIC, тем, что это была команда со следующим номером, а не функция со значением в круглых скобках; TAB 10
в Integer BASIC [60] можно было бы переместить курсор в столбец 10, тогда как в MS это было бы PRINT TAB(10)
. Кроме того, VTAB
команда работала аналогично TAB
, но добавляла вертикальные пробелы вместо горизонтальных. По необъяснимым причинам в этом случае координаты были от 1 до 24, а не от 0 до 23. [61]
Integer BASIC включал POP
команду выхода из циклов. [52] Это привело к удалению самого верхнего элемента из стека FOR. Atari BASIC также поддерживал ту же команду [62] , тогда как North Star BASIC использовала EXIT
. [63]
ПЗУ Integer BASIC также включали монитор машинного кода , «миниассемблер » и дизассемблер для создания и отладки программ на языке ассемблера . Возняк вручную собрал монитор как первую программу для Apple II, а затем использовал его для написания Integer BASIC. [64] [65] [2]
В Apple BASIC были следующие команды: [66]
АВТО значение1 , значение2 CLR [ ОЧИСТИТЬ ] DEL значение1 , значение2 LIST значение1 , значение2 RUN значение1 SCR [ SCRATCH / NEW ] HIMEM = выражение LOMEM = выражение ( LET ) var = выражение INPUT ( подсказка ,) var1 , var2 ... элемент ПЕЧАТИ ( s ) TAB expr FOR var = expr1 TO expr2 STEP expr3 NEXT var IF expr THEN оператор IF expr THEN номер строки GOTO expr GOSUB expr RETURN DIM var1 ( expr1 ), var2 ( expr2 ) ... REM text END POKE expr1 , expr2 CALL expr Функции: ABS (), SGN (), PEEK (), RND (), LEN ()
В Integer BASIC добавлено следующее: [67] [68]
COLOR = expr CON [ ПРОДОЛЖИТЬ ] DSP GR HLIN expr1 , expr2 AT expr3 MAN NEW [ заменяет SCR ] NOTRACE PLOT expr1 , expr2 POP TEXT TRACE VLIN expr1 , expr2 AT expr3 Функция: ASC (), PDL (), SCRN ( X , Y )
Integer BASIC считывает строки, введенные пользователем, из буфера и пропускает их через анализатор, который выводит серию токенов . В рамках этого процесса были обнаружены и перечислены простые синтаксические ошибки . Если синтаксический анализ был успешным, номер строки (если он присутствует) преобразулся из десятичного формата ASCII в 16-битное целое число, а все ключевые слова — в 7-битный целочисленный токен. [64]
Некоторые ключевые слова были представлены несколькими токенами; например, там, где у Microsoft BASIC был один токен для ключевого слова PRINT
, у Integer BASIC было три токена: один, если за ключевым словом не следовали аргументы, один, если за ним следовало арифметическое выражение, и один, если за ним следовал строковый литерал. [69]
Числовые литералы, такие как значение 500, были преобразованы в их 16-битное (двухбайтовое) двоичное представление, в данном случае шестнадцатеричное значение $01F4 . Чтобы указать, что это значение, а не ключевое слово, перед двухбайтовым значением был вставлен один байт между $B0 и $B9 . [n] Строковые литералы, такие как «HELLO WORLD», вместо этого преобразовывались путем установки старшего бита каждого символа, чтобы он сохранялся как $C1 . Имена переменных были преобразованы таким же образом: буквы были преобразованы так, чтобы их старший бит был включен, а любые цифры в имени были представлены соответствующими $B0– $ B9 , чтобы переменная была маркирована как $C1B5 . [64]A
A5
Если строка вводилась без номера строки, код выполнялся непосредственно из буфера. Если у него был номер строки, он копировался из буфера в область хранения программы. [64]
Интерпретатор времени выполнения использовал для выполнения два стека: один для ключевых слов операторов, а другой для оценки параметров. Каждому оператору было присвоено два приоритета: один указывал, где он должен происходить в многоэтапной операции, например, строка математических операций для определения порядка операций , а другой предлагал, когда должна произойти оценка, например, вычисление внутренних значений оператора. формула скобок. При обнаружении переменных их имена анализировались, а затем просматривались в области хранения переменных. Если он не был найден, он добавлялся в конец списка. Адрес хранилища переменной, возможно, недавно созданной, затем помещался в стек вычислений. [64]
Помимо Integer BASIC, ПЗУ Apple содержали собственный язык ассемблера , известный как SWEET16 . SWEET16 основан на байт-кодах , которые выполняются на простой 16-битной виртуальной машине . Эта модель использовалась для того, чтобы к памяти можно было обращаться с помощью косвенных 16-битных указателей и 16-битных математических функций, вычисляемых без необходимости перевода их в базовый 8-битный код 6502 с несколькими инструкциями. Вся виртуальная машина была записана всего в 300 байтах. Код может вызвать SWEET16, выполнив вызов подпрограммы , а затем вернуться к обычному коду 6502 после завершения 16-битных операций. [70]
SWEET16 не использовался в основном коде BASIC, но позже использовался для реализации нескольких утилит. Среди них следует отметить процедуру перенумерации строк, которая была включена в ПЗУ Programmer's Aid #1, добавлена в более поздние модели Apple II и доступна для установки пользователем на более ранних примерах. [71]
Хотя Integer BASIC содержал свои собственные математические процедуры, ПЗУ Apple II также включали полную библиотеку операций с плавающей запятой, расположенную в памяти ПЗУ между $F425-$F4FB
и $F63D-$F65D
. Исходный код был включен в руководство Apple II. Программы BASIC, требующие вычислений с плавающей запятой, могут CALL
использоваться в этих процедурах. [72]
Поскольку Integer BASIC обрабатывал большую часть исходного исходного кода в токены, время выполнения было быстрее, чем в версиях, требующих дополнительного анализа во время выполнения. Для сравнения, Tiny BASIC маркировал только номер строки, [73] тогда как MS BASIC маркировал только ключевые слова. Так, например, в то время как Integer BASIC полностью преобразовывал строку 100 GOTO 200
в токены, которые можно было немедленно прочитать и выполнить, в MS BASIC токенизированы были только номер строки и GOTO, а цифра «200» осталась в исходном формате ASCII и должна была быть повторно анализируется в 16-битное целое число каждый раз, когда встречается строка. [74]
Кроме того, работа исключительно с целочисленной математикой обеспечивает еще один значительный прирост скорости. Это связано как с меньшим 16-битным форматом, требующим меньшего количества обращений к памяти, так и с отсутствием необходимости перемещать десятичное число с плавающей запятой после вычислений. Поскольку многие компьютерные тесты той эпохи были небольшими и часто выполняли простые математические вычисления, не требующие операций с плавающей запятой, Integer BASIC превзошел большинство других BASIC. [о]
В одном из первых известных тестов микрокомпьютеров, тестах Rugg/Feldman , Integer BASIC был более чем в два раза быстрее, чем Applesoft BASIC на той же машине. [76] В Byte Sieve , где математика была менее важна, но доминировали доступ к массиву и производительность циклов, Integer BASIC занимал 166 секунд, а Applesoft — 200. [77] Он не появлялся в Creative Computing Benchmark , который был впервые опубликован в 1983 году. , к этому времени Integer BASIC больше не поставлялся по умолчанию. [78]
Следующая серия тестов, взятая из обеих оригинальных статей Rugg/Feldman, [76] [75], показывает производительность Integer по сравнению с BASIC, производным от MS, на той же платформе.
Вот краткое описание того, что сделал каждый тест:
Ниже представлена версия Breakout, написанная на базе версии Integer BASIC 1977 года для Apple II, которая была указана в руководстве Apple II Mini. [79] В этой версии имеется ряд известных ошибок. [80]
Программа начинается с установки дисплея TEXT
и затем CALL -936
очистки экрана. Строки с 20 по 27 и связанные с ними подпрограммы в строках 100 и 200 представляют собой код выбора цвета, продемонстрированный Возняком для Джобса. В строке 30 устанавливается текстовое окно с помощью POKE 32,20
[p] , а затем используется серия операторов COLOR
и VLIN
для рисования игрового поля и отображения счета в текстовом окне. Весь основной цикл выполняется со строк 40 по 90 с соответствующими подпрограммами. Еще один большой объем кода в конце программы связан с выводом окончательного результата. Другие интересные замечания включают в себя #
(не равные) сравнения в строке 20, создание высокого звука с использованием строки PEEK
s в строке 65 по сравнению с более низким тоном с использованием цикла в строке 70 и сочетание графика и текст на одном дисплее. [д]
5 ТЕКСТ : ВЫЗОВ -936 : VTAB 4 : ВКЛАДКА 10 : ПЕЧАТЬ «*** ИГРА НА ВЫБОР ***» : ПЕЧАТЬ 7 ПЕЧАТЬ «ЦЕЛЬ – УНИЧТОЖИТЬ ВСЕ КИРПИЧИ С 5 ШАРАМИ» : ДЛЯ N = 1 ДО 7000 : СЛЕДУЮЩИЙ N 10 DIM A$ ( 20 ), B$ ( 20 ) : GR : ПЕЧАТЬ : ВВОД « ПРИВЕТ , КАК ВАШЕ ИМЯ?» , A$ : A = 1 : B = 13 : C = 9 : D = 6 : E = 15 : ПЕЧАТЬ «СТАНДАРТНЫЕ ЦВЕТА» ; А$ ; 20 INPUT "?" , B$ : IF B$ # "N" AND B$ # "NO" THEN 30 : FOR I = от 0 до 39 : COLOR = I / 2 *( I < 32 ) : VLIN 0 , 39 AT I 25 NEXT I : POKE 34 , 20 : ПЕЧАТЬ : ПЕЧАТЬ : ПЕЧАТЬ : ДЛЯ I = 0 ДО 15 : VTAB 21 + I MOD 2 : TAB I + I +1 : ПЕЧАТЬ I ; : СЛЕДУЮЩИЙ I : POKE 34 , 22 : VTAB 24 : ПЕЧАТЬ : ПЕЧАТЬ "ФОН" ; 27 GOSUB 100 : A = E : ПЕЧАТЬ «ЧЕТНЫЙ КИРПИЧ» ; : GOSUB 100 : B = E : ПЕЧАТЬ «НЕЧЕТНЫЙ КИРПИЧ» ; : GOSUB 100 : C = E : ПЕЧАТЬ «ВЕСЛО» ; : GOSUB 100 : D = E : ПЕЧАТЬ «ШАР» ; : GOSUB 100 30 POKE34 , 20 : ЦВЕТ = A : FOR I = от 0 до 39 : VLIN0 , 39 ATI : NEXT I : FOR I = от 20 до 34 ШАГ 2 : TAB I +1 : ПЕЧАТЬ I / 2-9 ; : COLOR = B : VLIN 0 , 39 AT I : COLOR = C : FOR J = I MOD 4 ДО 39 ШАГ 4 35 VLIN J , J +1 AT I : NEXT J , I : TAB 5 : ПЕЧАТЬ «SCORE = 0» : ПЕЧАТЬ : ПЕЧАТЬ : POKE 34 , 21 : S = 0 : P = S : L = S : X = 19 : Y = 19 : X = 19 40 ЦВЕТ = A : УЧАСТОК X , Y / 3 : X = 19 : Y = RND ( 120 ) : V = -1 : W = RND ( 5 ) -2 : L = L +1 : ЕСЛИ L > 5 , ТО 140 : TAB 6 : ПЕЧАТЬ «ШАР №» ; Л : ПЕЧАТЬ : FOR I = 1 TO 100 : GOSUB 200 : NEXT I : M = 1 : N = 0 50 J = Y + W : IF J >= 0 AND J < 120 THEN 60 : W =- W : J = Y : FOR I = 1 ДО 6 : K = PEEK ( -16336 ) : NEXT I 55 IF PEEK ( -16287 )> 127 THEN SW = 1 - SW 60 I = X + V : IF I < 0 THEN 400 : GOSUB 200 : ЦВЕТ = A : K = J / 3 : ЕСЛИ I > 39 ТО 70 : ЕСЛИ SCRN ( I , K ) = A ТО 90 : ЕСЛИ I ТО 120 : N = N +1 : V =( N > 9 ) +1 : W =( K - P )* 2-5 : M = 1 65 Z = ПЭЭК ( -16336 )- ПЭЭК ( -16336 )- ПЭЭК ( -16336 )- ПЭЭК ( -16336 )- ПЭЭК ( -16336 ) - ПЭЭК ( - 16336 )- PEEK ( -16336 ) : ПЕРЕЙДИТЕ К 90 70 ДЛЯ I = 1 ДО 6 : M = PEEK ( -16336 ) : СЛЕДУЮЩИЙ I : I = X : M = 0 80 V =- V 90 УЧАСТОК X , Y / 3 : ЦВЕТ = E : УЧАСТОК I , K : X = I : Y = J : ПЕРЕЙДИТЕ К 50 99 ПЕЧАТЬ "НЕВЕРНО. REENTER" ; 100 ВХОД «ЦВЕТ (0 ДО 15)» , E : ЕСЛИ E < 0 ИЛИ E > 15 THEN 99 : ВОЗВРАТ 120 IF M THEN V = ABS ( V ) : VLIN K / 2 * 2 , K / 2 * 2+1 AT I : S = S + I / 2-9 : VTAB 21 : TAB 13 : ПЕЧАТЬ S 123 Q = PEEK ( -16336 )- PEEK ( -16336 ) - PEEK ( -16336 )- PEEK ( -16336 )- PEEK ( -16336 )- PEEK ( -16336 )- PEEK ( -16336 ) - PEEK ( -16336 ) - PEEK ( -16336 )- PEEK ( -16336 ) 124 ЕСЛИ S < 720 , ТО 80 130 ПЕЧАТЬ «ПОЗДРАВЛЯЕМ , ВЫ ВЫИГРАЛИ» . : ПЕРЕЙДИТЕ К 150 140 НАПЕЧАТАЙТЕ «ВАШ СЧЕТ» ; С ; " ЯВЛЯЕТСЯ " ; : ПЕРЕХОД 141 + S / 100 141 НАПЕЧАТАЙТЕ «УЖАСНО!» : ПЕРЕХОД 150 142 НАПЕЧАТАЙТЕ «ПАРШИВЫЙ». : ПЕРЕХОД К 150 143 НАПЕЧАТАЙТЕ «БЕДНЫЕ». : ПЕРЕХОД 150 144 НАПЕЧАТАЙТЕ «ЯРМАРКА». : ПЕРЕХОД 150 145 НАПЕЧАТАЙТЕ «ХОРОШО». : ПЕРЕХОД 150 146 НАПЕЧАТАЙТЕ «ОЧЕНЬ ХОРОШО». : ПЕРЕХОД 150 147 НАПЕЧАТАЙТЕ «ОТЛИЧНО». : ПЕРЕЙДИТЕ К 150 148 НАПЕЧАТАЙТЕ «ПРАКТИЧЕСКИ ИДЕАЛЬНО». 150 ПЕЧАТАТЬ «ТО ЖЕ ЦВЕТА» ; : GOTO 20 200 IF SW THEN 220 : Q =( PDL ( 0 ) -5 )/ 6 : IF Q < 0 THEN Q = 0 205 IF Q >= 34 THEN Q = 34 : COLOR = D : VLIN Q , Q + 5 AT 0 : COLOR = A : IF P > Q THEN 210 : IF Q THEN VLIN 0 , Q -1 AT 0 : P = Q : RETURN 210 IF P = Q THEN RETURN : IF Q # 34 THEN VLIN Q +6 , 39 AT 0 : P = Q : RETURN 220 Q =( Y -5 )/ 3 + RND ( 3 )* SGN ( W )*( X < 10 AND V < 0 ) : IF Q < 0 THEN Q = 0 : ПЕРЕЙТИ 205 400 ДЛЯ I = 1 ДО 80 : Q = PEEK ( -16336 ) : СЛЕДУЮЩИЙ I : ПЕРЕЙТИ К 40
]
.CONVERT
команду для преобразования строки в массив значений ASCII, которыми пользователь затем манипулировал и преобразовывал обратно в строковый формат с помощью секунды CONVERT
.A=SCRN(X,Y)
.