Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

Re: Вопросы начинающих PIC ASM

Ср янв 04, 2017 09:18:17

"ПОНЕСЛОСЬ!"
:)))
"великие материи" - а про интерес того Пока_без_кота
(и иных начинающих) саапсем "фигвам"/флудням...
:(




А кто его знает?
Один говорит, что пришел в тему троллить, другой, что развлекается.
В МЯУ перенес.
viewtopic.php?f=17&t=140481
Пусть в МЯУ троллят и развлекаются.
aen

Re: Вопросы начинающих PIC ASM

Ср янв 11, 2017 21:28:49

Доброго времени суток. Делаю таблицу дешифрации для 7-сегментного индикатора (общий анод). Решил сделать расширенный вариант, и кроме цифр 0-9 добавил шестнадцатеричные А-F.
Добавляю в таком виде:
Спойлер
Код:
dt   b'00101000',b'01111110',b'10100100',b'01100100',b'01110010',b'01100001',b'00100001',b'01111100',b'00100000',b'01100000',b'00110000',b'00100011',b'10101001',b'00100110',b'10100001',b'10110001'

Дизассемблер превращает это в:
Спойлер
Код:
   046    3428     RETLW 0x28                     84:       dt   b'00101000',b'01111110',b'10100100',b'01100100',b'01110010',b'01100001',b'00100001',b'01111100',b'00100000',b'01100000',b'00110000',b'00100011',b'10101001',b'00100110',b'10100001',b'10110001'
   047    347E     RETLW 0x7e
   048    34A4     RETLW 0xa4
   049    3464     RETLW 0x64
   04A    3472     RETLW 0x72
   04B    3461     RETLW 0x61
   04C    3421     RETLW 0x21
   04D    347C     RETLW 0x7c
   04E    3420     RETLW 0x20
   04F    3460     RETLW 0x60
   050    3430     RETLW 0x30
   051    3423     RETLW 0x23
   052    34A9     RETLW 0xa9
   053    3426     RETLW 0x26
   054    34A1     RETLW 0xa1
   055    3402     RETLW 0x2

Видно, что последнее, 16 значение, превращено в какой-то бред - RETLW 0x2
Делаю ход конем, выношу это последнее значение отдельным dt:
Спойлер
Код:
   046    3428     RETLW 0x28                     84:       dt   b'00101000',b'01111110',b'10100100',b'01100100',b'01110010',b'01100001',b'00100001',b'01111100',b'00100000',b'01100000',b'00110000',b'00100011',b'10101001',b'00100110',b'10100001'
   047    347E     RETLW 0x7e
   048    34A4     RETLW 0xa4
   049    3464     RETLW 0x64
   04A    3472     RETLW 0x72
   04B    3461     RETLW 0x61
   04C    3421     RETLW 0x21
   04D    347C     RETLW 0x7c
   04E    3420     RETLW 0x20
   04F    3460     RETLW 0x60
   050    3430     RETLW 0x30
   051    3423     RETLW 0x23
   052    34A9     RETLW 0xa9
   053    3426     RETLW 0x26
   054    34A1     RETLW 0xa1
   055    34B1     RETLW 0xb1                     85:       dt   b'10110001'

Вуаля, все как надо :))) Это какое-то ограничение на количество значений в строке после dt ? Есть способ побороть ? Работаю в MPLAB 8.92.

Re: Вопросы начинающих PIC ASM

Ср янв 11, 2017 22:20:46

У меня Х из последних версий. Завел в него вашу строку целиком и получил предупреждение
Warning[209] bla-bla-bla 665 : Missing quote

При этом 15-й байт был испорчен (0хА вместо 0хА1), а 16-й отсутствовал вообще.

После этого разделил строку пополам, по 8 байт в каждой: в результате все прошло чисто.
Причину не знаю.

Отсюда вопрос: для чего вам нужна длинная строка? Чем привлекла?

Re: Вопросы начинающих PIC ASM

Ср янв 11, 2017 22:55:39

Zhuk72 писал(а):... для чего вам нужна длинная строка? Чем привлекла?

Да ничем особо. Просто ассемблерный код в сравнении с Сишным, при одинаковом объеме полезной продуктивности, априори более растянут по вертикали. Чтобы меньше скролить экран, стараюсь минимизировать "высоту" кода, упаковывая все в макросы и подпрограммы, распихать их по подключаемым файлам, и заиметь компактный файл главного цикла в котором четко видно общий алгоритм работы программы. Поэтому же вместо кучи строчек с RETLW всегда использовал 1 строчку c dt. А тут оказывается есть какие-то ограничения)) Погуглил по форумам, оказывается в первых версиях MPLAB X вообще нельзя было больше 1 значения в строке. Вот и переходи после этого на "новейшие" ИДЕ :)))

Re: Вопросы начинающих PIC ASM

Чт янв 12, 2017 04:26:24

Раз Вам так нравится MPLAB X, предлагаю Вам для просмотра длинного АСМ кода ДВА инструмента.
1. Открывание двух окон (вертикальных) с одинаковым открываемым файлом. Это позволяет смотреть два участка одного текста независимо и параллельно.
2. "Коллапсирование" участков кода (обычно подпрограмм или однотипной их группы). Это делается набором в начале строки текста fcom;<tab>. Сразу после нажатия на табуляцию будет сгенерированы теги "коллапсайдера". Дефолтное имя Вы исправляете на имя сворачиваемого участка, а сам сворачиваемый текст помещаете между тегами открытия и закрытия "коллапсайдера".
Текст становится очень коротким, свернутые участки Вы легко открываете по мере необходимости.

Re: Вопросы начинающих PIC ASM

Чт янв 12, 2017 06:01:31

КРАМ писал(а):Раз Вам так нравится MPLAB X...

У него 8.92

КРАМ писал(а):Это делается набором в начале строки текста fcom;<tab>...

А вот это сюрприз. Я думал, что коллапсирование работает только в сишных исходниках, в асм тексты я не нашел этого в контекстном меню. Оказываются они таким вот хитрым образом закручиваются. Спасибо! Хотя для меня уже неактуально :)

Re: Вопросы начинающих PIC ASM

Чт янв 12, 2017 06:12:48

There is a source file line limit (expanded) of 200 characters.

Re: Вопросы начинающих PIC ASM

Чт янв 12, 2017 08:21:39

botchin писал(а):..200 characters.

Спасибо, переделал в шестнадцатиричную, и все поместилось с запасом, одной строкой.
Последний раз редактировалось Пока_без_кота Чт янв 12, 2017 09:35:35, всего редактировалось 1 раз.

Re: Вопросы начинающих PIC ASM

Чт янв 12, 2017 08:42:39

Обычно в одной строке больше чем позволяют ограничители страницы буковок не ставлю...
Правда исходники набираю в DPAD - текстовки универсальны для компиляторов любых семейств
(mcs51, pic10/12/16/18, avr, i8080, z80). А уж затем использую в проектах.
Жаль, что на сегодня сайт с проектом того редактора закрыт...
:cry:

Re: Вопросы начинающих PIC ASM

Ср янв 25, 2017 18:07:49

Приветствую, где можно набрать простых примеров на asm, типа сложения/вычитания/деления/умножения 8/16 битных чисел, циклы, BCD и семисегментники, прерывания т.п. Нужны простые, лаконичные примеры(лучше с комментариями) для самообучения :solder:

Re: Вопросы начинающих PIC ASM

Ср янв 25, 2017 18:35:50

http://www.piclist.com/techref/microchip/routines.htm

Re: Вопросы начинающих PIC ASM

Пн фев 06, 2017 20:42:24

Доброго времени суток. Возможно ли каким-то образом передать в качестве параметра макроса адрес таблицы ?
Есть код следующего вида:
Спойлер
Код:
Menu_1_routine
   clrf   symbol_pointer
String_1
   movfw   symbol_pointer         
   call   Table_Menu_1   
   andlw   0FFh
   btfsc   STATUS,Z
   goto    Out_1
   call    Send_LCD_Symbol
   incf   symbol_pointer   
   goto    String_1
Out_1
   return


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

Re: Вопросы начинающих PIC ASM

Пн фев 06, 2017 21:30:03

Судя по вашим последним постам, вам уже тесно в рамках ассемблера :)
Переходите на Си.

Re: Вопросы начинающих PIC ASM

Пн фев 06, 2017 22:13:47

Пока_без_кота писал(а):Возможно ли каким-то образом передать в качестве параметра макроса адрес таблицы ?
А зачем передавать адрес, если можно передавать просто имя (хотя, по большому счёту, имя - это и есть адрес) , которое он будет заменять в тексте ?
Код:
my_macro   MACRO   table_name     ; Вроде так макросы создаются, не помню уже...
  clrf   table_name
  ..........
  ..........
ENDM


my_macro  symbol_pointer   ; Вызов макроса


Да и не выиграете Вы ничего макросом, ни в объёме кода, ни в быстродействии. Вот если функцию создадите, то уже будет выигрыш по коду. Там уже придётся передавать адрес, и через косвенную его обрабатывать.

Re: Вопросы начинающих PIC ASM

Пн фев 06, 2017 22:30:13

Пока_без_кота, лень читать все ваши посты что бы узнать под какой PIC вы пишите программу.
Для PIC18 (8bit):
Спойлер
Код:
CODEPAGE_5x8
   dw   (Let_00)
   dw   (Let_01)
   dw   (Let_02)
   dw   (Let_03)


Let_00   db   3E,41,00,00,00,3E,04,08,04,3E,00,00,00,41,3E,00         ; MONO
Let_01   db   3E,7F,5B,55,55,55,6D,7F,7D,7D,41,7D,7D,7F,3E,00         ; STEREO
Let_02   db   1C,14,1C,22,7F,00,00,00,00,22,14,08,14,22,00,00         ; MUTE
Let_03   db   1C,1C,7F,41,41,41,41,41,41,41,41,41,41,41,41,7F         ; BATT
Для PIC24 (16bit) (ASM30) /не самый лучший вариант/:
Спойлер
Код:
CODEPAGE_5x8:
   .pword   paddr(Let_00)
   .pword   paddr(Let_01)
   .pword   paddr(Let_02)
   .pword   paddr(Let_03)


Let_00: .byte 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00
Let_01: .byte 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00
Let_02: .byte 0x42, 0x61, 0x51, 0x49, 0x46, 0x00
Let_03: .byte 0x21, 0x41, 0x45, 0x4B, 0x31, 0x00
Реальный адрес начала блока данных Let_XX получите при чтении данных по базовому адресу CODEPAGE_5x8 (адрес метки) + смещение по числу (строке) нужного блока данных.

Re: Вопросы начинающих PIC ASM

Вт фев 07, 2017 07:08:19

Пока_без_кота писал(а):Доброго времени суток. Возможно ли каким-то образом передать в качестве параметра макроса адрес таблицы ?
...
И таких выводов значений из таблиц есть много, и все они отличаются лишь содержимым таблицы. Или я хочу невозможного ?


Векторный переход по смещению и базовому адресу?
8)
У стандартных среднемладших для подобных фокусов используются команды, модифицирующие PCL .
Только надо при том помнить про содержимое pclath и про то, что перенос при переполнении PCL в результате операций с ним автоматически не распространяется на pclath - воть тута надо макрос шкарябать (как и для временного хранения исходного значения pclath).
У "улучшенных" среднемладших и 18-й несколько получше "фокусы" получаются.
:beer:

Re: Вопросы начинающих PIC ASM

Вт фев 07, 2017 09:33:16

Всем доброго времени суток. Спасибо, даже не ожидал такого внимания к моему вопросу. Отвечаю всем по порядку.
2 Zhuk72
Си уже по чуть-чуть начал учить, просто уже сделал проект простой древовидной менюшки на ассемблере, и хотел его "причесать", потому что в бессмертный PIC16F84 (1к слов) еле влезла менюшка 5 пунктов меню по 3 подпункта в каждом пункте (вместе с выводом на ЖК дисплей названий всех пунктов и подпунктов).

2 Аlex
Насчет использования макроса и пользе функции. Я понимаю что макрос не даст мне выиграша ни в чем, кроме общего восприятия кода в месте использования макроса. Я и хочу его использовать лишь для передачи внутрь процедуры адреса таблица в качестве параметра. Проблема в том что я не знаю, как передать АДРЕС ТАБЛИЦЫ в качестве параметра внутрь процедуры.

2 Albert_V
Все гораздо запущенее, я пишу для 12/16 Пиков :))) Но за примеры спасибо, утянул себе в примеры, на будущее.

2 BOB51
Нет, это уже есть реализовано, надо именно предать внутрь процедуры АДРЕС ТАБЛИЦЫ. Передать 8-битный указатель проблемы нет. А а вот адрес таблицы не умею :dont_know:

П.С. Кажется до меня дошло, как реализовать задуманное, я просто подходил не с той стороны, позже отпишусь...

П.П.С. Спасибо всем, у меню получилось реализовать задуманное. Менюшка похудела до 740 слов при том же функционале.

Спойлер
Код:
   include   MicroMenu_Lib.h
   include   HD44780_Lib.h

MicroMenu_Lib_udata   udata_shr
symbol_pointer   res   1

global   symbol_pointer
extern   Send_LCD_Symbol,Send_LCD_Command,Delay_4ms,Debounce_Delay
;===========================
MicroMenu      code   0x100-4A
;===========================
Kursor
   movlw   b'10001111'                  ; Установим курсор на последний символ 1 строки
   call   Send_LCD_Command
   movlw   '<'                        ; И нарисуем там указатель текущего пункта меню
   call   Send_LCD_Symbol
   movlw   SECOND_LINE                  ; Переводим указатель на вторую строку   
   call   Send_LCD_Command
   return                           ; И приступаем к отрисовке следующего пункта меню
;===========================
Num_of_Submenu_Table                  ; Возвращаем количество пунктов нужного подменю, следить, чтобы все элементы данной таблицы находились на одной странице
   movfw   index_menu
   clrf   PCLATH
;   bsf      PCLATH,0                  ; Если таблица размещена до адреса 0x0FF, закоментировать
   addwf   PCL
   retlw_num_of_submenu_punkts
;===========================
Switch_Menu
   call   Debounce_Delay
   movlw   CLR_DISP
   call   Send_LCD_Command
   call   Delay_4ms                  ; Обязательная задержка после очистки дисплея !!!
   call   Switch_Menu_routine            ; Рисуем текущий пункт меню
   call   Kursor                     ; Нарисуем признак текущего пункта меню
   incf   index_menu                  ; Берем следующий пункт
   movfw   index_menu   
   sublw   NUM_OF_MAIN_MENU_PUNKTS         ; Сравниваем с количеством пунктов меню
   btfsc   STATUS,Z
   goto   Correct_index_menu         
   call   Switch_Menu_routine
   decf   index_menu                  ; Не забудем вернуть назад текущий пункт меню   
   return
Correct_index_menu                     ; Достигли последнего пункта меню, следующим отображаем 1 пункт
   clrf   index_menu
   call   Switch_Menu_routine
   movlw   NUM_OF_MAIN_MENU_PUNKTS-1
   movwf   index_menu   
   return

Switch_Menu_routine                     ; Подпрограмма вывода названия пункта меню на дисплей
   clrf   symbol_pointer
String
   call   Switch_Menu_Table
   andlw   0FFh
   btfsc   STATUS,Z
   return
   call    Send_LCD_Symbol
   incf   symbol_pointer   
   goto    String
;----------
Switch_Submenu                        ; Поместим курсор на нужный подпункт нужного пункта
   call   Debounce_Delay
   movlw   CLR_DISP
   call   Send_LCD_Command
   call   Delay_4ms                  ; Обязательная задержка после очистки дисплея !!!
   call   Switch_Submenu_routine         ; Рисуем текущий подпункт меню   
   call   Kursor                     ; Нарисуем признак текущего подпункта меню
   incf   index_submenu
   call   Num_of_Submenu_Table         
   subwf   index_submenu,w               ; Сравниваем с количеством подпунктов меню
   btfsc   STATUS,Z
   goto   Correct_index_submenu
   call   Switch_Submenu_routine
   decf   index_submenu               ; Не забудем вернуть назад текущий подпункт меню
   return
Correct_index_submenu                  ; Достигли последнего подпункта меню, следующим отображаем 1 попункт
   clrf   index_submenu   
   call   Switch_Submenu_routine
   call   Num_of_Submenu_Table
   movwf   index_submenu   
   decf   index_submenu

   return   

Switch_Submenu_routine                  ; Подпрограмма вывода названия пункта подменю на дисплей
   clrf   symbol_pointer
String_
   call   Switch_Submenu_Table
   andlw   0FFh
   btfsc   STATUS,Z
   return
   call    Send_LCD_Symbol
   incf   symbol_pointer   
   goto    String_
;===========================
Switch_Menu_Table
   movfw   index_menu
   clrf   PCLATH
   bsf      PCLATH,0
   addwf   PCL                        ; Эта команда должна находится в ячейке с адресом 0x0FF
   goto_Punkt_Menu                     ; Макрос, создает теблицу переходов на пункты меню                     
;----------
Switch_Submenu_Table
   movfw   index_menu
   clrf   PCLATH
   bsf      PCLATH,0
   addwf   PCL
   goto_Menu_X_Table                  ; Макрос, создает переходы на все подпункты меню   
   goto_Punkt_Submenu                  ; Супермакрос, создает цепочку макросов, в количестве пунктов меню
;===========================
Action_Switch                        ; Выполним действие, на котором находится курсор
   call   Debounce_Delay
   movlw   CLR_DISP
   call   Send_LCD_Command
   call   Delay_4ms                  ; Обязательная задержка после очистки дисплея !!!
   movfw   index_menu                  ; Берем выбраный пункт меню
   clrf   PCLATH
   bsf      PCLATH,0
   addwf   PCL                        ; Переходим на нужную ветку
   goto_Menu_X_Table_action            ; Макрос, создает переходы на все подпункты меню
   goto_Punkt_Submenu_action            ; Супермакрос, создает цепочку макросов, в количестве веток выполняемых действий
;===========================
Menu_1
   add_PCL_symbol_pointer_0x100
    dt      "1.Guard On",0

Menu_2
   add_PCL_symbol_pointer_0x100
    dt      "2.Guard Off",0

Menu_3
   add_PCL_symbol_pointer_0x100
    dt      "3.Current Alarm",0

Menu_4
   add_PCL_symbol_pointer_0x100
    dt      "4.Current Malfunction",0

Menu_5
   add_PCL_symbol_pointer_0x100
    dt      "5.Option",0
;===========================
Menu_1_Submenu_1
   add_PCL_symbol_pointer_0x100
    dt      "1.Garage",0

Menu_1_Submenu_2
   add_PCL_symbol_pointer_0x100
    dt      "2.Doors",0

Menu_1_Submenu_3
   add_PCL_symbol_pointer_0x100
    dt      "3.House",0
;----------
Table_Submenu   code   0x200-4

Menu_2_Submenu_1
   add_PCL_symbol_pointer_0x200
    dt      "1.Garage",0

Menu_2_Submenu_2
   add_PCL_symbol_pointer_0x200
    dt      "2.Doors",0

Menu_2_Submenu_3
   add_PCL_symbol_pointer_0x200
    dt      "3.House",0
;----------
Menu_3_Submenu_1
   add_PCL_symbol_pointer_0x200
    dt      "1.Review",0

Menu_3_Submenu_2
   add_PCL_symbol_pointer_0x200
    dt      "2.Shut Off",0


Menu_3_Submenu_3
   add_PCL_symbol_pointer_0x200
    dt      "3.FAQ",0
;----------
Menu_4_Submenu_1
   add_PCL_symbol_pointer_0x200
    dt      "1.Review",0

Menu_4_Submenu_2
   add_PCL_symbol_pointer_0x200
    dt      "2.Shut Off",0

Menu_4_Submenu_3
   add_PCL_symbol_pointer_0x200
    dt      "3.FAQ",0
;----------
Menu_5_Submenu_1
   add_PCL_symbol_pointer_0x200
    dt      "1.Configuration",0

Menu_5_Submenu_2
   add_PCL_symbol_pointer_0x200
    dt      "2.Settings",0

Menu_5_Submenu_3
   add_PCL_symbol_pointer_0x200
    dt      "3.About",0
;===========================
Menu_1_Submenu_1_action               ; Выполняем действие 1 подпункта 1 пункта
   nop
   return
Menu_1_Submenu_2_action               ; Выполняем действие 2 подпункта 1 пункта
   nop
   return
Menu_1_Submenu_3_action               ; Выполняем действие 3 подпункта 1 пункта
   nop
   return
;----------
Menu_2_Submenu_1_action               ; Выполняем действие 1 подпункта 2 пункта
   nop
   return
Menu_2_Submenu_2_action               ; Выполняем действие 2 подпункта 2 пункта
   nop
   return
Menu_2_Submenu_3_action               ; Выполняем действие 3 подпункта 2 пункта
   nop
   return
;----------
Menu_3_Submenu_1_action               ; Выполняем действие 1 подпункта 3 пункта
   nop
   return
Menu_3_Submenu_2_action               ; Выполняем действие 2 подпункта 3 пункта
   nop
   return
Menu_3_Submenu_3_action               ; Выполняем действие 3 подпункта 3 пункта
   nop
   return
;----------
Menu_4_Submenu_1_action               ; Выполняем действие 1 подпункта 4 пункта
   nop
   return
Menu_4_Submenu_2_action               ; Выполняем действие 2 подпункта 4 пункта
   nop
   return
Menu_4_Submenu_3_action               ; Выполняем действие 3 подпункта 4 пункта
   nop
   return                        
;----------
Menu_5_Submenu_1_action               ; Выполняем действие 1 подпункта 5 пункта
   nop
   return
Menu_5_Submenu_2_action               ; Выполняем действие 2 подпункта 5 пункта
   nop
   return
Menu_5_Submenu_3_action               ; Выполняем действие 3 подпункта 5 пункта
   nop
   return            
;===========================
   end

Re: Вопросы начинающих PIC ASM

Пн мар 13, 2017 19:20:38

Доброго времени суток. Я как всегда со своим извечным "А можно ли лучше ?" :)))
Делаю простенький термометр на 12 Пике, со светодиодным индикатором. Решил для лучшего понимания сам написать процедуру перекодировки двоичного числа в двоично-десятичное. Пока только на 2 разряда, температура дома вряд-ли перевалит за сотню)) Все получилось, но интересует, как можно улучшить код.
Спойлер
Код:
Bin_2_BCD_Lite
   movlw   .10                  ; Задаем счетчик десятков
   movwf   counter
   clrf   decades_num            ; Обнуляем количество десятков
   clrf   units_num            ; Обнуляем количество единиц
   movfw   conv_value            ; Заносим проверяемое значение в рабочий регистр
Loop_decades
   movwf   conv_value_temp         ; Сохраняем полученное значение в промежуточную ячейку
   movlw   .10
   subwf   conv_value_temp,w      ; Вычитаем 10, сохраняем в рабочий регистр
   btfss   STATUS,C            ; Если возник флаг займа,
   goto   Decades_End            ; Прекращаем вычитать десятки
   incf   decades_num            ; Иначе увеличиваем количество десятков в проверяемом числе
   decfsz   counter               ; Перебор возможного количества десятков
   goto   Loop_decades         
   clrf   decades_num            ; Обнуляем количество посчитанных десятков, количество единиц и так останется равным 0
   retlw   0                  ; Ошибка, возврат с нулевыми значениями десятков и единиц
Decades_End                     
   movlw   .10                  ; Задаем счетчик единиц
   movwf   counter   
Loop_units
   movlw   .1
   subwf   conv_value_temp      ; Вычитаем 1
   btfss   STATUS,C            ; Если возник флаг займа,
   goto   Units_End            ; Прекращаем вычитать единицы
   incf   units_num            ; Иначе увеличиваем количество единиц в проверяемом числе
   decfsz   counter               ; Перебор возможного количества единиц
   goto   Loop_units   
   clrf   decades_num            ; Обнуляем количество посчитанных десятков
   clrf   units_num            ; Обнуляем количество посчитанных единиц
   retlw   0                  ; Ошибка, возврат с нулевыми значениями десятков и единиц
Units_End
   retlw   1                  ; Возврат с посчитанными значениями десятков и единиц

Re: Вопросы начинающих PIC ASM

Пн мар 13, 2017 20:03:39

incf index,1
movlw 0ah
subwf index,0
btfss STATUS,Z ;--edinici
goto now
clrf index
incf sdvig,1
movlw 0ah
subwf sdvig,0
btfss STATUS,Z ;--desjatki
goto now
goto ind

Re: Вопросы начинающих PIC ASM

Пн мар 13, 2017 21:00:31

AN526 Microchip
И часть оттуда:
Код:
BinBCD  clrf    MSD
   movwf   LSD
gtenth  movlw   .10
   subwf   LSD,W
   BTFSS   STATUS,C
   goto    over
   movwf   LSD
   incf    MSD, F
   goto    gtenth
over    retlw   0
Ответить