Nicron #119
17 ноября 2000
  Железо  

Железо - Automat, система внешнего управления и контроля на основе Спектрум- совместимых компьютеров, BAT FILE PROCESSOR v1.00, Robot v5.50 for Batproc v1.00.


Аппаратное обеспечениеУстройства и схемы не связанные с ZX Spectrum

(c) Spencer Winset of Diamond group
    Merlin of Diamond group

  В наше время звучит много слов о несостоятельности Спектрума в
качестве  полноценного  домашнего  компьютера,  в  силу  скудных
аппаратных возможностей. Однако многие процессы не требуют сверх
быстродействия  и  значительных  объемов памяти, например: обмен
почтой  с  ббс,  исполнение  функций АОHа, контроллер охранной и
пожарной  безопасности,  управление всем спектром электробытовых
приборов и т.д.

  Hашей   группой  планируется  развитие  и  реализация  системы
внешнего  управления  и  контроля  (Automat) на основе Спектрум-
совместимых  компьютеров.  Hиже  приводится  пример  организации
подобной системы для автоматизации работы  с  электронной почтой
в стандарте FTN (Фидо-подобные сети).




			     AUTOMAT


  Комплекс программно-аппаратных средств будет включать в себя:

1)*CMOS-часы
2) Схема  включения и отключения питания компьютера. Управляется
   будильником  часов, программно через порт управления питанием
   и,  для  станций компьютерных сетей, включение по телефонному
   звонку.
3)*Схема  активизации TR-DOS при включении питания для обеспече-
   ния автостарта программы boot.B

  Все  вышеперечисленные  аппаратные  средства кроме часов будут
полностью блокироваться переключателем ON/OFF.

4)*EMS + оверлей BATPROC
5) EWS  или REAL COMMANDER + аналогичный оверлей к этим програм-
   мам
6)*PKUNZIPм
7) LARA CROFT for Automat

*-уже реализовано



Работа будет происходить например следующим образом:

- В 23:00 срабатывает будильник (1).

- Схема  (2)  включает питание компьютера.

- Схема (3) - активизирует TR-DOS для автозагрузки.

 - Загружается  программа  (5),  имеющая имя "boot.B", которая в
 данной  системе выполняет функции ядра. Все остальные программы
 считаются внешними. Запускается оверлей трансляции батфайлов.

 - Проверяется  текущее  время  по списку событий, которые могут
 включить   компьютер   (т.   е.   для   индентификации  события
 проверяется  список  времен,  которые  могут быть установлены в
 будильник  на  совпадение  с  реальным).  При нахождении такого
 времени переходим на обработку этого события, иначе считаем что
 компьютер   запущен   пользователем   и  прекращаем  трансляцию
 батфайла  или,  для  BBS  - считаем что был телефонный звонок и
 запускаем   EMS.  Для  описываемого  примера  в  23:00  начался
 почтовый  час,  это  время  есть  в  списке  событий  и оверлей
 переходит к обработке задачи WORK_WITH_BBS.

задача: WORK_WITH_BBS

 - Устанавливается  время  срабатывания  будильника  на  N минут
 вперед,  N  зависит  от  времени,  необходимом  для  выполнения
 текущей  задачи,  например для дозвона на BBS можно считать это
 время  за  1-2  часа.  В  случае, если задача не была корректно
 завершена  (например  произошло  зависание  внешней  программы)
 повторное  срабатывание будильника вызовет аварийное выключение
 питания.

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

 - Запускается внешняя программа, обрабатывающая текущее событие
 (в  нашем  примере  - EMS, у которой, в свою очередь, тоже есть
 оверлей трансляции батфайлов).
   При  нормальном  завершении  любая  внешняя  программа должна
 обратиться  к  адресу #0000 в ПЗУ TR-DOS, что вызовет повторный
 запуск ядра (командера и транслятора батфайлов).

 - Запускается  распаковщик  пришедших пакетов *.zip - программу
 PKUNZIPm.B  -  это  вариант распаковщика, который автоматически
 распаковывает  zip  файлы  и  запускает  программу, имя которой
 прописано  в  сетапе  -  для  нашего  примера  это  все  тот же
 "boot.B".

 - Транслятор  запускает  очередную  внешнюю  программу  -  LARA
 CROFT,  адаптированную для автоматической работы: при вызове ее
 ядром  не  должно быть запроса на установку текущего времени, а
 должен сразу включиться тоссер, после окончания тоссинга должно
 запуститься ядро.

 - Ядро  удаляет  промежуточные  файлы:  *.zip,  *.CKT, все иные
 файлы,  дополнительно  скачанные  с BBS перемещает на винчестер
 (при  наличии оного) на один из архивных TRD-образов, уплотняет
 диск.

 - Задача  WORK_WITH_BBS завершена. Ядро определяет, что следует
 за  ней  в  списке событий что бы определить время последующего
 включения. Допустим, в 07:00 задана задача ALARM. Устанавливаем
 будильник   на   07:00,   паркуем   головки  всех  используемых
 дисководов  на  последний  трек  для  защиты  дисков от бросков
 питания  во время включения - отключения компьютера и выключаем
 питание  установкой  соответствующего  бита  в порту управления
 питанием.

- В   07:00   срабатывает   будильник  и  включается  компьютер.
Загружается ядро, определяется текущая задача.

задача: ALARM
- Запускается  программа  "ALARM.B". Она работает как будильник,
после чего завершает свою работу и запускает ядро.

- Завершается обработка задачи ALARM, устанавливаем следующую: в
23:00 задача WORK_WITH_BBS и все сначала.


Возможен вариант:
  - В  17:00  включился  компьютер.  Задача  с  таким временем в
  списке   событий  не  найдена,  видимо  это  пользователь  сел
  почитать    почту.   Исполнение   батфайлов   останавливается,
  компьютер работает как обычно.

  Конечно, во время работы ведется лог-файл.

────────────────────────────────────────────────────────────────


			-	-	-


  Представляемый  нами  оверлей  BatProc  - часть описанной выше
системы  внешнего  управления  и контроля, которая, мы надеемся,
будет  выпущена  для  полной  автоматизации  некоторых  задач на
компьютере ZX-Spectrum.

    BAT FILE PROCESSOR  v1.00
    ══════════════════════

Copyright KVA of E-Mage group     (BATPROC v0.99) 27.08.1999
Copyright Merlin of Diamond group (BATPROC v1.00) 17.09.2000
────────────────────────────────────────────────────────────────
BAT FILE PROCESSOR (BATPROC) распространяется свободно-Freeware.

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

 Все права на данный продукт принадлежат  E-Mage & Diamond group
и защищены законами  и  международными соглашениями об авторских
правах.
────────────────────────────────────────────────────────────────
Авторы описания: Евгений Голяков/Spencer Winset of Diamond group
		 Дмитрий Hесмачный /Merlin of Diamond group
		 Виктор Кузьмин /KVA of E-Mage group


			   ВВЕДЕHИЕ

  Данный  оверлей  предназначен  для  управления  программой EMS
(E-MODEM   STATION)  версии  2.55,  посредством  трансляции  BAT
файлов.  При  загрузке  оверлей  подгружает  BAT  файл  main.b и
исполняет  его  с метки события @autorun , если она найдена. При
вызове  оверлея путем нажатия на кнопку 'BatProc' на панели EMS,
выполнение  программы начнется с нулевой строки последовательно,
пока не будут встречены конструкции ветвления.

  Исполнение  програмы  можно  прервать  долгим (более 2 секунд)
нажатием  BREAK (SS+SPACE) или правой кнопки мыши, иначе нажатие
вызовет установку текущей ошибки 4 (BREAK PRESSED), и исполнение
программы  будет продолжено, с остановкой текущего процесса. Это
верно   при   работе   процессов   EMS,   связанных  с  внешними
устройствами, такими как дисководы и модем.
  В остальных случаях исполняемая программа прерывается сразу.
────────────────────────────────────────────────────────────────


                     Hовое в BATPROC v1.00
                     ─────────────────────

> Добавлено 25 команд:
   load		ifnotspacetr	unmarked	ramtop
   loadasm	ifnotspacerc	clearmarktr	move
   callasm	ifspacetr	clearmarkrc	safemove
   static	ifspacerc	ifnotmarkedtr	poke
   dinamic	markarcon	ifnotmarkedrc	peek
   clearmem	markarcoff	setldmode	free
						cattolog

> Добавлено отслеживание 4 ошибок:
   - catalogue damage		 код-15
   - ramtop no good		    -16
   - no memory or wrong allocate    -17
   - move in online		    -18

> Изменена структура задания масок:
   - плавающий аргумент
   - многобуквенное расширение
   - длина файла
   - больше/меньше в длине файла
   - любой один символ '?'

> Модульное исполнение Bat файлов ($label - файл-метки)
> Вывод значений переменных и выражений в терминал/Log файл
> Сообщения об ошибках трансляции
> Трансляция шестнадцатиричной системы исчисления
> Допустимо использование табуляций
> Допустимо использование комментариев

> Исправлены найденные ошибки предыдущих версий:
   - ifmarkedrc
   - ifmarkedtr
   - incerr
   - @disconnect update event uninstall
────────────────────────────────────────────────────────────────


		   ПРОГРАММИРОВАHИЕ BAT-ФАЙЛОВ

  В программировании  для  BATPROC используются КОМАHДЫ и МЕТКИ,
большие  и маленькие буквы которых транслятором  не различаются.
Исключение составляет трансляция команд, использующих в качестве
аргумента  маску  и  файл-метку. Описание  всех команд  и  типов
меток будет приведено ниже. Hельзя использовать несколько команд
в одной строке, исключение составляют конструкции ветвления.


		     КОHСТРУКЦИИ ВЕТВЛЕHИЯ

-УСЛОВHЫЕ:  command1  command2,  где  command1 является командой
ветвления,  а  command2  командой  перехода  goto,  вызова  call
или любой другой командой.  При соблюдении определенного условия
происходит  выполнение  следующей  команды текущей строки, иначе
транслируется  следующая  строка.

пример: ifonline goto label  ;если труба на модеме снята, то
	...		     ;то переход на метку label
	ifmarkedrc call label2  ;если маркирован хотя бы 1 файл,
	...			;то вызов пoдпрограмы label2
	ifnotmarkedrc call label3  ;если маркировано 0 файлов,
	...			   ;то вызов подпрограмы label3
	onerror goto label4  ;если произошла ошибка, то переход
	...
	onerror 6 tolog ~disk error
	...			    ;конкретизировать ошибку
	ifbbsoff bbson  ;если режим BBS не включен - включить
	...
	errors #10 stop  ;если накопилось 16 ошибок, то
	...		 ;закончить работу программы

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

пример: ifbbson ifonline onerror 0 tolog ~bbs online correctly.
	...
	if .8>0 if .8<20 if .8~15 tolog .8 = [1-19] исключая 15.
	...
	ifmarkedrc ifspacerc ifonline rcfiles	 ; если на прием
	;маркированы  файлы для них есть место на моем текущем
	;диске   не  потерена  связь  с  удаленным  абонентом,
	;принять маркированные файлы.


-БЕЗУСЛОВHЫЕ: command, где  командой  является  команда перехода
	      goto, вызова call или возврата return.
────────────────────────────────────────────────────────────────

			    КОМАHДЫ
			    ───────

принятые обозначения:

<.var> - любая   переменная,  где  var  ее   однобайтный  номер.
	 Переменная  хранит  только однобайтное число [#00-#FF],
	 если  попытаться  присвоить переменной значение, больше
	 #FF   то  в  переменную  попадет  только  младший  байт
	 результата
<dig> - любое двухбайтное число [#0000-#FFFF], допустим децимал,
	также  допускается  замена  <dig>  на  <.var>, но в этом
	случае значение <dig> ограничится [#00-#FF].
<expr> - любое выражение, аналог  <dig>, допускающий  последова-
	 тельное  (слева  - направо)  выполнение  математических
	 операций  сложения  и  вычитания, для  констант <dig> и
	 переменных <.var>
<mask> - любая маска  filename[.ext][.len]
<label> - любая метка
<drive> - индекс накопителя: A, B, C, D (или a, b, c, d)
<number> - ряд цифр [0-9], только для команды dial
<string> - спецификатор ответа  EMS, только для  режима  BBS ON:
	   Accessing OK, Access denied, Post area opened  и т.д.
<logstring> - строка  для  записи  в лог или передачи абоненту в
	      командах tolog и transmit, а так же любая  команда
	      для работы с EMS  в режиме BBS ON:
	      .log, .con, .send, .user, .refresh  и т.д.
<mode> - накопитель,   используемый  командами,  осуществляющими
	 подгрузку  файлов  с  диска.  Символы: A, B, C, D, T, S
	 (или a, b, c, d, t, s)

		─────────────────────────────


online  - снять трубку на модеме
offline - положить трубку на модеме

ifonline - если EMS в состоянии снятой трубки, исполнить следую-
           щую команду этой строки, иначе перейти на нижележащую
	   команду
ifoffline - если  EMS  в  состоянии положенной трубки, исполнить
	    следующую   команду   строки,   иначе   перейти   на
	    нижележащую команду
────────────────────────────────────────────────────────────────
dial <number> - набрать номер <number>, допустим разделитель '-'
────────────────────────────────────────────────────────────────
rccat	      - скачать текущий каталог абонента
rccat <drive> - скачать каталог диска <drive> абонента и сделать
	        его текущим
readcat		- перечитать католог своего текущего диска
readcat <drive> - перечитать свой диск <drive> и сделать текущим
────────────────────────────────────────────────────────────────
markrc <mask> - маркировать на правой панели (абонент) файлы
marktr <mask> - маркировать на левой панели (твой диск) файлы

ifmarkedtr - если что-то маркировано  на левой панели, выполнить
	     следующую команду этой строки
ifmarkedrc - если что-то маркировано на правой панели, выполнить
	     следующую команду этой строки
ifnotmarkedtr - если ничего  не маркировано  на левой панели, то
		выполнить следующую команду этой строки
ifnotmarkedrc - если ничего  не маркировано на правой панели, то
		выполнить следующую команду этой строки

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

clearmarktr - снять маркировку со всех файлов вашей панели
clearmarkrc - снять маркировку со всех файлов панели абонента
	      (это  намного  быстрее чем перезапрашивать каталог
	      для снятия маркировки)

markarcon - включить режим автоматической пометки ZXZIP архивов.
	    В этом режиме  при пометке первого файла из большого
	    архива остальные файлы, имеющие имена ********.ZIP и
	    сплошную структуру, будут маркированы автоматически
markarcoff - выключить  режим автоматической пометки ZXZIP архи-
	     вов (по умолчанию режим выключен)
────────────────────────────────────────────────────────────────
trfiles	  - передать помеченные файлы
rcfiles   - принять помеченные файлы

ifspacetr - выполнить следующий оператор, если на диске абонента
	    хватает места для записи файлов, помеченных на вашем
	    диске
ifspacerc - выполнить  следующий  оператор,  если на вашем диске
	    хватает места для записи файлов, помеченных на диске
	    абонента
ifnotspacetr - выполнить   следующий  оператор,  если  на  диске
	       абонента  не  хватает  места  для  записи файлов,
	       помеченных на вашем диске
ifnotspacerc - выполнить следующий оператор, если на вашем диске
	       не хватает места для записи файлов, помеченных на
	       диске абонента
────────────────────────────────────────────────────────────────
goto <label> - перейти на заданную метку

call <label> - вызвать  процедуру  (на  псевдостеке  сохраняется
	       адрес  возврата)
return - вернуться из процедуры
────────────────────────────────────────────────────────────────
tolog <logstring> - выдать в лог сообщение <logstring>
transmit <logstring>  - выдать   в   лог   и  передать  абоненту
			сообщение  <logstring>
sendcommand <logstring>[|<string>[|<string>]] - послать команду.
	Автоматически  добавляет  код  13  в  конец <logstring>.
	После  этого  ждет  прихода какого-то из двух string'ов,
	указанных  далее  (если  нет второго |, то вторая строка
	будет равна Access denied, если нет первого |, то первая
	строка  будет  Accessing OK). Если придет первая строка,
	то ошибки не будет (равна 0), если придет вторая строка,
	то будет ошибка 12, если в течении некоторого времени ни
	одна  из  этих строк не будет принята, то будет ошибка 1
	(абонент не отвечает)

sendbreak - послать сигнал break
────────────────────────────────────────────────────────────────
clearlog - очистить лог
savelog  - сохранить лог на текущем диске
cattolog - сбросить в лог каталог абонента
────────────────────────────────────────────────────────────────
bbson - включить bbs режим (если включится, то err=0)
bbsoff - выключить bbs режим

ifbbson - если bbs режим включен, исполнить следующую команду
ifbbsoff - если bbs режим выключен, исполнить следующую команду
────────────────────────────────────────────────────────────────
setdiskrw - установить флаг обмена файлами
resdiskrw - сбросить флаг обмена файлами

ifdiskrw - исполнить следующую  команду  строки, если был принят
	   или  передан  хотя  бы  один  файл  (установлен  флаг
	   обмена файлами)
────────────────────────────────────────────────────────────────
setspd <dig> - установить скорость <dig>
onspd <dig> - выполнить команду, если скорость равна <dig>
────────────────────────────────────────────────────────────────
stop - остановить программу (даже если есть что-то на стеке)

stopmain - снять с обработки перехваченное событие. Используется
	   в обработке меток событий
────────────────────────────────────────────────────────────────
runbasic <mask> - запустить первый соответствующий  маске <mask>
		  basic-файл (в маске  расширение '.B' указывать
		  не обязательно)
────────────────────────────────────────────────────────────────
windowsoff - стереть  с экрана какие-либо дополнительные окошки,
	     оставляя их содержимое в памяти
windowson - проявить окошки, сохраненные по команде windowsoff
────────────────────────────────────────────────────────────────
onerror - если  произошла  ошибка, исполнить  следующую  команду
	  этой строки
onerror <dig> - то  же,  что и onerror, только исполнение будет,
	        если произошла ошибка с номером <dig>
onerror = <dig> - сделать текущую ошибку равную <dig>

errors <dig> - если  было  <dig>  или  более  ошибок,  исполнить
	       следующую команду строки
errors = <dig> - сделать текущее количество ошибок равное <dig>

decerr - уменьшить на 1 количество ошибок
incerr - увеличить  на  1  количество  ошибок (количество ошибок
	 само увеличивается при возникновении оных)
pusherr - запомнить на псевдостеке текущее количество ошибок
poperr  - восстановить с псевдостека количество ошибок
────────────────────────────────────────────────────────────────
wait <dig>  - подождать <dig> интов
waits <dig> - подождать <dig> секунд
────────────────────────────────────────────────────────────────
poke <dig1>, <dig2> - записать   в  память   по   адресу  <dig1>
		      значение <dig2>
peek <.var>, <dig> -  прочитать  в  переменную  <.var>  значение
		      из ячейки памяти по адресу <dig>
────────────────────────────────────────────────────────────────
setldmode <mode> - установить   накопитель   с   которым   будут
		   работать  команды:  load,  loadasm, runbasic,
		   savevar,   loadvar,   а   также   файл-метки.
		   Возможные значения <mode>:
		     a,  b,  c,  d  -  установят для этих команд
		   соответствующие драйвы
		     t - эти  команды  будут  работать с текущим
		   драйвом
		     s - эти  команды будут работать с системным
		   драйвом  (т.  е.  с  тем  драйвом, с которого
		   произошла загрузка оверлея BatProc)

clearmem - удалить все модули, подгруженные с помощью файл-меток
	   из  памяти  и  освободить  эту  память  например  для
	   изменения границ распределения

static - установить  режим  в  котором  при  загрузке  программы
	 (двойным  щелчком  курсором  на панели EMS или командой
	 LOAD) не будут изменяться границы распределения памяти,
	 а  также  сохраняться  значения  переменных. Введен для
	 сохранения загруженных ранее кодовых блоков
dinamic - установить  режим  в  котором  при  загрузке программы
	  граница   bat-файла   будет  установлена  в  #FF00,  а
	  переменные будут очищены. Установлен по умолчанию

ramtop <dig> - установить границы  распределения памяти. Оверлей
	       располагается  в четвертой странице памяти. В ней
	       по  адресам  #C000  -  #DCAB  (в  данной  версии)
	       располагается  сам  интрепритатор, с адреса #FF00
	       находятся  переменные.  Для размещения программы/
	       кодовых  блоков  доступна  память  [#DCAC-#FF00],
	       причем  с адреса #DCAC до <dig-1> после отработки
	       данной команды будет окно программы, а с <dig> до
	       #FF00   -   окно   кодовых  блоков.  При  попытке
	       загрузить   программу,  не  помещающуюся  в  окно
	       программы  или  код, выходящий за окно кода будет
	       сгенерирована  ошибка  17. Если ошибку 17 вызовет
	       подгружаемая программа, сообщение  об  этом будет
	       выведено в лог. В общем эта команда соответствует
	       команде    бейсика    CLEAR   ADDR,   когда   она
	       используется для резервирования места под кодовый
	       блок,  только  при  этом  не  происходит  очистки
	       переменных   и  окно  кода  начинается  с  адреса
	       указанного  в  команде, а не со следующего, как в
	       бейсике.  Если  значение <dig> выходит за границы
	       [конец загруженной программы - #FF00] будет выдан
	       код ошибки 16 (RAMTOP no good)

free <.var> - занести  в  переменную <.var> количество свободной
	      памяти   в   окне   программы  в  секторах  (т. е.
	      вычисляет INT ((RAMTOP-END_PROGRAMM)/256))

loadasm <dig>, <mask> - загрузить  первый  подходящий  под маску
			файл по адресу <dig>.  Если файл выходит
			за границы  окна кода, будет установлена
			ошибка    17    и   загрузка   не  будет
			произведена. Все вычисления производятся
			в  секторах,  загрузка  также происходит
			посекторно,  поэтому  будьте  осторожны:
			возможна  ситуация,  когда  подгруженный
			файл   сотрет   ранее   загруженный  код
			неиспользуемым остатком сектора

callasm <dig> - Передать  управление  машинному  коду  по адресу
		<dig>.   Команда  потенциально  опасна,  поэтому
		перед использованием убедитесь, что кодовый блок
		был нормально загружен (ошибка 0)
load <mask> - загрузить  на  место  текущей  программы  новую  и
	      исполнить  ее  с  нулевой  строки.  Метка  события
	      @autorun   игнорируется.   При   нехватке   памяти
	      сообщение  об  этом  выдается в лог и генерируется
	      ошибка 17.   В   режиме  dinamic  перед  загрузкой
	      удаляется  окно кодов (RAMTOP = #FF00) и очищаются
	      переменные   (для   работы  программы  "с  чистого
	      листа"), этот режим установлен по умолчанию.
────────────────────────────────────────────────────────────────
erase - удалить на левой панели (мои) отмеченные файлы

move - уплотнить диск. Для работы этой команды необходимо что бы
       трубка  на модеме была положена, иначе выполнение команды
       не  будет  произведено и сгенерируется ошибка 18 (move in
       online).   Ограничение  сделано  во  избежание  ситуации,
       когда  во  время  звонка  на BBS все будут ждать когда же
       у занявшего сейчас линию выполнится, наконец, move
safemove - то  же  что  и move, но работа будет производиться по
	   одному файлу с перезаписью каталога после копирования
	   каждого файла,  что  должно обеспечить более надежную
	   работу  команды,  но и более  медленную,  к  тому  же
	   приводящую к более быстрому износу дискет и драйвов.
────────────────────────────────────────────────────────────────
settime <dig>:<dig>:<dig> - установить время, hh:mm:ss
readtime - прочитать   время,  читает  в  переменные  .2 (часы),
	   .3 (минуты) и .4 (секунды).
settimer <dig> - установить таймер на <dig> секунд
resettimer - сбросить таймер (запретить обработку)
iftimer - если  таймер  сработал,  выполнить  следующую  команду
	  текущей строки
addtimer <dig> - добавить к таймеру <dig> секунд
________________________________________________________________
clrvar - присвоить всем переменным значение '#00'

let <.var>=<expr> - присвоить переменной <.var>  значение <expr>

loadvar - загрузить переменные  с 15 сектора  0-й дорожки диска,
	  установленного командой setldmode
savevar - записать  переменные  на 15 сектор  0-й дорожки диска,
	  установленного командой setldmode

push <expr> - записать на псевдостек выражение <expr>
pop <.var> - снять с псевдостека 1 байт в переменную <.var>
________________________________________________________________
if <expr1> <?> <expr2> - выполнить следующюю команду этой строки
			 при  выполнении  условия <?> :
			  = - равенства выражений
			  ~ - неравенства выражений
			  > - expr1 больше чем expr2
			  < - expr1 меньше чем expr2
________________________________________________________________


			РАБОТА С ЧАСАМИ

  С часами BATPROC работает через драйвер модема:

#C027 - SET_TIME
		in:   A  -  часы,   B  -  минуты,   C  - секунды
		все данные идут в двоично-десятичном формате
#C02A - READ_TIME
		out: A, B, C.
#C02D - CALC_TIM
		вызывается  примерно каждые 1.5 инта (как когда)
		для не полностью автономных часов - для просчета
		времени.
#C030 - SET_ALR
		in:  BC  -  количество    секунд,   на   которые
		устанавливается таймер
		out: NC-ok, C-error.
 #C033 - ADD_ALR
		in: BC - добавить секунд
		out: см. выше
 #C036 - READ_ALR
		out: NC - noting, C - таймер сработал

  Более  подробное  описание  можно  найти  в  ZX-FORMAT#6,  где
описывается  драйвер  для MMD. Драйвер для EMS отличается только
способом задания скоростей  -  скорость, 0, скорость, 0  и т.д.,
максимум по 8 байт на скорость.
________________________________________________________________


		      РАБОТА С ПЕРЕМЕHHЫМИ

  Выделяется  256  переменных  с  номерами  от  0  до  255.  При
обращении  к  переменной  нужно  ставить точку перед ее номером.
Переменная .0  - номер текущей ошибки (onerror), .1 - количество
ошибок (errors), .2, .3, .4 - ячейки, которые изменяют процедуры
работы со временем.  Внимание!  Размерность  переменной  1 байт,
если  в  результате  вычисления  значение выражения будет больше
255, в переменную будет занесен только младший байт результата.
________________________________________________________________


		    МЕТКИ СОБЫТИЙ И ФАЙЛ-МЕТКИ

  При  объявлении  метки  перед  ней  всегда  пишется  ':',  при
использовании  метки  ':'  перед  ней не ставится. Метки событий
начинаются с символа '@', файл-метки с символа '$'.


			  Метки событий

  Hекоторые события при работе EMS, могут быть перехвачены до их
обработки, при этом BATPROC передает управление на соответствую-
щую событию метку.  После  исполнения  вашей подпрограммы, можно
вернуть  управление  EMS  на  обработку  перехваченного  события
командой   stop  или  игнорировать  событие  командой  stopmain.
В последнем случае  оператор  stopmain  снимает с очереди задачу
'обработать перехваченое событие Х', затем выполняется следующие
строки  до команды  stop , которая  останавливает исполнение bat
файла и BATPROC переходит в режим ожидания событий.


  Список меток событий:

@online - при поднимании трубы (сначала вызывается АОH, а потом
	  управление передается на эту процедуру)
@offline - вызывается при опускании трубы

@autorun - вызывается  при  первой  загрузке  оверлея  и  нового
	   бат-файла

@connect - вызывается при попытке установить connect

@disconnect - вызывается  при попытке рассоединиться (SS+ENTER),
	      сначала   вызывается   эта   программка,  а  потом
	      происходит  передача кода о том, что рассоединение
	      произошло успешно
@ontimer - вызывается по завершении работы таймера (как отсчитал
	   время)

  Вы можете использовать и другие метки событий, обращаясь к ним
из команд  call  и  goto . От обычных меток они будут отличаться
тем, что при обращении к несуществующей обычной метке произойдет
аварийный   останов   работы   программы,   а  при  обращении  к
несуществующей метке события выполнение программы продолжится со
следующей строки.



			  Файл-метки

  Файл  метки  начинаются  с  символа  '$'.  Когда  в  программе
встречается  переход  на  файл-метку  и  эта метка отсутствует в
программе,  будет  произведена   попытка   подгрузить  с  диска,
установленного командой setldmode, файла с именем, которое имеет
метка.  Hапример   call  $one  при отсутствии в программе строки
:$one   ...   попробует  подгрузить  с  диска программу с именем
"one.b".   Имейте   в   виду:   большие   и  маленькие  буквы  в
701файл-метках различаются!  Если такого файла на диске нет, будет
сгенерирована ошибка номер 13 (нет файла) и исполнение программы
продолжится  со следующей строки. Если файл не помещается в окно
программ,   выполнится  команда  clearmem  (удалятся  все  ранее
подгруженные   по   файл-метке  программы),  сообщение  об  этом
выведется  в  лог  и  последует вторая попытка подгрузки. Если и
после  этого  памяти  для  загрузки файла будет недостаточно, то
будет  сгенерирована  ошибка  номер 17 (нет места), сообщение об
этом  будет выведено в лог и выполнение программы продолжится со
следующей  после  перехода строки. Все вычисления производятся в
секторах.  Если  файл  нормально  подгружен,  в  памяти  в конце
программы  будет  сформирована  метка,  используемая  в  команде
перехода, которая в нашем примере запишется:

#0D,":$one",#0D

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

  Пример:

	call $one
	call $two
	call $one
:$two	....

В  этом  примере  в первой строке подгрузится файл 'one.b', файл
'two.b'  во  второй  строке искаться не будет, так как эта метка
уже  есть  в программе, в третьей строке программа 'one.b' также
подгружаться  не  будет,  так  как  она  уже подгружена в первой
строке, если же программу изменить следующим образом:

	call $one
	call $two
	clearmem
	call $one
:$two	....

то   второй   раз   подгрузка  файла  'one.b'  все  равно  будет
произведена,  так  как  команда   clearmem   сотрет то, что было
подгружено  на  момент  ее  выполнения  (в  данном  случае  файл
'one.b').


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

	call $one
	return

вы можете заменить ее на:

	goto $one

если  return  возвращает выполнение в главную программу, то даже
при  уничтожении  строки   goto $one  аварии при такой записи не
произойдет.


Еще о метках:

  Если  в  программе  отсутствует метка на которую вы попытались
перейти, то произойдет аварийный останов программы.
  Если   в   программе  отсутствует  файл-метка  на  которую  вы
попытались перейти, то будет  попытка  подгрузить  файл с диска,
а  при  его  отсутствии , сгенерирована  ошибка  13 и выполнение
программы продолжится со следующей строки.
  Если  в  программе  отсутствует  метка  события  на которую вы
попытались  перейти,  то  выполнение  программы  продолжится  со
следующей строки.



			     МАСКИ

  Маска задается следующим образом: filename[.ext][.len]

где: filename - имя файла, можно использовать символы '?'- любой
символ,  '*' - любые несколько символов в том числе и ноль. Если
filename  пусто,  то оно соответствует имени файла содержащего 8
пробелов.  Ограничения:  filename  не  может содержать более 2-х
звезд, а также нельзя писать 2 звезды подряд. Внимание:  масках
большие и маленькие символы различаются!

ext - расширение. Если оно содержит 1, 2 или 3 символа, то поиск
будет  произведен  только  по заданным символам, если больше, то
остальные  символы  будут отброшены, если не задан вообще, то он
будет  соответствовать  любому  расширению.  Можно  использовать
символ   '?'  для  задания  любого  символа.  Символ  '*'  можно
использовать  для задания любого расширения но только как первый
символ ext, в других случаях '*' будет задавать сам символ '*'.

len - размер файла в секторах. Допускается  использовать  символ
меньше  '<'  или больше '>', для задания интервала длины [0-len]
или  [len-255]  соответственно,  причем условия не строгие. Если
len  отсутствует,  он  соответствует всем файлам. акже в len HЕ
ДОПУСТИМО использовать '.' без аргумента и '.*'!!!401

  Совершенно пустая маска соответствует маске *.*


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

LARA.B = LARA    .B - бейсик файл с именем 'LARA    '
PK*.B  = PK??????.B - все бейсик файлы где 'PK' первые 2 символа
*.ZIP  = ????????.ZIP - отметит все файлы ZXZIP архивов
*id*    - все файлы, где где-либо есть последовательнось 'id'
*..<10 = *.*.<10 = *.???.<10  - все файлы меньше 10 секторов
       = *.* - пустая маска соответствует всем файлам
*.*.#1B - отметит все картинки  (звезда  в ext  не обязательна,
          введена для подобия формату маски на IBM PC.)


ПРИМЕЧАHИЕ:  При трансляции масок, ведущие пробелы игнорируются,
поэтому рекомендуется первый пробел имени файла заменять на '?',
тогда последующие пробелы будут обработаны корректно.



			  ВЫВОД В ЛОГ

  В командах  tolog и transmit  можно вывести в лог или передать
абоненту текстовую строку.  Кроме того можно использовать допол-
нительные символы и управляющие коды:

	_ - код  12, для очистки окна тeрминала
	 - код  14, для подачи звукового сигнала
	 - код  25, для корректного рассоединения абонентов
	~ - код 126, для перевода строки

Арифметическое выражение, значение которого необходимо вывести в
лог,  нужно  заключить  в символы '`' (обратный апостроф, SS+X в
латинском регистре).

пример: tolog ~текущая ошибка = `.0`, всего `.1` ошибок


ПРИМЕЧАHИЕ: В аргументе команды tolog, ведущие пробелы игнориру-
ются, поэтому рекомендуется начинать аргумент с символа перевода
строки '~',   тогда   последующие   пробелы   будут   обработаны
корректно.



		     ОФОРМЛЕHИЕ BAT-ФАЙЛОВ

  Для   удобства   расположения   текста   bat-файла  вы  можете
использовать  табуляции  везде,  где можно использовать пробелы.
При  загрузке  табуляция просто заменяется на пробел, так что не
имеет смысла использование табуляций в <logstring>.
  Для  вставки  комментариев  вы  можете  использовать  в начале
строки  символ  ';',  можно  писать комментарии и почти за всеми
командами,  исключение  составляют  команды,  оканчивающиеся  на
logstring>, <mask>, <number>



		     СООБЩЕHИЯ ОБ ОШИБКАХ

  Для удобства отладки теперь при ошибочных ситуациях происходит
вывод сообщений об ошибках в лог. Отслеживаются ситуации:

	"label '...' not found"	нет метки
	"wrong mask"		неверная маска
	"stack error"		ошибка стека
	"unknown command"	неизвестная команда
	"wrong expression"	неверное выражение (или
				недопустимое в данной команде)

Также  выводится  номер строки, в которой произошла ошибка и имя
файла, если ошибка произошла в подгруженном по файл-метке файле.

Список ошибок среды EMS+BATPROC:

00 - нет ошибок (no errors)
01 - любая ошибка абонента (no disk, disk full, read error,
     line error, dialing fаiled и др.)
03 - ошибка линии (line error)
04 - нажата клавиша BREAK (break pressed)
05 - диск не доступен (no user disk)
06 - диск поврежден (disk error)
09 - переполнение диска (disk full)
12 - нет доступа в раздел (access denied)
15 - каталог поврежден (catalogue damage)
16 - недопустимое распределение памяти (ramtop no good)
17 - памяти не достаточно или некорректное расположение
     (no memory or wrong allocate)
18 - уплотнение в режиме 'снятой трубки' (move in online)
________________________________________________________________


			-	-	-


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



F1    ОПИСАHИЕ РАБОТЫ СЕРВЕРАF0

RABBIT BBS работает в режимах:  23:00-00:00 ПОЧТОВОГО ЧАСА;
				00:00-07:00 В HОЧHОМ РЕЖИМЕ


			ПОЧТОВЫЙ ЧАС

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

  Hазначение дисков:

A: для размещения системных файлов EMS: UserList.S и др.

B: для приема PKT-файлов вида L*.PKT, созданных редактором
   Lara Croft.

C: основной почтовый диск; на нем лежит почта для поинтов в виде
   PKZIP-архивов  с  именами  типа   "MSKddmmN.zip",  где  MSK -
   сокращение  от  имени  или  псевдонима поинта (например MRL -
   Merlin,  SPE  -  Spencer),  dd  -  день,  mm - месяц создания
   пакета,  N  -  номер  пакета  (a,b,c...) за это число. Внутри
   zip-архива  находятся пкт-файлы для поинта. Кроме того, могут
   быть   файлы   так  называемого  "хот-мыла",  то есть  файлы,
   написанные  поинту  RABBIT  BBS или от другого поинта, или от
   человека, регулярно  заходящего на RABBIT BBS. Для того, что-
   бы  письмо  "хот-мыло"  дошло до адресата, необходимо назвать
   его  >1234567,  где  1234567  -  номер телефона адресата, или
   >NAME,  где  NAME  -  имя  абонента,  например  >MERLIN.W или
   >SPENCER.ZIP.  Использование  "хот-мыла"  весьма  удобно  для
   локальной переписки, так как, во-первых, не требует тоссинга,
   а значит быстрее дойдет до адресата, не потеряется и не будет
   перегружать тоссер  на узле, а во-вторых, таким образом можно
   передавать  не  только  текст, но и любые другие файлы. Кроме
   того, на  станции  могут  помещаться  файлы  с именем >ALL*.*
   (циркуляры). Для автоматизации обмена файлами для этих файлов
   приняты  следующие  соглашения:  файлы  с именем >ALL.* могут
   писать  или  сисоп  станции или "пришлые люди"; поинты в трех
   последних  символах имени файла указывают свою маску, то есть
   они  используют  имена  файлов  >ALL?MSK.*,  это нужно роботу
   поинта,  который  теперь  сможет отличать "свои" циркуляры от
   "чужих",  и сможет  самостоятельно решить, надо ли отправлять
   данный  файл  на BBS и стирать его у себя и надо ли скачивать
   этот файл с BBS (то есть свои циркуляры обратно не качаются).

D: используется при переполнении диска C:. Обычно такая ситуация
   возникает, если какой либо поинт  несколько дней  не  забирал
   почту.   Тогда   старая  почта  этого  поинта  переписывается
   на диск D:, а на диск C: помещается файл с именем MSKpostD. ,
   информирующий о том, что поинту  MSK имеет смысл заглянуть на
   диск D:, там для него что-то приготовлено.


			  HОЧHОЙ РЕЖИМ

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

A: свежие  газеты и эхи  в  текстовом  виде  для  пользователей,
   не имеющих адресов в ZXNet.

B: содержит каталог программ архива станции, каталог Московской
   коллекции рефератов и служит для принятия файлов от юзеров.

C: почта для поинтов, как и в почтовый час

D: разное: новые игры, системы, демки, тексты и пр.


  Робот  отличает  ночной  режим  от  почтового часа по каталогу
диска  B:.  В  ночном  режиме  на  диске  B:  присутствует рамка
оформления  станции  с  ее названием. Поэтому если в каталоге B:
присутствует  файл  ?RABBIT?. ,  то робот  считает,  что станция
работает в ночном режиме.

  В ночном режиме или почтовом часе  RABBIT BBS  может находится
в парольном режиме EMS.

  Парольный режим введен для обеспечения безопасности переписки:
в  открытом  режиме  вполне возможно забрать чужую почту, что не
так  страшно  ( хотя  и  неприятно ),  как  опасно,  ведь  утром
происходит автоматическое удаление  всех  файлов, имена  которых
будут найдены в логе  (при передаче файлов имена всех принятых /
переданных файлов пишутся в лог).
  В парольном режиме  EMS сервер переходит в режим BBS ON, и вся
почта  для поинтов прячется в их почтовые ящики (только на диске
C:), поэтому в ночном парольном режиме обычный юзер не увидит на
диске  C:  ничего;  почта  доступна  только  после ввода пароля,
причем  для  каждого поинта он, естественно, свой. Все остальные
файлы  видны  как  обычно,  то  есть  не надо каждый раз вводить
пароль, если  позвонил  не  за  личной  почтой.  Робот различает
парольный и открытый режим по наличию файла mode off  в каталоге
диска  C:.  Он  есть там всегда, однако при включении парольного
режима он автоматически прячется и делается недоступным.

  В парольном режиме  "хот-мыло" закачивается непосредственно на
диск  C:, оно сразу попадает в ящик адресата  и  становится  ему
доступно; "хот-мыло", закачанное на диск B:,  перекочует на диск
C: только на следующий день, когда сисоп перепишет его вручную.

  Для  поддержки  парольного  режима в DIAMOND group Александром
Елисеевым/CDS  разработан  оверлей  MAILTOSS.O, который проводит
автоматический тоссинг после каждого сеанса  связи  и  автомати-
чески стирает на BBS файлы, забранные из почтовых ящиков.
;Robot v5.50 for Batproc v1.00
;07.11.2000  (c)Diamond group

;ОГРАHИЧЕHИЯ:
; максимальая длина bat файла 8788 bytes (34 sectors)
; для работы этого примера, уберите лишние коменатарии

;Действующий пример bat файла:
; Пользователь: Goljakov Evgeny aka Spencer Winset
; Личный пароль: Goljakov;123
; Почтовая маска: SPE*.*
; Маски хот-мыла: >SPENCER.*
		  >1595023.*
; Личный циркуляр: >ALL?SPE.*


;***БЛОК ИHСТАЛЛЯЦИИ***

:begin
:@autorun clearlog ;событие автозапуска
	let .17=5  ;дозвонов на bbs (=.17*EMS 'redial attempts')
	let .11=5  ;перезвонов на bbs (при срыве связи)
	let .15=2  ;начальная скорость коннекта (2=2400 1=1800)
	let .18=5  ;ошибок до понижения скорости
	let .16=10 ;попыток ввода пароля
	let .14=30 ;пауза между вводом пароля и проверкой ответа
	let .20=12 ;пауза между двумя командами transmit подряд
	let .6=0   ;flag 1=произошeл перезвон из-за ошибок
	let .10=0  ;flag 1=ночной режим / 0=почтовый час
	let .12=0  ;flag 1=post D (в почт. час на D есть почта)
	let .13=0  ;flag 1=overfull C (диск C переполнился)
	let .19=0  ;flag 1=каталог уже помещен в лог
	let .5=.15
	let .7=.18
	setspd .5		;устанавливаем скорость коннекта


;***БЛОК СОЕДИHЕHИЯ С BBS***

	ifonline goto bl_in	;if tube up then skip dialing
:dial_b	call dl_num		;набор номера (dialing) if err-
	ifoffline goto exit_b	;завершение сеанса работы с bbs
	goto blb_l2		;else продолжение работы с bbs
:bl_in	call dl_nm2		;выводим приветствия без набора
				;номера


;***БЛОК РАБОТЫ С BBS ДИСКОМ B:***

:blb_l2	readcat a		;обновляем свой диск A
	onerror call err_sd	;if err вызываем обработчик и
	onerror goto blb_l2	;повторяем операцию еще раз
:blb_l1	rccat b			;берем bbs диск B
	let .6=0		;сброс флага 'был перезвон'
	onerror call err_sb
	onerror goto blb_l1
	markrc ?RABBIT?.
	ifnotmarkedrc goto blb_p2 ;проверяем bbs на почтовый час
				  ;if нет ?RABBIT?, то почт. час
				  ;else bbs в ночном режиме
	markrc ?RABBIT?.
				;^сняли маркировку и установили
	tolog ~___BBS found
	let .10=1	      ;флаг 'ночной режим' (не почт.час)
:blb_p2	if .10=0 goto blb_p3
	if .19=0 cattolog	;сброс каталога bbs в лог и
	let .19=1		;установка соотв. флага
	call $rabbitb
				;^вызов с диска подпрограммы,
				;маркирующей файлы из вчерашнего
				;лога (подготавливается заранее)
	unmarked		  ;снятие маркировки с дупов
	ifnotmarkedrc goto blb_p3 ;if нет, пропуск получения
:blb_l6	rcfiles			  ;else получение файлов bbs
	onerror call err_sb
	if .6~0 goto blb_l1	  ;условие 'был перезвон'
	onerror goto blb_l6
:blb_p3	marktr L*.PKT
				  ;^марк на отправку pkt файлы
	ifnotmarkedtr goto blb_p1 ;if нет, пропуск отправки
:blb_l3	trfiles			  ;else отправка pkt ответов
	onerror call err_sb
	if .6~0 goto blb_l1
	onerror goto blb_l3
	marktr L*.PKT
	ifmarkedtr tolog ~___erase sent files
	marktr L*.PKT
:blb_p1	marktr EMSlog*.C
	marktr SPE*
	marktr *.Ckt
	marktr *.0kt
	marktr *.1kt
	ifmarkedtr tolog ~___erase old files
	marktr L*.PKT
	erase			;удаляем старые/отосланные файлы
:blb_p4	call maskrc		;блок маркировки на получение
	ifnotmarkedrc goto bl_c ;if нет, переходим к диску C
:blb_l4	rccat b			;берем bbs диск B (+/-изменения)
	let .6=0
 	onerror call err_sb
	onerror goto blb_l4
	call maskrc		;блок маркировки на получение
:blb_l7	rcfiles			;получение
	onerror call err_sb
	if .6~0 goto blb_l4	;условие 'был перезвон'
	onerror goto blb_l7



;***БЛОК РАБОТЫ С BBS ДИСКОМ C:***

:bl_c	let .19=0	;сброс флага 'каталог был сброшен в лог'
:blc_l1	rccat c		;берем bbs диск C
	let .6=0		  ;сброс флага 'был перезвон'
	onerror call err_sb
	onerror goto blc_l1
	if .10=0 goto blo_c	;if почтовый час, то переход
	if .19=0 cattolog	;сброс каталога bbs в лог и
	let .19=1		;установка соотв. флага
	call $rabbitc
				;^вызов с диска подпрограммы,
				;маркирующей файлы
	unmarked		 ;снятие маркировки с дупов
	ifnotmarkedrc goto blo_c ;if нет, пропускаем получение
:blc_l2	rcfiles			 ;else получение файлов bbs
	onerror call err_sb
	if .6~0 goto blc_l1	 ;условие 'был перезвон'
	onerror goto blc_l2

:blo_c	markrc SPEpostD
	ifmarkedrc let .12=1	;if марк., в почт.час на D почта
	call maskrc		  ;блок маркировки на получение
	ifnotmarkedrc goto blc_p1 ;if нет, пропускаем плучение
:blc_l3	rcfiles			  ;получение
	onerror call err_sb
	if .6~0 goto blc_l1	  ;условие 'был перезвон'
	onerror goto blc_l3
:blc_p1	markrc mode off.
				;^проверка наличия парольного
				;режима на bbs
	ifmarkedrc goto blc_p5	;if файл есть, парольый режим
				;не найден, пропуск работы с
				;парольным режимом
:blc_p2 call blk_ps		;else ввод личного пароля
	onerror goto blc_p5	  ;пропуск при ошибках
	call blk_pt		;вход в личный почтовый ящик
	onerror goto blc_p5	  ;пропуск при ошибках
:blc_l4	rccat c			;берем каталог почтового ящика
	let .6=0		 ;сброс флага 'был перезвон'
	onerror call err_sb
	if .6~0 goto blc_p2	  ;условие 'был перезвон'
	onerror goto blc_l4
	markrc SPEpostD
	ifmarkedrc let .12=1	;if марк, в почт. час на D почта
	markrc
				  ;^марк всего в почтовом ящике
	ifnotmarkedrc goto blc_en ;if нет, пропуск получения
	markrc *.zip
	markrc *.zip
				;^две марк. подряд поставят zip
				;последними в очередь на скачку
:blc_l5	rcfiles			;получение
	onerror call err_sb
	if .6~0 goto blc_p2	;условие 'был перезвон'
	onerror goto blc_l4
:blc_en	call blk_po		;возврат в открытый режим
:blc_l9	rccat c			;берем bbs каталог C
	onerror call err_sb
	let .6=0		;сброс флага 'был перезвон'
	onerror goto blc_l9
:blc_p5 markrc mode off. 	;^проверка наличия парольного
				;режима на bbs
	call masktr		;блок маркировки на передачу
	ifnotmarkedtr goto bl_d ;if нет, пропуск передачи
	tolog ~___send hot mail
	ifnotspacetr let .13=1  ;контроль переполнения диска C
:blc_l6	trfiles			;передача
	onerror call err_sb
	if .6~0 goto blc_l9	;условие 'был перезвон'
	onerror goto blc_l6
	if .13~2 goto blc_p6   ;if нет переполнения, нет докачки
				;else былo переполнение диска C
				 ;и соотв. дисковая ошибка bbs
	let .13=0		;сброс режима переполнения
:blc_l7	rccat b			;берем bbs диск B
	let .6=0		;сброс флага 'был перезвон'
	onerror call err_sb
	onerror goto blc_l7
:blc_l8	trfiles			;докачка файлов, не влезших на C
				;(на них осталась маркировка)
	onerror call err_sb
	if .6~0 goto blc_l7	;условие 'был перезвон'
	onerror goto blc_l8

;--удаление отосланных файлов--
:blc_p6	call masktr		;вызов блока марлировок
	ifmarkedtr tolog ~___erase sent hot mail
	erase			;удаление
:bl_d	let .19=0	;сброс флага 'каталог был сброшен в лог'
	if .12~0 goto bld_l1	;if почт.час и на D есть почта,
				;переход на работу с диском D
	if .10=0 goto exit_b	;if почт. час, то выход, т.к
				;остальные диски пусты для меня



;***БЛОК РАБОТЫ С BBS ДИСКОМ D:***

:bld_l1	rccat d			;берем bbs диск D
	let .6=0		;сброс флага 'был перезвон'
	onerror call err_sb
	onerror goto bld_l1
	call maskrc		  ;блок маркировки на получение
	ifnotmarkedrc goto bld_p1 ;if нет, то пропуск получения
:bld_l2	rcfiles			  ;получеие
	onerror call err_sb
	if .6~0 goto bld_l1	;условие 'был перезвон'
	onerror goto bld_l2
:bld_p1	if .10=0 goto exit_b	;if почт. час, то выход, т.к
				;остальные диски пусты для меня
	if .19=0 cattolog	;сброс каталога bbs в лог и
	let .19=1		;установка соотв. флага
	call $rabbitd
				;^вызов с диска подпрограммы,
				;маркирующей файлы
	unmarked		;снятие маркировки с дупов
	ifnotmarkedrc goto bl_a ;if нет, пропускаем получение
:bld_l4	rcfiles			;получение
	onerror call err_sb
	if .6~0 goto bld_l1	;условие 'был перезвон'
	onerror goto bld_l4



;***БЛОК РАБОТЫ С BBS ДИСКОМ A:***

:bl_a	let .19=0	;сброс флага 'каталог был сброшен в лог'
:bla_l1	rccat a			;берем bbs диск A
	let .6=0		;сброс флага 'был перезвон'
	onerror call err_sb
	onerror goto bla_l1
	if .19=0 cattolog	;сброс каталога bbs в лог и
	let .19=1		;установка соотв. флага
	call $rabbita
				;^вызов с диска подпрограммы,
				;маркирующей файлы
	unmarked		 ;снятие маркировки с дупов
	ifnotmarkedrc goto exit_b ;if нет, пропускаем получение
:bla_l2	rcfiles			  ;получение
	onerror call err_sb
	if .6~0 goto bla_l1	;условие 'был перезвон'
	onerror goto bla_l2
	goto exit_b		;завершение сеанса работы с bbs




;***БЛОК ПОДПРОГРАММ***

;--ОБРАБОТКА ОШИБОК--
:err_sd tolog ~~___ERROR!!! (ERR=`.0`)-
	onerror 4 tolog break pressed
	onerror 5 tolog no your disk
	onerror 6 tolog your disk error
	let .7 =.7-1		;уменьшение счетчика ошибок
	if .7=0 goto exit_b	;if исчерпан, завршение сеанса
	return

:err_sb	onerror 4 let .7=1   ;ошибка 'break pressed' приоритетна
	let .7=.7-1	     ;для др. ошибок действует счетчик

	tolog ~error `.0` try left `.7`
	if .7~0 return		;if .7<>0, очередная попытка
				;else лимит ошибок исчерпан
	onerror 5 goto err_de	;5,6 дисковые ошибки,не допуска-
	onerror 6 goto err_de	;ющие дальнейшей обработки задач
	if .13~0 onerror 1 goto err_p1	;if переполнение диска C
					;and дисковая ошибка bbs
					;установка флага докачки
	if .5=0 goto redial	;если скорость понижена до min.,
				;то рассоединение и перезвон
	let .5=.5-1		;else понижаем скорость
	transmit ~fatal error `.0`~set speed
				;^сообщается новая скорость
	wait .20		;пауза для надежности передачи
	if .5=1 transmit 1800
	if .5=0 transmit 600
	wait .20
	transmit bps~
	let .7=.18	;установка нового лимита ошибок
	setspd .5	;установка пониженной скорости
	return
:err_p1	let .13=2	;фактическоe переполнениe диска C работа
	return		;с ним будет прекращена
:err_de	transmit ~___yor disk error, stop programm~


;--ВЫХОД ИЗ EMS--
:exit_b	transmit ~___Bue!~
	offline		;^сигнал дисконнект и <рассоединение
	savelog			;сохранение лога в файл
	onerror =0		  ;обнуление ошибок


;--логический блок запуска программ--
;--по результатам полученых файлов--
	marktr *.zip
	ifmarkedtr runbasic PK*
				 ;^if есть zip'ы, зпускаем UNZIP
	onerror 0 runbasic LARA*
	clearlog		 ;^else запускаем LARA
	tolog ~___basic files not found
	savelog			 ;а если не смогли их запустить,
				 ;сгружаем аварийный лог
	runbasic boot
				;^запускаем boot
	stop			;если и boot не смогли запустить
				;останавливаем работу BAT файла
				;возвращаемся в EMS


;--ДОЗВОH/ПЕРЕЗВОH HА BBS--
:redial	let .11=.11-1		;уменьшение счетчика перезвонов
	let .6=1		 ;был перезвон
	transmit ~___Bad connect.
	if .11=0 goto exit_b	;if счетчик исчерпан, то выход
	transmit Redial.~
	tolog ~redial left `.11`
	offline		;^^сигнал дисконнект и <рассоединение
	let .5=.15	;начальные параметры сеанса
	let .7=.18	;и лимита ошибок
	setspd .5	  ;установка начальной скорости
:dl_num	tolog ~___dialing
:loopd	dial 462-89-02
				;^номер bbs
	onerror 0 goto dl_nm2
	tolog ~___error dialing. Try left `.17`
	let .17=.17-1		;уменьшение счетчика дозвонов
	if .17~0 goto loopd	;if лимит не исчерпан, повтор
	goto exit_b		;else завершение сеанса работы
:dl_nm2	transmit ~Robot v5.50 for BatProc v1.00
	transmit ~Приветствую Вас Владимир! Это робот Spencer'а
	if .6~0 onerror =1	;if был перезвон, установить err
	return


;--БЛОК МАРКИРОВОК HА ПРИЕМ--
;сперва маркируем почту, потом хот-мыло, потом циркуляры,
;потом маркируем (снимаем маркировку) свои циркуляры, чтобы
;не скачивать в bbs свои сообщения

:maskrc	markrc SPE*
	markrc >1595023
	markrc >SPENCER
	markrc >ALL*
	markrc >All*
	markrc >all*
	markrc >ALL?SPE
	markrc >All?SPE
	markrc >all?SPE
	unmarked		;снятие маркировки с дупов
	return

;--БЛОК МАРКИРОВОК HА ПЕРЕДАЧУ--
;сначала маркируются все хот-мыло, затем снимается с хот-мыла
;полученного мной, затем снимается с циркуляров, и возвращается
;на написанные мной циркуляры

:masktr	marktr >*
	marktr >1595023
	marktr >SPENCER
	marktr >ALL*
	marktr >All*
	marktr >all*
	marktr >ALL?SPE
	marktr >All?SPE
	marktr >all?SPE
	return


;--ВВОД ПАРОЛЯ--
:blk_ps	let .9=.16		;установка попыток ввода пароля
	let .8=.16
:blkpsl	transmit ~.log Goljakov;123~
	wait .14		;^сам пароль
	sendcommand
			;'пустой' sendcommand для разделения во
			;времени ввода пароля и получения ответа
			;(пауза подобрана эксперименатально, при
			;этом кол-во отказов сократилось втрое).

	onerror 12 goto nobbs1	;пришел ответ 'Access denied'
	onerror goto nobbs2	;ответа не пришло
	return
:nobbs1	let .9=.9-1	   ;уменьшаем счетчик по 'Access denied'
	if .9~0 goto blkpsl  ;ичередная попытка ввода пароля
	goto no_bbs	     ;пароль не принят
:nobbs2	let .8=.8-1	     ;уменьшаем счетчик по 'нет oтвета'
	if .8~0 goto blkpsl
:no_bbs	if .8=0 transmit ~ERROR!~BBS mode not found!~
	if .9=0 transmit ~ERROR!~my password not found!~
	return


;--ОТКРЫТИЕ ПОЧТОВОГО ЯЩИКА--
:blk_pt	let .8=.16		;установка попыток ввода команды
	let .9=.16
:blkpt	sendcommand ~.con post|Post area opened
	onerror 12 goto nopst1
	onerror goto nopst2
	return
:nopst1	let .9=.9-1
	if .9~0 goto blk_pt
	goto no_pst
:nopst2	let .8=.8-1
	if .8~0 goto blk_pt
:no_pst	if .8=0 transmit ~___ERROR!~___BBS mode not found!~
	if .9=0 transmit ~___ERROR!~___my postbox not found!~
	return


;--ВОЗВРАТ В ОТКРЫТЫЙ РЕЖИМ--
:blk_po	let .8=.16		;установка попыток ввода команды
	let .9=.16
:blkpo	sendcommand ~.con|Area opened
	onerror 12 goto nopo1
	onerror goto nopo2
	return
:nopo1	let .9=.9-1
	if .9~0 goto blk_po
	goto no_poe
:nopo2	let .8=.8-1
	if .8~0 goto blk_po
:no_poe	transmit ~~can't exit out of postbox
	return

			  ЗАКЛЮЧЕHИЕ

  В заключение  автор и весь  коллектив  Diamond group, выражает
особую  признательность  нашим  друзьям  и  коллегам,  за помощь
в создании и тестировании этой програмы:

Виктор Кузьмин /KVA		Владимир Булчукей /Wlodek Black
Михаил Терентьев /Messir	Александр Кушников /Sander
Павел ????????? /KPN		Александр Майоров /Mas
Арсений Астапенко /Ars		Илья Иванов /ZX-Shadow
Илья Абросимов /EA		 ...и тем, кто верил в нас.

    Евгений Голяков - Spencer/Winset. Последние штрихи перед
    сдачей  материала  в  печать.  За "Pentagon"-ом Wlodek-а
    у Wlodek-а дома.


  В дальнейшем мы планируем выпуск следующих версий BATPROC, без
потери  совместимости  с  версиями  не  ниже 1.00. Будут введены
двухбайтные  переменные, списки стрингов и возможность подставки
любого  из  них  как  аргумент в командах вывода стрингов. Кроме
того планируется написание аналогичного оверлея к программам EWS
и/или  REAL  COMMANDER  2.00  для автоматизации работы с файлами
(копирование,  уплотнение,  перенос на TRD-образы на винчестер и
т. д.)

  Hадеемся, что продукт найдет свое применение в комуникационных
системах сети ZX-Net, использующих технологию EMS.

























  Снимок на память: слева - Spencer/Winset, в центре - Дмитрий
  Hесмачный/Merlin, справа Wlodek Black.


  Ваши предложения, критику, комментарии можете присылать на:

ZXNet:
500:95/462.9 Dmitriy Nesmachny	aka Merlin/DMD
500:95/462.8 Evgeny Goljakov	ака Spencer Winset/DMD

Fidonet
2:5020/2065.609 Dmitriy Nesmachny  aka Merlin/DMD
2:5020/2065.608 Evgeny Goljakov	   ака Spencer Winset/DMD
2:5020/3434.16  Artem Belozerov	   aka Real Heysten/DMD

e-mail
wlblack@newmail.ru		subj: BATPROC v1.00
wlblack@chat.ru
belozerow@mail.ru
kva@cosmigo.com


		   (c) Diamond group. Russia, Moscow, 23.10.2000




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Планета Шелезяка - схема FM-тюнера с программным компьютерным управлением.
Ликбез - Аккумуляторы. История, типа преимущества и недостатки.
Железо - блок питания IBM PC на службе ZX Spectrum.

В этот день...   17 ноября