Integer BASIC — интерпретатор BASIC, написанный Стивом Возняком для компьютеров Apple I и Apple II . Первоначально доступный на кассете для Apple I в 1976 году, затем включенный в ПЗУ Apple II с момента его выпуска в 1977 году, он был первой версией BASIC, используемой многими ранними владельцами домашних компьютеров . [2]
Единственным числовым типом данных было целое число; числа с плавающей точкой не поддерживались. Использование целых чисел позволяло хранить числа в компактном 16-битном формате, который мог быстрее считываться и обрабатываться, чем 32- или 40-битные форматы с плавающей точкой, которые можно было найти в большинстве BASIC той эпохи. Это делало его настолько быстрым, что Билл Гейтс жаловался, когда он превзошел Microsoft BASIC в тестах. Однако это также ограничило его применимость в качестве языка общего назначения. [a]
Другое отличие от других 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 , который включал поддержку плавающей точки. Integer BASIC был постепенно заменен Applesoft BASIC, начиная с Apple II Plus в 1979 году.
Когда Стив Возняк был старшеклассником , его учитель электроники организовал для лучших учеников класса стажировку в местных электронных компаниях. Возняк был отправлен в Сильванию , где он программировал на 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 долларов США (что эквивалентно 78 000 долларов США в 2023 году), которая также работала на BASIC, к которому Возняк имел доступ. [9]
Я принюхался и понял, что ключ к тому, чтобы сделать мой компьютер хорошим (популярным), — включить в него язык высокого уровня, и это должен быть BASIC.
Стив Возняк [1]
В январе 1975 года был анонсирован Altair 8800 , который положил начало революции микрокомпьютеров . В марте Возняк посетил первое заседание Homebrew Computer Club и начал разрабатывать дизайн своего собственного компьютера. Одним из важнейших компонентов программного обеспечения для Altair и одним из наиболее пиратских был Altair BASIC от недавно созданной Microsoft . [10] Возняк пришел к выводу, что его машина должна иметь собственный BASIC, который, как он надеялся, станет первым для процессора MOS Technology 6502. Поскольку языку требовалось 4 КБ ОЗУ, он сделал это минимальным объемом памяти для проекта. [1]
Источниками BASIC для Возняка были копия 101 BASIC Computer Games и руководство HP BASIC. [1] Он не знал, что BASIC от HP сильно отличался от разновидности DEC BASIC , используемой в 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 о лицензии на получение их недавно завершенной версии кода Altair для 6502. Изучив код MS, Возняк решил, что проще добавить графическую поддержку в их код, чем добавлять плавающую точку в свой собственный BASIC, поскольку последний требовал ручной правки исходного машинного кода, в то время как код MS был написан на ассемблере и его было легче модифицировать. Разработка BASIC от Apple закончилась в пользу того, что стало Applesoft BASIC . Позже Возняк заметил: «Моим самым большим разочарованием было использование ужасных строковых функций вроде и вместо моих собственных». [19] [d]LEFT$(VAR, 5)
MID$(VAR2,5,3)
Когда Apple II был выпущен летом 1977 года, Integer BASIC поставлялся в ПЗУ, в то время как Applesoft BASIC поставлялся на кассете. Это изменилось с выпуском Apple II Plus в 1979 году, когда Applesoft был помещен в ПЗУ. [20]
Как и большинство реализаций BASIC той эпохи, Integer BASIC выступал как интерпретатор языка, так и среда редактирования строк. Когда BASIC был запущен, отображалась >
командная строка , где пользователь мог вводить операторы. [21] [e] В отличие от более поздних платформ домашних компьютеров , BASIC не был средой по умолчанию при запуске Apple II, он обычно запускался в мониторе . 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
команда (для "display"). При ее появлении в программе с этого момента любые изменения значения переменной будут отображаться. Например, 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-битное число, little-endian (как и 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] До того, как MS-производные BASIC стали фактическим стандартом, этот стиль не был редкостью; 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] [j]PRINT A$(0,5)
A$
A$(5)="ABC"
MID$
+
Поскольку многие из функций, которые могли бы быть предоставлены строковыми функциями, были предоставлены срезом массива, выбор строковых функций был сокращен. LEN
возвращала длину строки [47] и ASC
возвращала числовой код ASCII для первой буквы в строке. [52] У нее отсутствовал эквивалент , который CHR$
возвращал бы символ ASCII с заданным числовым кодом. [53]
На момент запуска единственным игровым контроллером для Apple был контроллер paddle , который имел два контроллера на одном разъеме. Положение контроллера можно было прочитать с помощью PDL
функции, передав номер контроллера, 0 или 1, как , возвращая значение от 0 до 255. [54] [k]A=PDL(0):PRINT A
Машины Apple не включали в себя специальное звуковое оборудование, только простой «бипер». Воспроизведение звуков достигалось путем PEEK
ing расположения динамика, отображенного в памяти, -16336. [l] Многократное PEEK-подглядывание этого значения приводило к тонам, и руководство предлагало использовать математическое выражение для этого, например . [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,Y. [52] [м]
Integer BASIC не имел никаких пользовательских команд ввода/вывода, а также не имел DATA
оператора и связанного с ним READ
. Для ввода данных в программу и из нее функциональность ввода/вывода перенаправлялась на выбранный слот карты с помощью PR#x
и IN#x
, который перенаправлял вывод или ввод (соответственно) на пронумерованный слот. С этого момента данные можно было отправлять на карту с помощью обычных PRINT
команд и считывать с нее с помощью INPUT
. [52]
Integer BASIC включал TAB
функцию, которая устанавливала курсор на заданный столбец от 0 до 39. Она отличалась от версий, найденных в большинстве BASIC, тем, что это была команда с последующим номером, в отличие от функции со значением в скобках; можно было переместить курсор в столбец 10, используя TAB 10
в Integer BASIC [60], тогда как в 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 ROM также включали монитор машинного кода , «мини- ассемблер » и дизассемблер для создания и отладки программ на языке ассемблера . Возняк вручную собрал монитор как первую программу для Apple II, затем использовал его для написания Integer BASIC. [64] [65] [2]
Apple BASIC имел следующие команды: [66]
AUTO val1 , val2 CLR [ CLEAR ] DEL val1 , val2 LIST val1 , val2 RUN val1 SCR [ SCRATCH / NEW ] HIMEM = expr LOMEM = expr ( LET ) var = expr INPUT ( prompt ,) var1 , var2 ... PRINT элемент ( ы ) 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 текст END POKE expr1 , expr2 CALL expr Функции: ABS (), SGN (), PEEK (), RND (), LEN ()
Integer BASIC добавил следующее: [67] [68]
COLOR = expr CON [ CONTINUE ] 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 hexadecimal . Чтобы указать, что это значение, а не ключевое слово, один байт между $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 ROM, добавлена в более поздние модели 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. [o]
В одном из самых ранних известных тестов микрокомпьютеров, тестах Рагга/Фелдмана , Integer BASIC был более чем в два раза быстрее Applesoft BASIC на той же машине. [76] В Byte Sieve , где математика была менее важна, но доминировали доступ к массивам и производительность циклов, Integer BASIC потребовалось 166 секунд, в то время как Applesoft потребовалось 200. [77] Он не появился в Creative Computing Benchmark , который был впервые опубликован в 1983 году, к тому времени Integer BASIC уже не поставлялся по умолчанию. [78]
Следующая серия тестов, взятая из обеих оригинальных статей Рагга/Фельдмана [76] [75], демонстрирует производительность Integer по сравнению с производным от MS BASIC на той же платформе.
Вот краткое изложение результатов каждого теста:
Ниже приведена версия 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 и смешивание графики и текста на одном дисплее. [q]
5 ТЕКСТ : ВЫЗОВ -936 : VTAB 4 : TAB 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 : ПЕЧАТЬ "СТАНДАРТНЫЕ ЦВЕТА" ; A$ ; 20 ВВОД "? " , B$ : ЕСЛИ B$ # "N" И B$ # "НЕТ" ТО 30 : ДЛЯ I = 0 ДО 39 : ЦВЕТ = I / 2 *( I < 32 ) : VLIN 0 , 39 AT I 25 ДАЛЕЕ 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 : ПЕЧАТЬ "PADDLE" ; : GOSUB 100 : D = E : ПЕЧАТЬ "BALL" ; : GOSUB 100 30 POKE34 , 20 : ЦВЕТ = A : ДЛЯ I = 0 ДО 39 : VLIN0 , 39 ATI : СЛЕДУЮЩИЙ I : ДЛЯ I = 20 ДО 34 ШАГ 2 : TAB I +1 : ПЕЧАТЬ I / 2-9 ; : ЦВЕТ = B : VLIN 0 , 39 AT I : ЦВЕТ = C : ДЛЯ J = I MOD 4 ДО 39 ШАГ 4 35 VLIN J , J +1 AT I : СЛЕДУЮЩИЙ 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 : ПЕЧАТЬ "ШАР #" ; L : PRINT : 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 TO 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 : COLOR = A : K = J / 3 : IF I > 39 THEN 70 : IF SCRN ( I , K )= A THEN 90 : IF I THEN 120 : N = N +1 : V =( N > 9 ) +1 : W = ( K - P )* 2-5 : M = 1 65 Z = PEEK ( -16336 ) - PEEK ( -16336 ) - PEEK ( -16336 ) - PEEK ( -16336 ) - PEEK ( -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 ПЕЧАТЬ "НЕВЕРНО. ВВЕСТИ ПОВТОРНО" ; 100 ВВОД "ЦВЕТ (0 ДО 15)" , E : ЕСЛИ E < 0 ИЛИ E > 15 ТО 99 : ВОЗВРАТ 120 ЕСЛИ M ТО 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 ) - ПОДСМОТРЕТЬ ( -16336 ) 124 ЕСЛИ S < 720 ТО 80 130 НАПЕЧАТАТЬ "ПОЗДРАВЛЯЕМ, ВЫ ПОБЕДИЛИ." : ПЕРЕЙТИ К 150 140 НАПЕЧАТАТЬ "ВАШ СЧЕТ " ; S ; " РАВЕН " ; : ПЕРЕЙТИ К 141 + S / 100 141 НАПЕЧАТАТЬ "УЖАСНО!" : ПЕРЕЙТИ К 150 142 НАПЕЧАТАТЬ "ПЛОХО." : ПЕРЕЙТИ К 150 143 НАПЕЧАТАТЬ "ПЛОХО." : ПЕРЕЙТИ К 150 144 ПЕЧАТЬ "УДОВЛЕТВОРИТЕЛЬНО". : ПЕРЕЙТИ К 150 145 ПЕЧАТЬ "ХОРОШО". : ПЕРЕЙТИ К 150 146 ПЕЧАТЬ "ОЧЕНЬ ХОРОШО". : ПЕРЕЙТИ К 150 147 ПЕЧАТЬ "ПРЕВОСХОДНО". : ПЕРЕЙТИ К 150 148 ПЕЧАТЬ " ПОЧТИ ИДЕАЛЬНО " . 150 ПЕЧАТЬ " ОДНИ И ТАКИЕ ЖЕ ЦВЕТА" ; : ПЕРЕЙТИ К 20 200 ЕСЛИ SW ТО 220 : Q =( PDL ( 0 ) -5 )/ 6 : ЕСЛИ Q < 0 ТО Q = 0 205 ЕСЛИ Q >= 34 ТО Q = 34 : ЦВЕТ = D : VLIN Q , Q +5 В 0 : ЦВЕТ = A : ЕСЛИ P > Q ТО 210 : ЕСЛИ Q ТО VLIN 0 , Q -1 В 0 : P = Q : ВОЗВРАТ 210 ЕСЛИ P = Q ТО ВОЗВРАТ : ЕСЛИ Q # 34 ТО VLIN Q +6 , 39 В 0 : P = Q : ВОЗВРАТ 220 Q =( Y -5 )/ 3 + RND ( 3 )* SGN ( W )*( X < 10 И V < 0 ) : ЕСЛИ Q < 0 ТОГДА Q = 0 : ПЕРЕЙТИ К 205 400 ДЛЯ I = 1 ДО 80 : Q = PEEK ( -16336 ) : ДАЛЕЕ I : ПЕРЕЙТИ К 40
]
подсказку.CONVERT
команду для преобразования строки в массив значений ASCII, которые затем обрабатывал пользователь и преобразовывал обратно в строковый формат с помощью второй команды CONVERT
.A=SCRN(X,Y)
.