КОНТР-&-БАСИК
     

Препроцессор языка Бейсик

     Язык Бейсик является чрезвычайно простым языком, но в то же время, на нём трудно писать большие программы (длиннее, чем можно охватить взглядом на экране), особенно в реализациях языка, где имена переменных зарезервированы, а длина составляет 1-2 символа, в таких случаях комментарии не сильно помогают. Идеальный случай, когда длина имени переменной такова, что понятен смысл и без комментариев, то есть, когда можно говорить, о “самокомментируемости“ объекта языка, сказанное относится к именам меток и константным числам. Длинные имена находятся в противоречии с быстродействием интерпретатора и размером памяти программ.
     Эту проблему может разрешить применение препроцессора, специальной программы-конвертора. В тексте программы помещаются строчки директивой препроцессора, пишется желаемое длинное имя, знак “=”, а за ним численное значение или имя переменной. В тексте программы размещается необходимое количество пояснений, их можно писать с использованием оператора и с использованием знака апострофа. Далее, везде, где необходимо, вместо коротких имён и численных значений, можно использовать символьные определения, сделанные ранее при помощи директивы. В конечном итоге, текст будет похож на пример, который приведён ниже.

 

rem *******************************************
rem ELBUG KEY
rem *******************************************
rem * 1 - индикация манипуляции
rem * 2 - индикация удержания PTT
rem * 3 – манипуляция
rem * 4 – PTT
rem * ВХодные биты:
rem * 1 – точки
rem * 2 – тире
rem * Аналоговые входы:
rem * 1 - перем. резистор "Скорость манипуляции"
rem * 2 - перем. резистор "Время удержания PTT"
rem **********************************************

define KEYING_LED   = 1 ' индикация манипуляции
define TX_LED       = 2 ' индикация состояния передачи
define KEY_LINE     = 3 ' манипуляция
define PTT_LINE     = 4 ' PTT
define DOT_INPUT    = 1 ' контакт ТОЧКИ
define DASH_INPUT   = 2 ' контакт ТИРЕ
define DOT_DURATION = d ' длительность элемента (точки)
define PTT_DELAY      = P ' задержка на отпускание PTT
define PTT_DELAY_CNTR = t ' "одновибратор" задержки отпускания
' (иначе таймер простоя)
define SOUND_ENABLED = 127
define ADC_MUX       = 128
define FORM_DASH     = 300
define FORM_DOT      = 200
define RESTART       = 50
define MAIN_LOOP     = 100
print
print "**************************"
print "* ElbugKey Version 1.2   *"
print "* 20.11.2006 TbcGroup    *"
print "**************************"
RESTART clrb TX_LED
      clrb PTT_LINE
MAIN_LOOP
      adc DOT_DURATION'считать положение движка потенциометра
                          'длительности точки

DOT_DURATION = DOT_DURATION + 15'начальное смещение при нулевом
                                'положении

setb ADC_MUX 'переключиться на канал потенциометра
             'задержки

             'отпускания PTT
tstb A, DOT_INPUT 'проверяем на точки
if a=0 then gosub FORM_DOT
     tstb a, DASH_INPUT
         if a=0 then gosub FORM_DASH 'проверяем на тире
    adc PTT_DELAY 'считать положение движка потенциометра
                  'задержки отпускания

PTT_DELAY = PTT_DELAY + 50'начальное значение при нулевом
                          'положении

clrb ADC_MUX'переключиться на канал потенциометра
            'длительности элемента
   if PTT_DELAY_CNTR = 0 then goto RESTART'давно не было точек
                                          'или тире
   PTT_DELAY_CNTR = PTT_DELAY_CNTR -1     'отмеряем время простоя
goto MAIN_LOOP
rem ------------------
rem Подпрограмма точек
rem ------------------

FORM_DOT setb KEYING_LED
setb TX_LED
setb PTT_LINE
setb KEY_LINE
PTT_DELAY_CNTR = PTT_DELAY 'рестарт таймера простоя
setb SOUND_ENABLED
clrb KEY_LINE
delay DOT_DURATION
clrb KEYING_LED
clrb KEY_LINE
clrb SOUND_ENABLED
delay DOT_DURATION
return
rem ------------------
rem Подпрограмма тире
rem ------------------

FORM_DASH setb TX_LED
setb PTT_LINE
setb SOUND_ENABLED
setb KEYING_LED
setb KEY_LINE
PTT_DELAY_CNTR = PTT_DELAY 'рестарт таймера простоя
delay DOT_DURATION
delay DOT_DURATION
delay DOT_DURATION
clrb KEYING_LED
clrb KEY_LINE
clrb SOUND_ENABLED
delay DOT_DURATION
return

 

Полученный текст сохраняется под именем, например, elbug.bas, далее, в командной строке набирается:

TBPREP.EXE –I elbug.bas –O elbug.out

        Примечание. TBPREP.EXE должен находиться в этом же каталоге или быть видимым из текущего расположения. Чтобы он был виден из любого места, самый простой способ – поместить его в директорию C:\WINDOWS, например. В результате работы препроцессора, будет получен файл elbug.out (содержимое показано ниже), в котором отсутствуют комментарии, а вместо символьных имён подставлены значения, расположенные в правой части определений

  PRINT
PRINT "**************************"
PRINT "* ElbugKey Version 1.2   *"
PRINT "* 20.11.2006 TbcGroup    *"
PRINT "**************************"
50 CLRB 2
CLRB 4
100 ADC D
D=D+15
SETB 128
TSTB A,1
IF A=0 THEN GOSUB 200
TSTB A,2
IF A=0 THEN GOSUB 300
ADC P
P=P+50
CLRB 128
IF T=0 THEN GOTO 50
T=T-1
GOTO 100
200 SETB 1
SETB 2
SETB 4
SETB 3
T=P
SETB 127
CLRB 3
DELAY D
CLRB 1
CLRB 3
CLRB 127
DELAY D
RETURN
300 SETB 2
SETB 4
SETB 127
SETB 1
SETB 3
T=P
DELAY D
DELAY D
DELAY D
CLRB 1
CLRB 3
CLRB 127
DELAY D
RETURN
 

 

 

Такой текст займёт меньше места в контроллере. Скачать препроцессор можно здесь

Обновлён: 11.01.2007