┌─────────────────────────────────────────────────────────────────────────────┐
│ C-- for Microchip PIC16 14 bits Microcontrollers  V1.1          28 jun 2004 │
└─────────────────────────────────────────────────────────────────────────────┘

 НАЗНАЧЕНИЕ:  ТРАНСЛЯТОР С ЯЗЫКА C-- ДЛЯ 14-ТИ БИТНЫХ МИКРОКОНТРОЛЛЕРОВ PIC
              ФИРМЫ MICROCHIP

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

 программа                        тип входного файла     тип выходного файла
 c14 - транслятор                 EXE (c--.exe)          ROM + SIZ
 d14 - дизассемблер               ROM (c14.com)          SRC | ASM
 lt  - преобразователь листинга   LST(c--)+SIZ+SRC(d14)  LSM
 p   - программатор               ROM (c14.com)          ---

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

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

 Результом трансляции являются файлы:

 *.rom - коды, записываемые программатором в PIC микроконтроллер
 *.lsm - листинг программы PIC
 *.lst - листинг программы i386
 *.src - дизассемблированный d14 файл *.rom (нужен для формирования *.lsm)
 *.exa - результат трансляции c--.exe (нужен для формирования *.rom)
 *.siz - файл с длиной команд i386 и PIC (нужен для формирования *.lsm)
 (последнии 4 файла - вспомогательные, они нужны только для создания 2х первых)

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

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

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

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

 Дизассемблер d14.com может использоваться совершенно независимо от C--,
 он имеет 2 формата своего выходного текстового файла:
 Microchip PIC mpasm и Parallax Inc. spasm

 Для отладки м.б. полезен отладчик MPLAB фирмы Microchip, для работы с ним
 надо переименовать файл *.lsm (продукт lt.com с ключём C) или *.src файл
 (продукт d14.com) в *.asm и уже его загружать как файл проекта в MPLAB, в
 проекте надо в пункте Select Language Toolsuite надо выбрать Microchip MPASM
 Toolsuite. Дизассемблеру d14 надо обязательно указать ключи dpr

 Также м.б. полезен старый отладчик psim.exe version 2.43 фирмы Parallax
 (Для его работы еще нужен ассемблер spasm.exe version 4.7 тойже фирмы,
 чтобы выходной файл d14 подходил для spasm, надо для d14 указать ключи r и d)

 программа                        тип входного файла     тип выходного файла
 psim     - симулятор             LST(spasm)             ---
 spasm    - ассемблер             SRC                    LST + OBJ
 r2h      - преобразователь       OBJ(spasm)             ROM

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

 ОГРАНИЧЕНИЯ: 1. Можно использовать только те команды Intel 386, которые
                 имеют аналог у PIC, причем используется мнемоники не фирмы
                 MICROCHIP - разработчика PIC микроконтроллеров, а предложенные
                 фирмой Parallax (www.parallaxinc.com) как более 'правильные'
                 (см. пример 05_asm.cmm)
              2. Из регистров 386 можно использовать только AL,
                 он соответствует W регистру PIC. Вместо 'AL' нужно писать
                 'W' или 'w'
              3. Переменные можно объявлять только глобальные и только типа
                 byte и обязательно без присваивания начального значения
                 (т.е. byte tmp=1; - нельзя. Исключение из этого правила см.
                 в примере 07_table.cmm)
              4. Из флагов условий 386 можно использовать только CF и ZF
                 т.е if( cf ) или $jc и т.п.
              5. После вычитания (W-=N; или Var-=N;) нельзя в следующей команде
                 проверять CF (if(cf) XXX;). После вычитания надо вставить $nop
                 Это сделано для правильной работы оператора if( Var >= XXX )
                 (см. пример 04_if.cmm)
              6. Условие в условном операторе может быто только:
                 ==, != - для всех регистров
                 > , <= - для W регистра
                 >=, <  - для остальных регистров (переменные типа byte)
                 То есть if( w < 1 ) и if( reg1 > reg2 ) использовать нельзя
                 (см. пример 04_if.cmm)
              7. Размер выходного файла с кодом PIC ограничен 32K слов
                 (*.rom файл размером 64 KByte) (см. пример 09_32k.cmm)
              8. Регистровую процедуру можно вызывать или без параметров, или
                 с 1-м параметром, и тогда обязательно типа byte
              9. Если в имени процедуры, которая не объявлена как fastcall есть
                 маленькая буква то эту процедуру нельзя вызывать с параметром
                 (Можно использовать это свойство для проверки правильности
                 вызова такой процедуры (т.е. всегда использовать маленькие
                 буквы в имени вызываемой без параметров процедуры))
             10. При использовании директивы C-- asm нельзя внутри блока {}
                 использовать ассемблерную команду PIC setb по причине ее
                 совпадения с командой 386

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

 ПРИМЕЧАНИЯ:  1. В PIC все переходы одного типа, поэтому при использовании
                 C-- операторов IF или if будет сгенерирован один PIC код
              2. Тоже для всех других C-- операторов, которые дают разный
                 код 386 в зависимости от регистра их букв, также
                 $JMP SHORT и $JMP NEAR дают один и тот же PIC код
              3. Из за различия в длине команд 386 и PIC при использовании
                 конструкции $+число (например $jmp $+2) можно легко допустить
                 ошибку
              4. Оператор 'w -= 4' транслируется в PIC команду 'mov w, # 4 - w'
                 также    'w -= var'             в             'mov w, var - w'
                 Это внутреннее свойство PIC процессора.
              5. Команды w=0; и clr w дают разный PIC код
              6. Если при трансляции c14.com выдает ошибку то скорее всего было
                 нарушено к.л. ограничение. Например при трансляции примера
                 10_error.cmm возникает ошибка:
                 c14: Unknown code at 386 address 7:  [ 6A 01 58 E8 00 00 00 ]
                 Если не ясно в какой строке исходного файла ошибка то следует
                 найти в файле 10_error.lst адрес (1-я колонка) в котором
                 возникла ошибка (в данном случае 7) и в предыдущей строке
                 c:\c--\10_error.cmm 9: SR( 1 ); посмотреть номер ошибочной
                 строки исходного файла (в данном случае строка номер 9)
              7. c14 сразу прекращает трансляцию после 1-й найденной ошибки
              8. Если последнии команды программы: goto l1;  al=1;  l1: $ret
                 то при включенной оптимизации происходит ошибка 'c14: Jump
                 outward PIC code'. Это нормально т.к. после замены 2-х послед-
                 них команд на одну команду retw 1 переход происходит за преде-
                 лы PIC кода
              9. Регистры i386 используются следующим образом:
                   AL = W       (регистр PIC)
                   AH = tris_A  (регистр PIC)
                   BH = tris_B  (регистр PIC)
                   CH = tris_C  (регистр PIC)
                   CL = option  (регистр PIC) (см. 05_asm.cmm)
                   AX - Загрузка в W регистр PIC адреса регистра PIC
                   BX - Загрузка в W регистр PIC младшего байта адреса ROM
                   CX - Загрузка в W регистр PIC старшего байта адреса ROM
                  EBX - Загрузка 16-ти бит адреса (см. 13_offse.cmm)
                  ECX - переключение страниц памяти программ (см. 12_page.cmm)

                  EDX - Директива RAM_LIMITS - установить допустимые границы
                        адресов регистров PIC (см. 06_stack.cmm)
                   DH - Директива Optimize - управление оптимизацией c14.com
                        (см. 11_optim.cmm)
                   SI - Директива C14_MODE - изменение режима трансляции:
                        отключение трансляции входных данных в команды PIC,
                        перекодировка кодов русских букв для ЖКИ,
                        включение режима определения пересечения границы 256
                        байт памяти программ PIC
                        (требуется для работы с текстовыми строками,
                        см. 07_table.cmm, 08_recod.cmm, 16_lcd.cmm)
                   DI - Директива REG_FOR_ADDR_HIGH - установить регистр PIC
                        для передачи подпрограммам старшего байта адреса
                        памяти программ (см. 13_offse.cmm)
                        (При выполнении любой директивы не формируется PIC код)

 НЕДОСТАТКИ:  1. Допустимо не более одного параметра при вызове подпрограммы
              2. Переменные могут быть только типа byte
              3. Переключать банки регистров надо вручную
              4. Переключать страницы памяти программ (число в регистре PCLATH)
                 при длине кода > 2K слов надо вручную (см. пример 12_page.cmm)
              5. При записи в регистр PCL (например при работе с таблицами
                 данных retw) также надо вручную переключать страницы памяти
                 программ (число в регистре PCLATH) (см. пример 12_page.cmm)

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

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

 01_led   - Зажечь светодиод, подключенный к B порту PIC
 02_flash - Мигать светодиодом, подключенный к B порту PIC
 03_diff  - Различные команды
 04_if    - Использование оператора IF
 05_asm   - Использование ассемблерных команд
 06_stack - Работа с 'FSR стеком'
 07_table - Работа с таблицами данных retw
 08_recod - Автоматическая перекодировка русских букв для ЖКИ индикатора
 09_32k   - Выходной код 32K слов
 10_error - Программа с ошибкой
 11_optim - Описание типов оптимизации
 12_page  - Переключение страниц памяти программ при вызове подпрограмм
 13_offse - Загрузка адреса программной памяти / регистра
 14_rs232 - Послать обратно принятый по RS-232 байт
 15_adc   - Осциллогpаф (АЦП на COM порт) на pic16f870 (не закончен)
 16_lcd   - Работа с ЖКИ Powertip PC-1602
 17_indik - Программа реально существующего устройства для проверки индикаторов

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

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

