              TBC (TOKIWA BASIC Компилятор)
              Руководство пользователя

                Введение

  Компилятор TBC представляет собой подмножество языка BASIC (Beginner's
All-purpose Symbolic Instruction Code). Кроме традиционных операторов
BASIC'а, в TBC есть различие между целочисленными и реальными операциями,
поддерживается возможность вызова подпрограмм и функциональных операторов с
аргументами, а также программирование без номеров строк.

  Вместо обычной одинарной точности числового значения, в TBC используются
числовые значения с плавающей запятой 9.5-кратной точности, составляющие пять
байтов памяти. Реализована быстрая прямая компиляция программ в рабочий
объектный код.

  TBC - свободно распространяемое программное обеспечение. От коммерческого
пакета TKW-86BC отличается тем, что из TBC удалены некоторые функции,
возможность компоновки объектных файлов, и т.д.. Однако возможностей TBC
достаточно для начального изучения компьютера и самого компилятора.


                Содержание

            Часть 1.  Основа

1-1   Программирование и компилирование под TBC
1-2   Создание программ


            Часть 2.  Операторы

2-1   Формат программы
2-1-1   Формат строки
2-1-2   Типы данных
2-1-3   Переменные
2-1-4   Арифметические выражения
2-1-5   Строчные выражения
2-1-6   Операторы присвоения

2-2   Операторы описаний и синтаксис
2-2-1   Описания переменных
2-2-2   Определение целочисленных констант
2-2-3   Описание массивов
2-2-4   Оператор  DEFINT
2-2-5   Оператор  BREAK
2-2-6   Оператор  CONTINUE
2-2-7   Оператор  STOP
2-2-8   Оператор  END
2-2-9   Оператор  REM
2-2-10  Оператор  KILL
2-2-11  Оператор  MERGE

2-3   Операторы управления
2-3-1   Оператор  FOR --- NEXT
2-3-2   Оператор  WHILE --- WEND
2-3-3   Оператор  REPEAT --- UNTIL
2-3-4   Оператор  IF --- THEN --- ELSE
2-3-5   Оператор  SWITCH --- CASE
            Операторы BREAK, DEFAULT, SWEND
2-3-6   Оператор  GOTO
2-3-7   Оператор  GOSUB
2-3-8   Оператор  RETURN
2-3-9   Оператор  ON --- GOTO
2-3-10  Оператор  ON --- GOSUB
2-3-11  Оператор  ON ERROR GOTO (GOSUB)
2-3-12  Оператор  ON EOF GOTO (GOSUB)
2-3-13  Оператор  ON KEY GOTO (GOSUB)
2-3-14  Оператор  CALL
2-3-15  Оператор  USER

2-4   Ввод
2-4-1   Оператор  INPUT
2-4-2   Оператор  LINE INPUT
2-4-3   Оператор  READ
2-4-4   Оператор  LINE READ
2-4-5   Оператор  READ#

2-5   Вывод
2-5-1   Оператор  PRINT
2-5-2   Оператор  WIDTH
2-5-3   Функция   TAB( )
2-5-4   Оператор  WRITE#

2-6   Доступ к файлам
2-6-1   Оператор  OPEN
2-6-2   Оператор  OPEN#
2-6-3   Операторы OPEN#2 --- OPEN#4
2-6-4   Операторы CLOSE, CLOSE#2 --- CLOSE#4

2-7   Оператор    SUBROUTINE
2-8   Оператор    FUNCTION

2-9   Другие операторы
2-9-1   Оператор SWAP
2-9-2   Оператор WAIT
2-9-3   Оператор OUT
2-9-4   Оператор DOUT
2-9-5   Оператор POKE
2-9-6   Оператор RANDOMIZE
2-9-7   Оператор DPOKE
2-9-8   Оператор VALUE
2-9-9   Встроенный ассемблер
2-9-10  Консольные команды

2-10  Встроенные Функции
2-10-1  Функции Целочисленного Типа
                IABS(), IVAL(), INP(), DINP(), PEEK(),DPEEK()
                POS(), LOC(), CINT(), ASC(), INSTR(), LEN()
                FRE(), USR(), CALL_name()
2-10-2  Функции Реального Типа
                ABS(), SGN(), RND(), INT(), FIX(), SQR(), SIN()
                COS(), TAN(), ASN(), ACS(), ATN(), EXP(), LOG()
                LGT(), HSN(), HCS(), HTN(), FN_name(), FLOAT()
                VAL(), PI, EE
2-10-3  Функции Строкового Типа
                CHR$(), RIGHT$(), MID$(), LEFT$(), STR$(), INKEY$


            Часть 3.  Особенности программрования

3-1   Опции компилирования
3-2   Режим трассировки
3-3   Ссылки на номера строк
3-4   Обработка оператором VALUE
3-5   Пример трансляции программы
3-6   Применение оператора PRINT
3-7   Запуск программ-примеров
3-8   Сообщения об ошибках при компиляции
3-9   Сообщения об ошибках при выполнении программ (--- error)
3-10  Резюме



            Часть 1.  Основы

  Этот компилятор базируется на стандартном BASIC'е. Поэтому введение в
программирование на TBC будет основываться на практических примерах.

1-1  Программирование и компиляция в TBC

  Компиляция и запуск программы. Перед этим Вы можете проверить содержание
программы введя в командной строке команду type и имя файла (TEST.BAS).

    C:\BAS>type test.bas<cr>

Где, "C:\BAS >" - подсказка МС-ДОС, а "<cr>" означает нажать клавишу ENTER.
Содержание файла должно выглядеть примерно так:

    *** Sample Program ***

    For N=0 To 10
      Print N;
    Next N
    End


Затем можно скомпилировать файл (TEST.BAS).

    C:\BAS>tbc test<cr>

После выполненных действий на экране дисплея компилятор выведет следующие
заставку и сообщения.

    TOKIWA 8086 BASIC Compiler Ver. 5.55 ***Sample***
    Copyright (C) 1985-2000 by Genji OKADA

    Complete & Saved

Если при компиляции программы все завершилось удачно, в каталоге должен
появиться вновь созданный файл (TEST.EXE). Проверить наличие файла можно с
помощью команды MsDOS - DIR.

Для проверки запустите программу просто введя название программы (TEST.EXE).

    C:\BAS>test<cr>

Результат работы программы будет выведен на экран дисплея:

    0  1  2  3  4  5  6  7  8  9  10

  Другие программные примеры, Вы сможете компилировать подобным образом.
Далее в описании будут приведены более сложные примеры.


1-2  Создание программ

  Для создания программ необходим текстовый редактор, как, например "TED".
Для начала создания исходного текста программы введите команду:

    C:\BAS>ted test1.bas<cr>

После этого уже в редакторе введите следующий текст:

    Print "Привет, Мир!"
    End


  Закончив ввод текста программы, сохраните ее на диск. После сохранения Вы
можете скомпилировать программу, как это было показано выше.

    C:\BAS>tbc test1<cr>

  Если вы получили предупреждение или сообщение об ошибках, типа "Syntax
error", вы должны проверить исходный текст программы на наличие ошибок.
Убедившись, что вы ввели программу корректно, скомпилируйте снова, пока Вы не
получите сообщение "Complete & Saved".

  После успешной компиляции, запустите Вашу программу.

    C:\BAS>test1<cr>

  Результат смотрите на экране дисплея:

    Привет, Мир!

  Эта программа - аналог традиционной программы из книги о языке C, авторов
Kernighan и Ritchie. Сравните размеры исходного и исполняемого файла, и т.д..

  Другой пример программы:

    Input x
    Print "Квадрат="; X * X, "Корень квадратный ="; Sqr(X)
    End

  После редактирования и компиляции запустите программу. В ответ на запрос
"?" введите желаемое число. В результате на экране Вы получите квадрат и
квадратный корень числа, которое вы ввели.

  Вы можете удивиться, узнав, что номера строк необязательны как это принято
в исходных программах написанных в традиционном БЕЙСИКЕ. TBC не требует
нумерации строк, но может использовать номера строк как метки ссылок. Тем не
менее, также позволяется нумерация каждой строки.


            Часть 2.  Операторы

2-1  Формат программы

2-1-1  Формат строки

(1) BASIC - строка

  Каждая строка исходной программы должна завершаться кодами возврата
каретки - (0DH) и перевода строки - (0AH). Длина строки должна быть не более
255-ти символов.

(2) Коды символов

  При компиляции коды ASCII воспринимаются без различия между верхним и
нижним регистрами, то есть преобразовывается в верхний регистр за исключением
символов строки, окруженных одиночными или двойными кавычками.

(3) Нумерация строк

  Номера строк используются только как ссылки для выполнения переходов. Вы
можете использовать эту особенность для более удобной компоновки программы.
Номера строк не обязательно должны быть в порядке возрастания.

  Номера строк взаимно-независимы в основной программе, подпрограмме и
функциональных операторах. Это позволяет использовать тот же самый номер
строки в разных подпрограммах.

(4) Размещение нескольких операторов в одной строке

  Несколько операторов в одной строке разделяются символом двоеточия (:)
для облегчения распознавания компилятором.


(5) Зарезервированные слова

  Зарезервированные слова (ключевые слова) состоят из строк содержащих
алфавитно-цифровые символы, без различия между верхним и нижним регистрами.
Кроме того, первый символ после зарезервированного слова не должен являться
алфавитно-цифровым символом.

(6) Коды табуляции, пробела, пустые строки

  Между словами разрешается всталять коды табуляции и пробелы, между строк -
пустые строки, для улучшения внешнего вида и удобочитаемости Вашего исходного
текста.


2-1-2  Типы данных

  TBC поддерживает три типа данных - целочисленные, реальные и строковые.

  Целое число - число занимающее в памяти 2 байта в диапазоне от -32768 до
32767. Для задания шестнадцатеричного числа перед первой его цифрой вводится
префикс (&). Например, число &1234 равнозначно числу 1234H. Переменные
целочисленного типа 'A' и 'AB' могут использоваться как числовые значения в
коде ASCII.

  Реальное число - константа с плавающей запятой, занимающая в памяти 5
байтов с 9.5-кратной эффективной точностью, в диапазоне от 2.9387359E-39 до
1.7014118E + 38 в абсолютном значении. Представляет собой 4 байта дробной
части (мантисса) и експонента 1 байт со смещением точки 80H.

  Строчные данные представляют собой строку символов, заключенную между
двойными кавычками, размером не более 255-ти символов. В файле объектного
кода строка сопровождается символом пробела. Переменная строки содержит адрес
в памяти первого из последовательности символов. Соответственно, вы можете
получить адрес строки A$ с помощью выражения - DPeek(Loc(A$)).


2-1-3  Переменные

  Переменные целочисленного, реального и строчного типов определяются
следующим способом.

(1) Переменные целочисленного типа

  Состоят из последовательности алфавитно-цифровых символами и знака
подчеркивания (_), первый символ переменной обязательно долженн быть
алфавитным символом, определенным в соответствии c обьявлением целого числа.
Длина всех переменных имен - до 20-ти символов.

    Например:

        Integer A, King, Zebra
        DefInt I-N


(2) Переменные реального типа

  Состоят из последовательности алфавитно-цифровых символов и знака
подчеркивания (_), первый символ переменной обязательно должен быть
алфавитным символом.

    Например:

        a, a0, abcdef, abc56

  Также доступно обьявление переменных реального типа.


(3) Переменные строкового типа

  Состоят из последовательности алфавитно-цифровых символов и знака
подчеркивания (_), первый символ переменной обязательно должен быть
алфавитным символом, последний символ должен быть знаком ($), указывающий на
строчный тип данных.

    Например:

        A$, A0$, Abcdef$, Abc56$


(4) Типы переменных в массивах

  Названия такие-же как и для переменных целочисленных, реальных и строчных
типов данных, сопровождаются значениями индекса в массиве.

  Для всех названий переменных не делается различия между нижним и верхним
регистрами для любых символов. Например, abcdef, ABCDEF и Abcdef - те же
самые переменные.


2-1-4 Арифметические Выражения

  Выражения составляются из констант и переменных объединенных с операторами.
Компилятор TBC делает строгое различие для выражений целочисленного и
реального типа.

  Пример:

        Integer I,J,K
        Real X,Y,Z                  <-- omissible

        K=I+J                       <-- целочисленное выражение
        Z=X-Y                       <-- реальное выражение

                        Арифметические операции
  для арифметических операторов:     и для логических операторов:
  +     сложение,                    and   конъюнкция (логическое и),
  -     вычитание,                   or    дизъюнкция (логическое или),
  *     умножение,                   xor   исключающая дизъюнкция
  /     деление,
  ^     возведение в степень,
  mod   арифметический модуль,


  Example:

        Integer I,J,K
        K = I * J
        K = I / J
        K = I MOD J
        K = I AND J

  Поддерживаются следующие шесть операторов отношения

        =   равно,
        >   больше,
        >=  больше или равно,
        <   меньше,
        <=  меньше или равно,
        <>  не равно

  Пример:

        If I>=J Then K=1 Else K=0


2-1-5  Строковые выражения

  Строковые выражения состоят из строковых констант, строковых переменных и
строковых функций соединенных оператором сложения (+).

  Пример:

        A$="ABCDE"
        B$=Left$(A$,3)+"XYZ"


2-1-6  Операторы присвоения

  Значение переменной справа от знака (=) присваивается переменной слева.

  Применение: <Переменная> = <числовое значение> или <строковое значение>

  Тип данных выражения справа должен быть равнозначным типу данных переменной
слева - целочисленным, реальным или строковым типом данных.



(1) Целочисленные значения

  Целочисленное выражение с правой стороны оператора присвоения,
обрабатывается полностью, как целочисленное значение.

  Пример:

      Integer K,M,N
      K=M+N
      N=DPeek(M)-1
      K=M*N
      K=M/N

  Каждое из реальных значений справа автоматически преобразовываются в
целочисленные значения, округляясь в сторону ближайшего целого числа. Для
получения результата части выражения как реального значения, используйте
функцию CInt().

  Пример: Если X0=1.3

      Integer X
      X=X0*4+1                <-- в результате X = 5
      X=CInt(X0*4)+1          <-- в результате X = 6


  В примере показанном выше, два реальных значения преобразуемые в
целочисленное с помощью функции CInt() - вначале перемножаются как два
реальных значения, а уже только потом округляется результат.


  Для работы с целочисленными значениями трех логических операторов or, xor и
and - приводится пример ниже.

    Integer X,Y,Z
    X=Y Or Z
    Y=Z Xor X
    Z=(X+Y) And &FFF0

  Для операций с целочисленными значениями также можно использовать
оператор Mod.

    Integer X,Y,Z
    X=Y Mod Z

  Приоритетность арифметических операций в TBC - следующая.

    высокая:  mod > /, * > -, + > and, xor, or  :низкая

  Роль сумматора в 8086 выполняет регистр AX. При операциях с целочисленными
выражениями, содержание регистра AX вначале представлено фиктивной переменной
(!).


(2) Реальные Выражения

  Реальное выражение с правой стороны оператора присвоения, обрабатывается
как реальное значение и ограничивается применением функций реального типа.

  Пример:

      X=Y+Z
      D=A+B*C
      Y=Sin(X)+Z

  В примере показанном выше, целочисленные значения используются после
преобразования их в реальное значение. Для получения результата части
выражения как целочисленного значения, используйте функцию Float().

  Пример:

      Integer X,Y,Z
      Y0=X+Y-Z                   <-- реальная операция после того, как каждое
                                     из значений преобразовано в реальное
      Y0=Float(X+Y-Z)            <-- преобразование в реальные значения после
                                     операции с целочисленными значениями
      X0=Float(Peek(100)*2)      < - преобразование в реальные значения после
                                     целочисленной операции со значением, с
                                     помощью целочисленной функции Peek()

  С другой стороны, индексы всех элементов массивов рассчитывается с помощью
целочисленных операций.


(3) Строковые Выражения

  Значения справа от оператора присваивания обрабатываются как строковые
выражения, в случае отсутствия в выражении оператора соединения, происходит
просто подмена названия строкового выражения.

  Пример:

      C$=A$+B$+"ABC"      <-- соединение строк
      B$=A$               <-- только подмена названия
      B$=A$+""            <-- новое название после соединения

  Прямые операции со строковыми значениями могут реализоваться при
использовании функции Peek() и оператора Poke следующим образом.

  Пример:

      A$="XYZ"
      Poke DPeek(Loc(A$)),'A'

  Фиктивная переменная (!$) в начале выражения доступна как строка
представляемая регистром BX.


2-2  Операторы описаний и синтаксис

2-2-1  Описания переменных

(1) Оператор INTEGER

  Объявляет целые переменные.

  Применение: integer <variable name> [, <variable name>]

  Имя переменной может состоять из алфавитно-цифровых символов и знака
подчеркивания (_), обязательно должно начинаться с алфавитного символа.

    Пример:

        Integer cntr, const
        Dim cntr(100)

  Одновременно возможны объявление и инициализация переменных.

  Применение: integer <variable name><constant>[,<variable name><constant>]

    Пример:

        Integer cntr 12, const 25


(2) Оператор REAL

  Объявляет реальные переменные.

  Применение: real <variable name> [, <variable name>]

  Имя переменной может состоять из алфавитно-цифровых символов и знака
подчеркивания (_), обязательно должно начинаться с алфавитного символа.

    Пример:

        Real XYZ, ABC
        Dim XYZ(50,10)

  Одновременно возможны объявление и инициализация переменных.

  Применение: real <variable name> <constant> [,<variable name> <constant>]

    Пример:

        Real XYZ 1.23, ABC 2.56


(3) Оператор CHARACTER

  Объявляет строковые переменные.

  Применение: string <variable name> [, <variable name>]

  Имя переменной может состоять из алфавитно-цифровых символов и знака
подчеркивания (_), обязательно должно начинаться с алфавитного символа.

    Пример:

        Character String, Test
        Dim String(10)


(4) Объявление локальных переменных.

  Объявления внутри подпрограмм и функциональных операторов определяют
локальные переменные.

    Пример:

        SubRoutine Test
          Integer Cntr
          Real XYZ

  Переменные объявленные снаружи подпрограмм считаются глобальными. С другой
стороны, все массивы считаются  глобальными переменными независимо от того,
где они были объявлены.


(5) Обьявление Параметров

  Обьявление параметров необходимо в подпрограммах или функциях.

  Пример:

        SubRoutine Test(I, XYZ, Abc$)
          Integer I
          Real XYZ

  Все параметры должны быть обязательно объявлены, за исключением строковых
  переменных сопровождаемых знаком $.


2-2-2  Определение целочисленных констант

  Имя определяемых целочисленных констант должны начинаться с символа
подчеркивания (_).


  Применение: _<constant name> <integer number>

  Пример:

        _Const    1234
        _Port     &80
        _Size     100*2+1

        Integer N, X, Y
        Dim Y(_size)

        N=DPeek(_Const)+_Size
        X=Inp(_Port)

  Вы смело можете использовать эти определения целочисленных выражений без
риска занять дополнительное место, в объектной области и во встроенном
ассемблерном коде, после компиляции.


2-2-3  Обьявление массивов

(1) Оператор DIM

  Объявляет имена и размерность массивов.

  Применение: DIM <array name>(<maximum of index> [,<maximum of index>])

  Где, размерность массивов может быть двумерной.

  Пример:

        Integer A
        Real X0
        Dim A(9), X0(20, 30), Test$(100)

  Отсчет индекса массива начинается с нуля. В показанном выше примере десять
элементов, (0), (1) --- (9), размещенных в массиве.

  Распределение рядов в двухмерном массиве непрерывно- x0 (0,0), x0 (1,0),
x0 (2,0), x0 (3,0) --- x0 (0,1), x0 (1,1), x0 (2,1), x0 (3,1) ---,.

  Размещение в строчном массива, test$ (0), test$ (1), test$ (3) --- .
По умолчанию длина строки для каждого элемента - до 255. Каждый элемент
массива строки содержит адрес (указатель) первого символа строки.

  Массив, объявленный оператором DIM, размещается в сегменте данных.
Следовательно, размер общей памяти простых переменных и буферов,
ограничивается 64-мя килобайтами.

  Массивы обрабатываются как глобальные переменные с целью сохранения
ресурсов памяти.


(2) Оператор DIMX

    Объявляет имена массива и размерность расширенных массивов.

  Применение: DIMX <array name>(<maximum of index> [,<maximum of index>])

  Расширенные массмвы могут быть двумерными.

  Пример:

        Integer B
        Real Y0
        DimX B(30000), Y0(200, 200)

  Расширенный массив, объявленный оператором DIMX, размещается на
дополнительном сегменте, выше зоны сегмента стека.

  Обратите Внимание, что обычный массив при инициализации оператором DIM
обнуляется, а расширенный массив оператором DIMX не инициализируется.


2-2-4  Оператор DEFINT

  Объявляет целочисленный тип для первого символа в именах переменных.

  Применение: DEFINT <top character of variables> [, <top character ---->]

  Пример:

        DefInt I-N, T

  В этом случае, переменные начинающиеся с символов I-N и T расцениваются
как значения целочисленного типа. Например, Jack и King() интерпретируются
как целочисленные переменная и массив, соответственно. Однако, объявления
операторами INTEGER, REAL и CHARACTER имеют более высокий приоритет.


2-2-5  Оператор BREAK

  Выход из внутренних циклов в операторах SWITCH - CASE, FOR - NEXT,
WHILE - WEND, REPEAT - UNTIL.

  Применение: BREAK

  Пример:

        Integer N
        For N=0 To 10
          If N=5 Then Break
          Print N;
        Next N
        End

  Результат должен выглядеть следующим образом:

        0  1  2  3  4


2-2-6  Оператор CONTINUE

  Продолжает цикл в операторах FOR - NEXT, WHILE - WEND, REPEAT - UNTIL.

  Пример:

        Integer N
        For N=0 To 10
          If N=5 Then Continue
          Print N;
        Next N
        End

  Результат должен выглядеть следующим образом:

        0  1  2  3  4  6  7  8  9  10


2-2-7  Оператор STOP

  Возвращение в систему MS-DOS с сообщением "End" при компиляции программы.

  Применение: STOP

    Пример:

        If X<0 Then Stop

  Вы можете размещать оператор STOP в любом месте программы для остановки
выполнения программы.


2-2-8  Оператор END

  Отмечает область конца программы и библиотечных исходников при компиляции.

  Применение: END

  Обратите Внимание, что компиляция завершается на этом операторе.


2-2-9  Оператор REM

  Обозначает не компилируемые строки комментариев в исходном файле.

  Прменение:  REM [<remarks>]

  Звездочка (*) в начале строки расценивается как оператор REM.

    Пример:

        Rem Меморандум
        * Комментарии

  Апостроф (') только после номера строки расценивается также, как оператор
REM.


2-2-10  Оператор KILL

  Удаляет целую область строковых данных.

  Usage: KILL

  Этот оператор инициализирует только буферный указатель без наложения
записей в памяти.

Примечание: Вы можете удалять строковые данные частично, обновляя указатель
(Размещение: 0020H) во избежание путаницы. Например, сначала сохраняем
указатель Temp=DPeek(&20), после удаления назначенных строк восстанавливаем
указатель следующим оператором - DPoke &20,Temp.


2-2-11  Оператор MERGE

  Обьединяет библиотеку исходных модулей с основной программой во время
  компилирования.

  Применение: MERGE <"Имя Файла">

  По умочанию расширение подключаемого файла - .LIB. Каждая библиотека
исходных модулей должна завершаться оператором END. Размещение нескольких
операторов в одной строке(:), после оператора MERGE запрещается.
Оператор MERGE размещать в библиотеке не позволяется.


  Применение: библиотечный файл "TEST.LIB" текст ниже,

        Print A
        End

  Присоединяется к основной программе,

        A=123
        Merge "TEST3"
        End

  Эквивалентная программа после компилирования - выглядит так:

        A=123
        Print A
        End


2-3  Операторы управления

2-3-1  Оператор FOR --- NEXT

  Выполняется цикл от FOR до NEXT обозначенное число раз в упр. переменной.

  Применение: FOR <упр. переменная>=<начало> TO <конец> [STEP <шаг>]

           <процедура>

         NEXT [<управл. переменная>

  Цикл FOR --- NEXT может влаживаться один в другой до 15-ти уровней.

  Пример: повторить десять раз вывод чисел от 0 до 9.

        Integer J,K
        For J=1 To 10
          Print
          For K=0 To 9
            Print K;
          Next K
        Next J
        End


  Пример: цикл декремента от 10 до -10 с шагом в 1.

        Integer N
        For N=10 To -10 Step -1
          Print N;
        Next N
        End

Примечание: оператор STEP - средство для декремента в цикле (эквивалент
на Паскале - оператор DOWN TO) более быстр, чем инкремент STEP в обычном
BASIC. Это - специальная целочисленная функция для быстрых операций в цикле.
В случае реальных чисел, цикл FOR --- NEXT такой же самый как и в обычном
BASIC.

  Применение: обозначения переменных для оператора STEP.

        Step X                  <-- добавляющий цикл X
        Step -X                 <-- отнимающий цикл целого числа X
        Step -(X+Y)             <-- отнимающий цикл целого числа (X+Y)

    Где, X и (X+Y) должены быть положительными значениями.


2-3-2  Оператор WHILE --- WEND

  Цикл оператора WEND, пока условие истинно.

  Применение: WHILE <условное выражение>

           <процедура>

         WEND

  Пример:  вывод чисел от 0 до 10.

        Integer N
        N=0
        While N<=10
          Print N;
          N=N+1
        WEnd
        End

  Вложенность циклов WHILE может составлять до 8-ми уровней.


2-3-3  Оператор REPEAT --- UNTIL

  Цикл оператора UNTIL до тех пор, пока условие ложно.

  Применение: REPEAT

           <процедура>

         UNTIL <условное выражение>

  Example:  вывод чисел от 0 до 10.

        Integer N
        N=0
        Repeat
          Print N;
          N=N+1
        Until N>10
        End

  Этот цикл всегда выполняется по крайней мере один раз. Циклы UNTIL могут
иметь вложенность до 8 уровней.


2-3-4  Оператор IF --- THEN --- ELSE

  Выполняется оператор A, если условие истинно, иначе выполняется оператор B.

  Применение1: IF <условное выражение> THEN <оператор A> [ELSE <оператор B>]

  Применение2: IF <условное выражение> THEN

              <процедура A>

          ELSE

              <процедура B>

          ENDIF

  В Применении1, каждый оператор ограничивается кодом в 127 байтов в рабочей
программе и внутри одной логической строки.

  Пример:

    If A<0 Then N=1: Print "M" Else P=1: Print "P"

  В прменении2, возможности оператора IF расширены по сравнению с
традиционным BASIC'ом и процедура должна заканчиваться оператором ENDIF.

  Пример:

        If A<0 Then
          N=1
          Print "M"
        Else
          P=1
          Print "P"
        EndIf

  Как в предыдущем примере, первая строка расширенного условного оператора IF
должна завершаться оператором THEN.

  Разрешается также следующий формат записи.

    If A>0 Then If B>0 Then Print "++" Else Print "+-" Else Print "-?"

  Следующая запись операторов применения2 эквивалентна показанному выше
примеру.

        If A>0 Then
          If B>0 Then
            Print "++"
          Else
            Print "+-"
          EndIf
        Else
          Print "-?"
        EndIf

  Для условных переходов позволяется следующий формат записи.

    If A>0 Then 200
    If A>0 Then GoTo 200

Примечание: логические операции в условных выражениях не поддерживаются.
Например: If (A>B) And (C>D) Then X=A+C.
Поэтому сделайте по другому: If A>B Then If C>D Then X=A+C.

2-3-5  Оператор SWITCH --- CASE
            Операторы BREAK, DEFAULT, SWEND

  Переключает направление программы оператором CASE.

  Прменение1:

        SWITCH <целочисленное выражение>
          CASE <константа>
            <процедура>
            BREAK
          CASE <константа>
            <процедура>
            BREAK
          DEFAULT
            <процедура>
            BREAK
        SWEND


  Пример:

        Switch Asc(A$)
          Case 'a'
            Print "By A"
            Break

          Case 'a'+1
            Print "By B"
            Break

          Default
            Print "Others"
            Break
        SwEnd

    Операторы SWITCH могут быть вложены до 5-ти уровней.


  Применение2:

        SWITCH <строковое выражение>
          CASE <строка>
            <процедура>
            BREAK
          CASE <строка>
            <процедура>
            BREAK
          DEFAULT
            <процедура>
            BREAK
        SWEND


  Пример:

        Switch A$
          Case "Abc"
            Print "By Abc"
            Break

          Case "Def"
            Print "By Def"
            Break

          Default
            Print "Others"
            Break
        SwEnd


2-3-6  Оператор GOTO

  Переход к обозначенной строке или метке.

  Применение: GOTO <Номер строки> или <Метка>

  Нумерация строк имеет другое назначение чем в традиционном BASIC,
и используется только в качестве меток для ссылок.

  Номера строк независимы друг от друга в основной программе, подпрограммах
и функциях. Поэтому нельзя делать ссылки на номера строк в подпрограмме
из главной программы и наоборот.

  Допустимы следующие форматы написания операторов.

    GoTo @Name
    GoTo Name


2-3-7  Оператор GOSUB

  Переход к обозначенной строке или подпрограмме и возвращение к следующей
строке после выполнения.


  Применение: GOSUB <номер строки> или <метка> или <имя подпрограммы>

  Пример:

        GoSub 100

  Допустимы следующие форматы написания операторов.

    GoSub @Name
    GoSub Name

Если при вызове подпрограммы необходимы параметры применяйте оператор CALL.


2-3-8  Оператор RETURN

  Возврат в вызывающую программу.

  Применение: RETURN

  Поместите оператор в конце подпрограммы или на пути в подпрограмме, для
возвращения.

  Применение:

          <процедура>

        Return


2-3-9  Оператор ON --- GOTO

  Переход на обозначенную строку или метку при определенных условиях.

  Применение:

  ON <целочисленное выражение> GOTO <строка номер1> [,<строка номер2> -----]

  Переход на строку номер1 для результирующего значения 1, переход на строку
номер2 для результирующего значения  2, и так далее . Иначе, будет выполнена
следующая строка.

  Допустимы следующие форматы написания меток или названий.

  Пример:

        Input a$
        On InStr("Cdep", A$) GoTo @Calc, @Display, @End_Prg, @Print_Out


2-3-10  Оператор ON --- GOSUB

  Переход на обозначенные строки или метки или подпрограммы на определенных
условиях и возвращения к следующей строке после выполнения.

  Применение:

  On <целочисленное выражение> GoSub <строка номер1> [, <строка номер2>---]

  Переход на строку номер1 для результирующего значения 1, переход на строку
номер2 для результирующего значения  2, и так далее . Иначе, будет выполнена
следующая строка.

  Допустимы следующие форматы написания меток или названий подпрограм.

  Применение:

        Input a$
        On InStr("CDEP", a$) GoSub @Calc, @Display, @Print_Out


2-3-11  Оператор ON ERROR GOTO (GOSUB)

  Переход к обозначенной строке или метке в случае ошибки.

  Применение: ON ERROR GOTO  <номер строки> или <метка>

              ON ERROR GOSUB <номер строки> или <метка>

  Обозначение вызываемой строки или метки поддерживается до тех пор, пока
не сделано другое обозначение. Если нет другого обозначения этими
операторами, возврат в основную программу будет происходить при любой ошибке
за исключением ошибок при работе оператора INPUT.


2-3-12  Оператор ON EOF GOTO (GOSUB)

  Переход к обозначенной строке или метке если конец файла данных (вне
данных). Файл данных закрывается автоматически.

  Применение: ON EOF GOTO <номер строки> или <метка>

              ON EOF GOSUB <номер строки> или <подпрограмма>

  Это обозначение поддерживается, пока не сделано другое обозначение.


2-3-13  Оператор ON KEY GOTO (GOSUB)

  Переход к обозначенной строке или метке, если получен код клавиши.

  Применение: ON KEY GOTO <номер строки> или <метка>

              ON KEY GOSUB <метка> или <подпрограмма>

  Состояние клавиатуры проверяется при каждом выполнении этого оператора.


2-3-14  Оператор CALL

  Вызывает и выполняет обозначенную подпрограмму.

  Применение: CALL <имя подпрограммы> [(<аргумент1> [, <аргумент2> -----])]

  Разрешаются аргументы, но тип и номер аргумента не должны противоречить с
аргументами в вызываемой подпрограмме, и должны соответствовать.

  Пример:

        Integer X,Y
        Real X0
        Call Test(10, 3.0, "String", X, X0, X$, X-Y)

  В выше приведенном примере показаны - целочисленные аргументы, реальные,
строковые, целочисленные, строковый и целочисленный типы, соответственно.
(Примечание: DUMMY - зарезервированное слово)

  Обратите внимание что оператора CALL нет в традиционном BASIC.

  Аргументы вызываются как значения целочисленного типа, ссылки на реальный
и строковый типы, соответственно. Следовательно,аргумент строки берет верхний
адрес строки (адрес смещения).

  Кроме того, целые элементы в числовом массиве могут называться именем
массива с пустыми круглыми скобками. ( Обратитесь к оператору SUBROUTINE )

    Применение:

        Call Имя( массив1( ), массив2( ))


2-3-15  Оператор USER

  Вызывает и выполняет определенную программу на машинном языке.

  Применение: USER <адрес в памяти> [, <аргумент1> [, <аргумент2> --- ] ]

    Аргументы   Регистры

      1          AX
      2          BX, AX
      3          CX ,BX, AX
      4          DX, CX, BX, AX

  Оператору USER лучше предпочесть оператор /CALL.


2-4  Ввод

2-4-1  Оператор INPUT

  Назначает интерактивный ввод значений с клавиатуры в переменные.

  Применение: INPUT [<"информация";>] <переменная> [, <переменная> ----- ]

  Ввод с клавиатуры преобразуется в соответствующие типы и назначается в
переменные, разделяемые запятой (,). Необходимо вводить все данные сразу.

  Пример:

    10  Input "x,y"; x, y
        Print "X+Y="; x+y
        GoTo 10
        End

  После сообщения "x, y" будет отображен знак вопроса (?), не спутайте
точку с запятой (;) с запятой (,). После знака ?, введите два значения
отделяемые пробелом или запятой.

  Для ввода строк:

    10  Input A$, B$
        Print A$; B$
        GoTo 10
        End


  В примере показанном выше, для ввода A B,C D должно отображаться сообщение
A BC D и A,BC,D для ввода "A, B" "C, D".


2-4-2  Оператор LINE INPUT


  Назначает все входные символы в одну строковую переменную.

  Применение: LINE INPUT [<"сообщение";>] <строковая переменная>


2-4-3  Оператор READ

  Читает данные файла, чтобы присвоить их переменным после открытия файла.

  Применение: READ <переменная> [, <переменная> -----]

  Позволяет определять целочисленные, реальные и строковые переменные. Тип
расширения файла по умолчанию - ".DAT". (Обратите внимание на отличие
операторов DATA и READ от таких же операторов в традиционном BASIC)

  Применение:  чтение файла (смотрите для информации файл LNEQ.BAS)

    Файл данных: DTEST.DAT

        Test Data, 1, 2.345

    Программа:

        Open "DTEST"
        Read A$,B,C0
        Print A$
        Print B,C0
        End

   Коды табуляции и пробелы в начале строки данных игнорируются. С другой
стороны, все символы, включенные между символами двойных кавычек (") являются
эффективными. Каждое из значений могут быть отделены пробелом, кодом
табуляции или запятыми, но строка должна быть отделена только запятой, кроме
строк включенных между двумя двойными кавычками.


2-4-4  Оператор LINE READ

  Передает значение одной считанной строки одной строковой переменной.

  Применение: LINE READ <строковая переменная>

  Пример:  файл данных - тот же самый как в предыдущем примере.

        Open "DTEST"
        Line Read A$
        Print A$
        End


2-4-5  Оператор READ#

  Читает двоичные данные, для размещения на массивы после открытия# файла.

  Применение: READ# <массив> [, <массив> -----]

  После прочтения файл закрывается и размер данных возвращается в регистр AX.

  Пример:

        Integer Ary
        Dim Ary(25000)
        Input "Имя файла:", A$
        Open# A$
        Read# Ary
        Print !; " байт"
        End


2-5    Вывод

2-5-1  Оператор PRINT

(1) Основной формат оператора PRINT

  Выводит на консоль результаты после оценки выражений.

  Применение: PRINT [<выражение> [, <выражение> -----]

  Пример:

        Print 1.2345, 678.9+1.1, "ABCDEF", "test"
        Print 1.2345; 678.9+1.1; "ABCDEF"; "test"
        End

  Результаты должны выглядеть примерно так:

         1.2345          690            ABCDEF  test
         1.2345  690 ABCDEFtest

  Здесь, запятая отделяющая выражения, продвигает курсор на 16 столбцов
вправо. Просле строчных и целочисленых значений, запятая перемещает курсор
всего на 8 столбцов. Точка с запятой (;) вместо запятой курсор не перемещает.

  Символы возврата каретки и перевода строки, размещенные в конце оператора
PRINT, автоматически посылаются на консоль или принтер только в том случае,
если в конце оператора не стоят символы запятой или точки с запятой.


(2) Обозначение индекса принтера

  Определение индекса принтера с помощью команды #n.

  Применениение: PRINT #<номер индекса>

  Где, номер индекса может быть от 0 до 5, и инициализирован #0. Это
обозначение поддерживается, пока не сделано другое обозначение.

        Индекс        Адресат

        #0            на дисплей
        #1            на принтер
        #2 - #4       на диск
        #5            в порт RS-232C(AUX)

  Пример:  вывод на принтер

      Print #1 "Test"
      Print "Line Out"      <----- прилагается к #1
      End

  Однако, сообщения от оператора INPUT и сообщения об ошибках отображаются на
дисплее несмотря на указанное выше обозначение адресата.


(3) Средство управления форматом печати

  Управление форматом печати производится с помощи команды %.

  Прменение: PRINT %<format>


  Используются следующие типы форматов:

%n.m    Для десятичных чисел с плавающей запятой m-мест (m<10), в общую
        ширину поля включаются места для отрицательного знака или n -
        пробелов. Для условного представления принимается E-форма.

%nEm    Для чисел с плавающей запятой в экспоненциальном формате (E-форма)
        с порядком мантиссы m (m<10), и общей шириной поля - n мест.

%nI     При оценке целочисленного выражения, общая ширина поля - n.

%I      Свободный формат с корректировкой после оценки левой части
        целочисленного выражения.

%nH     n - мест для чисел в шестнадцатеричном формате после оценки
        целочисленного выражения.

            n>4        &ABCD
            n=4        ABCD
            n=3         CD
            n=2        CD

%nX     n пробелов.

%0      Для чисел в свободном формате с корректировкой левой части после
        оценки реальных выражений, инициализированной при работе оператора
        PRINT.

  Пример:

        For N=0 To 10
          X0=N/10
          Print %5.1 X0; %12.6 Sin(X0); Cos(X0)
        Next N
        End

  Проверьте результаты приведенного выше примера.


  Для свободного формата, тип выражения будет определяться типом первой
цифры чисел, переменных, функций в любых выражениях. Критерий определения
- такой же как и для левой части выражений в операторах IF, WHILE, UNTIL.

    Пример оценки как целочисленного выражения.

        Print Peek(12)+3

    Следующее выражение оценивается как реальный тип.

        Print Sin(XYZ)+0.1

    Другие варианты:

    (1) Print 1+Sin(0.1)        создает реальное значение 1.0998334
    (2) Print 5/3.0             создает реальное значение 1.6666667
    (3) Print 5/3               создает целое число 1
    (4) Print CInt(5/3)         создает внутреннее реальное значение 2
    (5) Print Peek(12)+3.1      здесь синтаксическая ошибка из-за
                                смешивания разных выражений

  Во избежание синтаксических ошибок для примера (5) применяйте
  "Print Float(Peek(12))+3.1"

  Пример табуляции c помощью кода Tab:

        SubRoutine TabString(N)
          Integer N
          While Peek(N)<>0
            If !=9 Then Print, Else Print Chr$(!);
            N=N+1
          WEnd
          Print
          Return
        SubEnd


2-5-2  Оператор WIDTH

    Обозначает длину строки для оператора PRINT.

  Применение : WIDTH #<номер индекса> <длина строки>

  Применение при выводе на консоль:

        Width #0 72

  Где, #0 можно опустить. По умолчанию ширина каждой строки инициализируется
в 80 символов. (Обратите внимание, что ширина строк для многих мониторов
равна 79 символам.)


2-5-3  Функция TAB( )

  Передвигает курсор к обозначенной позиции (для оператора PRINT).

  Применение: TAB(<позиция курсора>)

  Пример:

        Print "abcdefg"; Tab(20); "xyz"

  Обратите внимание, что управляющие коды (< 20H кроме 8 и 0DH) не
засчитываются при выводе на консоль.


2-5-4  Оператор WRITE#

  Записывает двоичные данные из массивов на диск.

  Использование: WRITE# <массив> [, <массив> ----- ]

  После записи на диск, файл закрывается автоматически.

  Пример записи на диск:

        Integer N,X
        Real Y0
        Dim X(9), Y0(9)
        For N=0 To 9
          X(N)=N
          Y0(N)=N/100
        Next N

        Open# "ARYTEST"
        Write# X, Y0
        End


2-6  Доступ к файлам

2-6-1  Оператор OPEN

  Открывает файл для чтения содержимого с помощью оператора READ.

  Применение: OPEN <"file name">

  Расширение файла по умолчанию - ".DAT".


2-6-2  Оператор OPEN#

  Открывает файл для чтения/записи содержимого с помощью операторов
  READ# и WRITE#.

  Применение: OPEN# <"file name">

  Расширение файла по умолчанию - ".ARY".


2-6-3  Операторы OPEN#2 --- OPEN#4

  Открывает файл для работы оператора PRINT#2.

  Применение: OPEN#2 <"имя файла">

  Расширение файла по умолчанию -  ".DAT".

  То же самое и для операторов OPEN#3 и OPEN#4.

  Кроме того, при использовании операторов OPEN#2A, OPEN#3A и OPEN#4A,
  данные добавляются в конец файла. Если файл не существует, будет создан
  новый файл.


2-6-4  Оператор CLOSE, CLOSE#2 --- CLOSE#4

(1) Оператор CLOSE

  Закрывает файл для оператора READ.

  Применение: CLOSE

  Если EOF (Конец файла), файл закрывается автоматически.


(2) CLOSE#2

  Закрывает файл для оператора PRINT#2.

  Применение: CLOSE#2

  Тоже самое и для операторов CLOSE#3, CLOSE#4.


2-7  Оператор SUBROUTINE

  Определяет начало оператора SUBROUTINE и регистрирует название(имя).

  Применение:

        SUBROUTINE <имя> [<аргумент> [, <аргумент> ----- ])]

          <процедура>

          RETURN [<целочисленное выражение>]
        SUBEND

  Для регистрации названия(имени) используются Алфавитно-цифровые символы и
символ подчеркивания (_), имя начинается с алфавитного символ. Длина
названия(имени) - до 20-ти символов. Число параметров - до 62. Параметры
целочисленного и реального  типов должны быть объявлены операторами INTEGER
и REAL в самой подпрограмме.

  Пример:

        Integer A
        Real B0
        A=2
        B0=1/3
        Call Display(A, B0)
        Stop

        SubRoutine Display(X, YZ)
          Integer X
          Real YZ
          Print X, YZ
          Return
        SubEnd
        End

  Параметр целочисленного типа вызывается как значение, а параметр реального
типа как ссылкой. (Обращайтесь к оператору CALL)

  Пример:

        Integer A
        Real B0
        A=12
        B0=5.678
        Call Test(A, B0)
        Print A, B0
        Stop

        SubRoutine Test(X, Y0)
          Integer X
          Real Y0
          Print X, Y0
          X=34
          Y0=1.234
          Print X, Y0
          Return
        SubEnd
        End

  Результат будет выглядеть так.

          12       5.678
          34       1.234
          12       1.234


  Если в параметре необходимо значение, запишите следующим образом.

  Пример:

        Integer A
        A=12
        Call Test(Loc(A))
        Print A
        Stop

        SubRoutine Test(X)
          Integer X
          Print %I Dpeek(X)
          DPoke X, 56
          Return
        SubEnd
        End


   Пример параметра числового массива:

        Integer X
        Real Y0
        Dim X(10), Y0(5,5)
        Call Test(X(), Y0())

        SubRoutine Test(A(10), B0(5, 5))


2-8  Оператор FUNCTION

  Обозначает начало оператора FUNCTION и регистрирует имя.

  Применение:

        FUNCTION <имя> [<аргумент> [, <аргумент> ----- ])]

          <процедура>

        RETURN <реальное выражение>
        FNEND

   Работа оператора FUNCTION очень похожа на оператор SUBROUTINE, за
исключением того, что FUNCTION возвращает значение реального типа.

  Пример из 1000 функции многократного(кратного):

  It is almost the same as the SUBROUTINE statement except it returns a real
type value.

  Пример функции умножения на 1000:

        Real A0
        A0=2.0
        Print Fn_Sen(A0)
        Stop

        Function Sen(Yz)
          Real YZ
          Return YZ*1000.0
        FnEnd
        End


2-9  Другие операторы

2-9-1  Оператор SWAP

  Обмен значениями переменная1 и переменная2.

  Применение: SWAP <переменная1>, <переменная2>

  Есть некоторые ограничения как например, обмен простой переменной
нормального массива с переменной расширенного массива.


2-9-2  Оператор WAIT

  Ожидание до тех пор, пока данные из порта не удовлетворят состояние.

  Применение: WAIT <индекс порта>, <целочисленное выражение>

    Пример:

        Wait &12, &80

    Эквивалентная подпрограмма вышеупомянутого оператора:

        Loop0: IN    AL,12H
               AND   AL,80H
               JZ    Loop0


2-9-3  Оператор OUT

  Вывод 8-ми разрядных данных в назначенный порт.

  Применение: OUT <индекс порта>, <целочисленное выражение>


2-9-4  Оператор DOUT

  Вывод 16-ти разрядных данных в назначенный порт.

  Usage: DOUT <индекс порта>, <целочисленное выражение>


2-9-5  Оператор POKE

  Записывает в память один байт данных.

  Применение:
  POKE [[<целочисленная переменнная>];] <адрес в памяти>,
         <целочисленное выражение>

  Пример для сегмента данных:

        Poke &A000, 3

  Пример для дополнительного сегмента:

        X=&A000                 <----- обозначение ESeg
        Poke X; Address, Data   <----- размещение в ESeg

  Если дополнительный сегмент уже определен, можно записывать в сокращенной
форме "Poke; Address, Data".


2-9-6  Оператор RANDOMIZE

  Устанавливает начальное число для функции RND (X).

  Применение: RANDOMIZE [<целочисленное выражение>]

    Пример:

        Randomize &5A5A


2-9-7  Оператор DPOKE

  Помещает одно слово данных по адресу в памяти.

  Применение:
  DPOKE [[<целочисленная переменнная>];] <адрес в памяти>,
          <целочисленное выражение>

  Все также как и в операторе POKE за исключением размера данных.


2-9-8  Оператор VALUE

  Заносит целочисленное значение в регистре AX.

  Применение: VALUE <целочисленное выражение>

  Определенное значение просто заносится в регистр AX. Ниже будет приведено
более подробное объяснение.


2-9-9  Встроенный ассемблер

  В TBC поддержан встроенный ассемблер.

  Использование: /мнемоника

    Пример:

        /MOV    AX,BX
        /ADD    AX,DX
        /PUSH   AX

    Допускается запись мнемоник в другой форме.

        /MOV AX,BX  /ADD AX,DX  /PUSH AX


    Мнемоника           Действия

      aaa               ;ASCII-коррекция после сложения
      aad               ;ASCII-коррекция перед делением
      aam               ;ASCII-коррекция после умножения
      aas               ;ASCII-коррекция после вычитания
      adc               ;сложение с переносом
      add               ;сложение
      and               ;логическое И
      call              ;вызов процедуры
      cbw               ;преобразование байта в слово
      clc               ;сброс флага переноса cf
      cld               ;сброс флага направления
      cli               ;сброс флага прерывания
      cmc               ;инвертирование флага переноса
      cmp               ;сравнение операндов
      cmpsb             ;сравнение строк(байтов)
      cmpsw             ;сравнение строк(слов)
      cwd               ;преобразование слова в двойное слово
      daa               ;десятичная коррекция после сложения
      das               ;десятичная коррекция после вычитания
      dec               ;уменьшение операнда на единицу
      div               ;беззнаковое деление
      hlt               ;останов
      idiv              ;деление целочисленное со знаком
      imul              ;умножение целочисленное со знаком
      in                ;ввод операнда из порта
      inc               ;увеличить операнд на 1
      int               ;вызов подпрограммы обслуживания прерывания
      into              ;прерывание, если переполнение
      iret              ;возврат из прерывания
      ja                ;переход если выше
      jb                ;переход если ниже
      jbe               ;переход если или равно
      jc                ;переход если перенос
      jcxz              ;переход если регистр CX = 0
      jg                ;переход если больше
      jge               ;переход если больше или равно
      jl                ;переход если меньше
      jle               ;переход если меньше или равно
      jmp               ;переход безусловный
      jmps              ;jump short unconditionally
      jnb               ;переход если не ниже
      jnc               ;переход если нет переноса
      jno               ;переход если нет переполнения
      jpo               ;переход если колличество единичных битов результата
                        ;нечетно (нечетный паритет)
      jns               ;переход если знак плюс (старший бит результата = 0)
      jnz               ;переход если нет нуля
      jo                ;переход если переполнение
      jpe               ;переход если колличество единичных битов результата
                        ;четно (четный паритет)
      js                ;переход если знак минус (старший бит результата = 1)
      jz                ;переход если ноль
      lahf              ;загрузка регистра AH флагами из регистра eFlags/Flags
      lds               ;загрузка сегментного регистра DS указателем
      lea               ;load EA to register
      les               ;загрузка сегментного регистра ES указателем
      lock              ;lock bus
      lodsb             ;load string(byte)
      lodsw             ;load string(word)
      loop              ;loop CX times
      loopz             ;loop while zero
      loopnz            ;loop while not zero
      mov               ;move to and from registers/memory
      movsb             ;move string(byte)
      movsw             ;move string(word)
      mul               ;multiply(unsigned)
      neg               ;change sign
      nop               ;no operation
      not               ;invert register/memory
      or                ;logical or
      out               ;output to port
      pop               ;pop a word from the stack
      popf              ;pop flags
      push              ;push operand onto the stack
      pushf             ;push flags
      rcl               ;rotate left through carry
      rcr               ;rotate right through carry
      rep               ;repeat if equal
      rep               ;repeat if zero
      repnz             ;repeat if not zero
      ret               ;return
      retf              ;return far
      rol               ;rotate left
      ror               ;rotate right
      sahf              ;store AH into flags
      sar               ;shift arithmetic right
      sbb               ;subtract with carry
      scasb             ;scan string(byte)
      scasw             ;scan string(word)
      shl               ;shift left
      shr               ;shift right
      stc               ;set carry flag
      std               ;set direction flag
      sti               ;set interrupt enable flag
      stosb             ;store string(byte)
      stosw             ;store string(word)
      sub               ;subtract
      test              ;test
      wait              ;wait
      xchg              ;exchange
      xlat              ;translate string
      xor               ;exclusive or


  Другое:

      cs                ;code segment override prefix
      ds                ;data segment override prefix
      es                ;extra segment override prefix
      ss                ;stack segment override prefix
      byte              ;define byte
      word              ;define word
      float             ;floating point number
      even              ;even directive
      align             ;align directive(4,16,256)
      blank             ;relative org without initialize
      byte ptr          ;byte pointer operator override
      word ptr          ;word pointer operator override
      offset            ;offset operator of address


2-9-10  Консольные команды

  Для использования консольных операторов должен быть установлен драйвер
  MsDOS - ANSI.SYS.

(1) Оператор LOCATE

  Определяет позицию курсора на дисплее видео.

  Применение: LOCATE <столбец>, <строка>

  Пример:

        Locate X, Y

    где,

    x-ный столбец (0<= x <80)
    y-ная строка  (0<= y <24)


(2) Оператор TXCLS

  Очищает текстовый видеодисплей.

  Применение: TXCLS


(3) Оператор BEEP

  Издать звук.

  Применение: BEEP


(4) Оператор CURSOR

  Управление курсором on/off (вкл/выкл).

  Применение: CURSOR <целочисленное выражение>

  0 для выключения курсора (off)
  1 для включения курсора (on)


(5) Оператор RDELETE

  Удаление символов до конца строки.

  Применение: RDELETE


(7) Оператор TXCOLOR

  Устанавливает цвета для текста.

  Применение: TXCOLOR <целочисленное выражение>

  Значения для цветов:

      0 = черный,    1 = синий,      2 = зеленый,    3 = голубой,
      4 = красный,   5 = фиолетовый, 6 = коричневый, 7 = серый


2-10  Встроенные функции

2-10-1  Функции целочисленного типа

  Используйте только с выражениями целочисленного типа.

(1) Функция IABS()

  Возвращает абсолютную величину целочисленного выражения.

  Применение: IABS(<целочисленное выражение>)


(2) Функция IVAL()

  Конвертирует строковые символы в целые числа.

  Применение: IVAL(<строка символов>)


(3) Функция INP()

  Возвращает один байт данных из порта.

  Применение: INP (<целочисленное выражение>)

  Старший байт равен нулю.


(4) Функция DINP()

  Возвращает два байта данных из порта.

  Применение: DINP (<целочисленное выражение>)


(5) Функция PEEK()

  Возвращает один байт данных из адреса в памяти.

  Применение: PEEK ([[<целочисленная переменная>];]<целочисленное выражение>)

  Пример:

        Integer X,Address
        X=Peek(Address)


  Пример для другого сегмента.

        Integer X,Y,Address
        X=&A000               <----- определить eseg
        Y=Peek(X; Address)    <----- обращение к памяти определенной в eseg


(6) Функция DPEEK()

  Возвращает одно слово данных из адреса в памяти.

  Применение: DPEEK ([[<целая переменная>];] <целочисленное выражение>)

  Смотрите пояснение функции PEEK ().


(7) Функция POS()

  Возвращает позицию столбца расположения курсора.

  Применение: POS (<целочисленное выражение>)

  Индекс определяется целочисленным значением, но функцию POS () применяйте
без номера индекса в операторе PRINT.


(8) Функция LOC()

  Возвращает адрес размещения в памяти переменной.

  Применение: LOC (<переменная>)

  В частности, имя расширенного массива без индекса возвращает адрес в
памяти, обозначенный в дополнительном сегменте.

  Пример, получающий сегмент расширенного массива.


        DPeek(Loc(ExArray( )))


(9) Функция CINT()

  Возвращает ближайшее целочисленное значение, округленное в сторону к
  реальному значению.

  Применение: CINT(<реальное значение>)


(10) Функция ASC()

  Возвращает код первого символа строки символов.

  Применение: ASC(<строка символов>)

  пример:

        ACS("abcd") Возвращает 61H


(11) Функция INSTR()

  Возвращает значение, если строка2 включена в строку1, иначе 0.

  Применение: INSTR([<целочисленное выражение>,] <строка1>, <строка2>)

  Значение N означает - в строке1 начинать поиск с N-ного символа.

  Пример:

        Integer N, X
        N=2
        A$="abcdefg"
        X=InStr(N,A$,"de")

  Результат будет равен 4.


(12) Функция LEN()

  Возвращает колличество символов в строке символов.

  Применение: LEN(<строка>)


(13) Функция FRE()

  Возвращает свободную память для строк в байтах.

  Применение: FRE(<имя фиктивной переменной>)


(14) Функция USR()

  Возвращает значение из подпрограммы машинного языка.

  Применение: USR(<адрес в памяти> [,<параметр1> [, параметр2>] ----- ])

              Аргументы         Регистры

                1               AX
                2               BX, AX
                3               CX, BX, AX
                4               DX, CX, BX, AX


(15) Функция определения CALL_name()

  Ссылается на возвращаемое значение после вызова подпрограммы.

  Пример: CALL_<имя подпрограммы> [(<параметр1> [, <параметр2>] ----- ]

  Перед именем подпрограммы должна быть приставка " CALL_ ".

  Пример:

        X = Call_Name(Y)
        Stop

        SubRoutine Name(Y)
          Integer Y

          <Процедура>

          Return Y+3
        SubEnd

  Выражение после RETURN должно быть целочисленного типа.


2-10-2  Функции реального типа

  Используйте только с выражениями реального типа.

(1) Функция ABS()

  Возвращает абсолютное значение реального типа.

  Применение: ABS(<реальное значение>)


(2) Функция SGN()

  Возвращает знак реального значения.

  Применение: SGN(<реальное значение>)

  Возвращаемое значение - 1 для положительного значения, 0 для нулевого и
-1 для отрицательного значения, соответственно.


(3) Функция RND()

  Возвращает случайное положительное значение из диапазона 0-1.

  Применение: RND(<имя фиктивной переменной>)


(4) Функция INT()

  Возвращает наибольшее целое число не больше чем реальное значение.

  Применение: INT(<реальное значение>)

  Пример:

          INT( 2.3)   возвращает 2.0.
          INT(-2.3)   возвращает -3.0.


(5) Функция FIX()

  Возвращает целочисленную часть реального значения.

  Применение: FIX(<реальное значение>)

  Пример :

           FIX(-2.3)  возвращает -2.0.


(6) Функция SQR()

  Возвращает квадратный корень реального значения.

  Применение: SQR(<реальное значение>)

  Вызовет ошибку при отрицательных значениях.


(7) Функция SIN()

  Возвращает синус реального значения выраженный в радианах.

  Применение: SIN(<реальное значение>)


(8) Функция COS()

  Возвращает косинус реального значения выраженный в радианах.

  Применение: COS(<реальное значение>)


(9) Функция TAN()

  Возвращает тангенс реального значения выраженный в радианах.

  Применение: TAN(<реальное значение>)


(10) Функция ASN()

  Возвращает арксинус реального значения в пределах диапазона -pi/2 к pi/2.

  Применение: ASN (<реальное выражение>)

  Выраженное значение должно быть в диапазоне от -1 до 1.


(11) Функция ACS()

  Возвращает арккосинус реального значения в пределах диапазона -pi/2 к pi/2.

  Применение: ACS (<реальное выражение>)

  Выраженное значение должно быть в диапазоне от -1 до 1.


(12) Функция ATN()

  Возвращает арктангенс реального значения в пределах диапазона -pi/2 к pi/2.

  Применение: ATN (<реальное выражение>)


(13) Функция EXP()

  Возвращается значение e експоненты выраженного значения.

  Применение: EXP (<реальное выражение>)


(14) Функция LOG()

  Возвращает естественный логарифм выраженного значения, которое должно быть
положительно.

  Применение: LOG(<реальное выражение>)


(15) Функция LGT()

  Возвращает десятичный логарифм выраженного значения, которое должно быть
положительно.

  Применение: LGT(<реальное выражение>)


(16) Функция HSN()

  Возвращает гиперболический синус выраженного значения.

  Применение: HSN (<реальное выражение>)


(17) Функция HCS()

  Возвращает гиперболический косинус выраженного значения.

  Применение: HCS (<реальное выражение>)


(18) Функция HTN()

  Возвращает гиперболический тангенс выраженного значения.

  Применение: HTN (<реальное выражение>)


(19) Определение функции FN_name()

  Ссылается на возвращаемое значение после вызова функции.

  Пример: FN_<имя функции> [(<параметр1> [, <параметр2>] ---])]

  Перед именем функции должна быть приставка "FN_ ".


(20) Константы реального типа.

    PI        возвращает 3.14159265.

    EE        возвращает базу 2.71828183 натурального логарифма.


(21) Функция FLOAT()

  Преобразовывает в реальную форму целочисленное выражение.

  Применение: FLOAT(<целочисленное выражение>)


(22) Функция VAL()

  Преобразовывает строку в число.

  Применение: VAL(<строка>)


2-10-3  Функции строкового типа

  Используйте только в выражениях строкового типа.

(1) Функция CHR$()

  Возвращает символьный код выраженного значения.

  Применение: CHR$(<целочисленное выражение>)


(2) Функция RIGHT$()

  Возвращает подстроку символов начиная справа.

  Применение: RIGHT$(<строка>, <целочисленное выражение>)

  Пример:

        a$=Right$("abcdefg", 3)

  Будет возвращена строка "efg".


(3) Функция MID$()

  Возвращает строку символов начиная от обозначенной позиции.

  Применение:
  MID$(<строка>, <целочисленное выражение1> [, <целочисленное выражение2>])

  Строка возвращается размером <целочисленное выражение2>.

  Пример:
         A$=Mid$("abcdefg", 3, 2)

  Возвращена строка "cd".


(4) Функция LEFT$()

  Возвращает строку символов начиная слева.

  Применение: LEFT$(<строка>, <целочисленное выражение>)

  Пример:

        A$=Left$("abcdefg", 3)

  Возвращена строка "abc".


(5) Функция STR$()

  Преобразовывает выраженное значение в строковое.

  Применение: STR$(< целочисленное или реальное выражение>)

  Формат вывода такой же как и в операторе PRINT.

  Пример:

        Str$(%n.m X0)


(6) Функция INKEY$

  Возвращает вводимый символ как строчный.

  Применение: INKEY$

  Пример:

        10 If InKey$="" Then 10

Обратите внимание: Повторные назначения типа A$=A$+InKey$ вызывают ошибку.



            Часть 3.  Особенности программрования

3-1  Опции компиляции

    A>TBC /C имя файла<cr> или A>TBC имя файла /C<cr>

  Параметры командной строки можно вводить как в примерах показанных выше.

  А можно ввести в первой строке в исходной программе,

      Options /c /a

команду с опциями для компилирования.

Справедливы следующие параметры.


(1) /A

  Проверять каждое объявление целочисленных и реальных имен переменных.

(2) /V

  Проверять каждое обьявление целочисленных и реальных имен переменных
размером 6 или больше символов.


(3) /S

  Расценивать отдельный символ как имя целой переменной.


(4) /F

  Выбрать программу вывода для операторов PRINT#0 и LOCATE.

    Опция         Consoleout подпрограмма  Подпрограмма Управления Курсором

    по умолчанию       INT 29H                     AH=6, INT 21H
    /F0                INT 29H                     INT 29H
    /F1                AH=6, INT 21H               AH=6, INT 21H
    /F2                AH=6, INT 21H               AH=2, INT 21H
    /F3                AH=2, INT 21H               AH=2, INT 21H


(5) /W

  Инициализировать область буферизации.

    /wt=130     Временный размер буфера (чтение и т.д.)
    /wi=128     Ввести размер буфера (максимальный 256)
    /wb=256     Размер буфера для строковых операций
    /wl=&FFF8   Верхний предел строковой области (в сегменте данных)
    /ws=4096    Область стека
    /wp=&FFFE   Указатель вершины стека

(6) /J

  Не генерировать код команд переходов (для пропуска подпрограмм или
функциональных операторов).

(7) /U

  Не обновлять буфер строк после обработки строк.

(8) /E

  Выводить сообщения об ошибках в файл (BC.ERR).

(9) /T

  Трассировать выполнение компилируемого объекта.

(10) /TL

  Результат трассировки.

(11) /C

  создать файл в формате COM.

(12) /O

  Оптимизировать программу.

(13) /#x

  Компилировать с условиями, определенными в начале строки. Строки с #e и #c
используются для создания .exe и .com файлов, соответственно.

(14) /I

  Определить переменную, объявленную в подпрограмме как статическая
переменная.

(15) /Q

  Ожидать нажатия любой клавиши в случае синтаксической ошибки.


3-2  Режим трассировки

     Комбинация клавиш   Действия

        ^Z               Останов
        ^L               Результат трассировки
        ^Q               Выход
        ^C               Возврат в систему


  Пример:  A>TBC /TL HANOI<cr>


    Прямое переключение опрератором режима трассировки доступно следующим
образом.

  Прменение: TRACE on

             TRACE off


3-3  Ссылки на номера строк

  Метки начинающиеся с символа (@) и имена подпрограмм, а также номера строк
используются как ссылки.


3-4 Обработка оператором VALUE

(1) Целочисленная обработка

    Пример:

        Value A+B

        Результат оставлен в регистре AX.



(2) Продолжение выражения

  Пример: VALUE ! <оператор> <последующее целочисленное выражение>

  Знак восклицания (!) представляет собой содержимое регистра AX.

    Пример:

        Value !+3

        число 3 добавлено к регистру AX.


(3) Присвоение

  Применение: VALUE = <целочисленная или строковая переменная>

  Содержимое регистра AX присвоено переменной.



3-5  Примеры программирования на ассемблере

(1) Ссылки на переменные в BASIC

        Integer Var, Ary, ExAry
        Dim Ary(10)
        DimX ExAry(20)

        /MOV    AX,VAR
        /MOV    VAR,AX
        /MOV    AX,Ary(2)
        /MOV    ES,ExAry()
        /INC    VAR
        /CALL   VAR
        /JMP    VAR

  Где, названия регистров (AX, CX, DX, AL, CL, DL, и т.д.) и
зарезервированных слов - нельзя присваивать переменным.

  Назначение в 8 разрядные регистры:

        /MOV    AL,VAR
        /MOV    Ary(2),BL
        /INC    BYTE PTR VAR

    Адрес Смещения:

        /MOV    BX,OFFSET VAR
        /MOV    SI,OFFSET ARY(2)
        /MOV    AX,[BX+SI+OFFSET ARY(0)]

  Ссылка на параметры в операторах SUBROUTINE и FUNCTION:

        /MOV    AX,Arg
        /INC    Arg

  Они транслируются в mov ax, [bp+n] и inc word ptr [bp+n], соответственно.


(2) Ссылки на номера строк и метки

  Как адрес смещения:

        /MOV    BX,@100
        /MOV    [BX+SI+@100],CX
        /MOV    AX,[@100+2]
        /INC    BYTE PTR [@100]

  Как адрес перехода.

        /JMP    @100
        /CALL   @100+2
        /JZ     @Name


(3) Определение BYTE

        /Byte 5, 'A', "ABCDE", @100, @TEST

  Где, @100 и @TEST преобразованы в значения относительного адреса.


(4) Определение WORD

        /Word 1000, @200, @TEST

  Где, @200 и @test преобразованы по абсолютному адресу в области сегмента
кода.


(5) Определение BLANK

        /Blank  10

  Где, область в 10 байтов зарезервирована в сегменте кода.


(6) Разное
    Определение сегментов как префикса.

        /CS
        /MOV    [DI],AX

  или

        /CS  /MOV    AX,[DI]


  Определение команды повторения:

        /REP
        /STOSB

  или

        /REP  /MOVSB
        /REP  MOVSW


  Определения смещения как индекса.

        /MOV    AX,[BX+(@100+2)*3/2+'AB'+_Const]
        /MOV    AL,[BX+SI]+@100/16+5
        /MOV    BX,OffSet Ary(0)+3

  Операции ограничены простыми числами.


3-6  Прикладные программы к оператору PRINT

  Результаты, выраженные ассемблером могут легко сосланы на символ
! в операторе PRINT.

  Пример:

        /MOV    AX,7
        /SHL    AX,1
        Print !

  Результат должен быть 14, для 7 сдвиг влево на 1 бит.

  Пример для изучения программирования на асемблере.

        /MOV    AX,DS
        Print %4H !



3-7  Работа программ-примеров

(1) Программы - исходники

    LNEQ.BAS - решение системы уравнений. Пробуйте типовые данные
Файл "MATRIX.DAT". Тогда, пробуйте следующие уравнения.

     X + 2Y = 5
    3X + 4Y = 7

  Данные для вышеупомянутых уравнений - 2,1,2,5,3,4,7. Где, первый номер
порядок системы уравнений.


    HANOI.BAS - головоломка Ханойские Башни. Это - пример рекурсивного
обращения как в Паскале.


    ENVIRON.BAS - пример для обращения к параметрам в командной строке и к
системным переменным.


    TCALC.BAS - пример программы калькулятора, используя метод обратной
польской нотации.



(2) Работа с графикой (PC/AT или Совместимый)

    MANDELB.EXE

  Программа демонстрации рисунка MandelBrot. Для компиляции этой программы
необходимо использовать функцию P_Set().

    DefInt I-N
    R1 = -2.
    R2 = .5
    H1 = -1.25
    H2 = 1.25
    P  = (R2 - R1) / 399.
    Q  = (H2 - H1) / 399.

    For K = 0 To 399
      C = K * P + R1
      N = 120 + K
      For J = 0 To 399
        D = J * Q + H1
        Y = D
        X = C
        For I = 0 To 40
          Xx = X * X
          Yy = Y * Y
          Xy = X * Y
          Y  = Xy + Xy + D
          X  = Xx + C - Yy
          If Xx + Yy > 4. Then Call P_set( N, J, I Mod 7 + 1): Break
        Next I
      Next J
    Next K
  End

3-8  Сообщения об ошибках при компиляции

  Array over
  EndIf error
  Illegal End

  Label over
  Miss match
  Nest error
  Nest over
  No File
  Phase error
  Prog over

  Step error
  Sub or FnEnd error
  SwEnd error
  Sub & Fn over
  SW ?
  Syntax error
  Var over
  WR error
  #Array
  #Var
  #Label
  #Sub & Fn

  #               double declaration of variable.
  $               unassigned string variable.
  %               format error.
  )               missing parenthesis.
  -               no corresponding to FOR, WHILE, REPEAT.
  ?               no label to refer.
  A               undefined array.
  I               undefined or unassigned integer variable.
  J               range over for relative jump.
  O               no OPEN# statement
  R               unassigned real variable.
  S               undefined subroutine or function
  U               undefined variables at /A, /V option.
  V               disagreement with NEXT variable.


3-9  Сообщения об ошибках при выполнении программ( --- error)

  #               numerical data
  $               string data
  /               delimiter
  D               out of data
  E               end of file
  F               no file
  I               integer
  M               range over at string area
  O               overflow
  Z               fatal
  No file
  error


3-10  Резюме

  Это руководство является переведом с японского. Я хотел бы поблагодарить
Вас за прочтение этого неполного руководства.

Декабрь 30, 2000          Автор: Dr. Genji OKADA
                          E-Mail: okada@en3.ehime-u.ac.jp
