┌─────────────────────────────────────────────────────────────────────────────┐
│ C-- for Atmel AT90S Series Microcontrollers  V1.1               28 jun 2004 │
└─────────────────────────────────────────────────────────────────────────────┘

 НАЗНАЧЕНИЕ:  ТРАНСЛЯТОР С ЯЗЫКА C-- ДЛЯ МИКРОКОНТРОЛЛЕРОВ AT90S ФИРМЫ ATMEL


 В поставляемый пакет входят следующие программы:

 программа                        тип входного файла          тип вых-го файла
 c90 - транслятор                 BIN (создан c--.exe)        ROM + SIZ + DAT
 d90 - дизассемблер               ROM (создан c90.com)        SRA
 lt  - преобразователь листинга   LST(c--)+SIZ(c90)+SRA(d90)  LSM
 at  - программатор               ROM (c90.com)               ---

 В директории EXAMPLES находятся примеры программ на C-- для Atmel (*.cmm)
 Для трансляции примеров надо скопировать содержимое директорий EXAMPLES и
 H-- и файлы c90,d90,lt.com в одну директорию и туда же  скопировать c--.exe
 Запуск трансляции: za <имя_примера_без_расширения>

 zr.bat записывает оттранслированные коды в Atmel процессор
 `.bat удаляет лишнии оттранслированные файлы

 В процессе трансляции создаются следующие файлы:

 *.rom - коды, записываемые программатором в Atmel микроконтроллер
 *.lsm - листинг программы Atmel
 *.lst - листинг программы i386
 *.sra - дизассемблированный d90 файл *.rom (нужен для формирования *.lsm)
 *.exa - результат трансляции c--.exe (нужен для формирования *.rom)
 *.siz - файл с длиной команд i386 и Atmel (нужен для формирования *.lsm)
 *.dat - текстовый файл с описанием областей данных в ПЗУ Atmel, он созается
         только если данные были описаны в программе (Var_Direct = 1..7F)
 (последнии 5 файлов - вспомогательные, они нужны только для создания 2х первых)

 В директории EXAM_FIL находится 1 оттранслированный пример (всего 7 файлов)

 В директории H-- находятся файлы описания Atmel процессоров и файл
 доопределения Atmel команд, которых нет в i386 процессоре

 В директории PGM находится программатор at.com (его схема - внутри файла
 at.com, чтобы ее получить надо запустить 'at s').

 Для самой трансляции исходного файла *.cmm с текстом программы необходимы
 только файл c90.com и файл c--.exe версии >= чем 0.239 b7   May 29 2003
 (c--.exe - находится (январь 2004) на сайте c--sphinx.narod.ru)

 Дизассемблер d90.com может использоваться совершенно независимо от C--,
 он имеет формат своего выходного текстового файла: avrasm.exe v1.21

 Для отладки м.б. полезен отладчик AVR Studio фирмы Atmel, для работы с ним
 надо переименовать файл *.lsm (продукт lt.com с ключём C) или *.sra файл
 (продукт d90.com) в *.asm и уже его загружать для отладки в AVR Studio

 ВОЗМОЖНОСТИ: Все, что позволяет C--. Основное преимущество: сочетание
              гибкости ассемблера и ясности C

 ОГРАНИЧЕНИЯ: 1. Можно использовать только те команды Intel 386, которые
                 имеют аналог у Atmel
              2. Переменные можно объявлять только глобальные и только типов
                 byte (без знака) (см. пример a4_ram.cmm) или char (со знаком)
                 Отличие char и byte проявляется только при сравнении (в
                 условном операторе) (см. пример a6_flags.cmm)
              3. Из флагов условий Atmel в условном операторе if (condition)
                 (или в операторе do {} while (condition)) можно использовать
                 (по причине нехватки флагов в c--.exe) только C, Z и N:
                 if( cf )/if( nc ) или $jc/$jnc
                 if( zf )/if( nz ) или $jz/$jnz
                 if( nf )/if( nn ) или $jn/$jnn
                 Использование остальных флагов смотри a6_if.cmm
              4. Условие в условном операторе может быто только:
                 ==, !=, >=, <
                 То есть if( reg1 > reg2 ) использовать нельзя
                 && и || м.б. использованы без ограничений
              5. Регистровую процедуру можно вызывать или без параметров, или
                 с 1-м параметром, или с 2-мя параметрами (см. a5_sr.cmm)
              6. Если в имени процедуры, которая не объявлена как fastcall есть
                 маленькая буква то эту процедуру нельзя вызывать с параметром
                 (Можно использовать это свойство для проверки правильности
                 вызова такой процедуры (т.е. всегда использовать маленькие
                 буквы в имени вызываемой без параметров процедуры))

 ТРЕБОВАНИЯ:  1. В любую программу необходимо включать 2 файла:
                 90s_def.h-- - файл доопределения Atmel команд которых нет в 386
                 90s8535.h-- - файл определения регистров Atmel процессора, он
                               д.б. разным для разных Atmel процессоров
              2. main () д.б. первой подпрограммой в программе или иначе 1-й
                 ПП д.б., например, такая: void JM() inline { $jmp main }

 ПРИМЕЧАНИЯ:  1. В Atmel все переходы одного типа, поэтому при использовании
                 C-- операторов IF или if будет сгенерирован один Atmel код
              2. Тоже для всех других C-- операторов, которые дают разный
                 код 386 в зависимости от регистра их букв, также
                 $jmp short И $jmp near дают один и тот же Atmel код
              3. Из за различия в длине команд 386 и Atmel при использовании
                 конструкции $+число (например $jmp $+2) можно легко допустить
                 ошибку
              4. Если при трансляции c90.com выдает ошибку то скорее всего было
                 нарушено к.л. ограничение. Например при трансляции примера
                 a8_error.cmm возникает ошибка:
                 c90: Unknown i386 code at address [ 0E: 80 35 16 01 00 00 03 ]
                 (где OE: - адрес с ошибкой в коде i386, и далее 7 байт кода)
                 Если не ясно в какой строке исходного файла ошибка, то следует
                 найти в файле a8_error.lst строку с адресом в котором возникла
                 ошибка (в данном случае адрес E, строка номер 10) и в
                 предыдущей строке c:\c--\a8_error.cmm 12: r0 ^= 3;
                 посмотреть номер ошибочной строки исходного файла (в данном
                 случае строка номер 12).
                 Таким образом ошибка - в 12-й строке файла a8_error.cmm
              5. c90 сразу прекращает трансляцию после 1-й найденной ошибки
              6. Регистры i386 используются следующим образом:
                   AL = 1-й параметр при вызове ПП
                   BL = 2-й параметр при вызове ПП
                  EBX = 16-ти битный регистр u (регистровая пара r25:r24 Atmel)
                  ECX = то же для x (r27:r26)
                  EDX = то же для y (r29:r28)
                  ESI = то же для z (r31:r30)
                  EDI = zz    - передача ПП-е адреса в ОЗУ
                  EBP = z_rom - передача ПП-е адреса в ПЗУ
                  ES  = загрузка в/из ОЗУ с постинкрементом
                  FS  = загрузка в/из ОЗУ с предекрементом
                 Использование любого другого регистра вызовет ошибку
                 'c90: Unknown i386 code'
              7. У интерпретатора c90.com есть несколько управляющих переменных,
                 их описание и использование смотри в примере a7_contr.cmm
              8. Размер выходного файла с кодом Atmel неограничен

 НЕДОСТАТКИ:  1. Допустимо не более двух параметров при вызове подпрограммы
              2. Переменные могут быть только типа byte или char

 РЕКОМЕНДАЦИЯ:   Если нет опыта написания программ для Atmel на ассемблере, то
                 лучше не начинать сразу с языка высокого уровня а сначала
                 писать на ассемблере (хотя бы год)

 Для дальнейшего ознакомления надо внимательно просмотреть все примеры *.cmm,
 оттранслировать их и изучить получившийся листинг *.lsm

 a1_flash - Мигать светодиодом, подключенный к порту Atmel
 a2_rs232 - Послать обратно принятый по RS-232 байт
 a3_lcd   - Работа с ЖКИ Powertip PC-1602
 a4_ram   - Работа с ОЗУ/ПЗУ (адресация)
 a5_sr    - Использование процедур (подпрограмм)
 a6_if    - Использование оператора IF и флагов Atmel
 a7_contr - Управляющие переменные C--Atmel
 a8_error - Пример программы с ошибкой
 a9_table - Работа с таблицами данных в ПЗУ
 aa_asm   - Использование ассемблерных команд
 ab_write - Вывод числа на ЖКИ, ПП умножения, работа с NV-RAM
 ac_4k    - Программа размером 4K слов
 ad_word  - Использование 2-х байтных регистров

 C--Atmel написан NN (Санкт-Петербург) в июле 2003 - июне 2004 года и является
 FREEWARE продуктом, но с одним исключением: не применяйте его во зло.
 Для начального ознакомления с вопросом что есть зло и что есть добро можно
 прочитать стихотворение Маяковского 'Что такое хорошо и что такое плохо',
 усвоившим можно порекомендовать почитать Евангелие от Матфея, главы 5-7.

 Трижды (с интервалом в день) подумай о свей ответственности прежде чем
 вздумаешь использовать данный пpогpамматоp пpи pазpаботке или изготовлении
 оpужия любого вида и любых психотpонных пpибоpов и любых устройств которые
 могут причинить вред людям или животным или природе !!!

