Привет!
Thu Mar 31 2005 09:37, Alexey Boyko wrote to Alexander Golov:
...
AG>>>> И чем же ПИКи такие уродливые?
AB>>> Ты же кидал листинги - абсолютно нечитаемые.
AG>> Отлично читаемые, красивые и приятные в отличие от...
AB> Hе, правда. Если бы 'movwf mem' называлась 'ld mem', а 'movfw mem' AB> называлась 'st mem' мне было бы гораздо понятней.
Вообще-то странно, что сохранение wreg в памяти у тебя ассоциируется с неким ld, а загрузка с st. А если серьёзно, я как-то ещё на заре освоения PIC16 написал в том числе и макросы вроде: STW, LDW#, но в дальнейшей практике их уже не использовал, потому что нужно это только для удовлетворения привычки к предыдущей любимой архитектуре, что со временем проходит.
AB> Мышление у меня было бы "аккумулятороцентричное".
Wreg это не аккумулятор, а лишь вспомогательный регистр. И чисто практически нет никакой нужды в "wreg-центричности" (интересно, а чтобы тебе показалось правильным применительно к dsPIC?).
AB> А то поди на первый взгляд разберись, где wf, а где fw.
Нет с этим никаких проблем, говорю как писавший до PIC'ов в течении 10 лет как раз: LDA, STX, LDY.
AB> Вот что делает эта команда? AB> movf fsr2l,w,c
Это "movfw fsr2l", MPASM даже поддерживает этот синоним для PIC16, для PIC18, правда, необходимо явно объявить макрос.
AB> Даже в ARM-е "mov" - двухоперандный, а тут три.
Тут операнд один, остальное -- флажки.
AB> Если "fsr2l" - какой-то адрес, а про "w" - я уже слышал, то что такое "c"? AB> И что означает "f" в "movf"?
Ты серьёзно собрался обсуждать листинг выданный компилятором как демонстрацию вида исходника на асме данного МК? Для этого компилятора нормально выдать какую-нибудь ерунду вроде:
incf ?a_ADC_Work^(__Lparam& (0+65280)),f decfsz (?a_ADC_Work+1)^(__Lparam& (0+65280)),f goto l26 bsf 3977,0,c ;volatile movlb F1327 shr (0+8) movlw -2 addwf F1327& (0+255),f,b movlb F1328 shr (0+8) incf F1328& (0+255),f,b movlw 3 cpfslt F1328& (0+255),b goto l28 goto l11 l28: bcf _Calibrate_ADC_Fl/(0+8),_Calibrate_ADC_Fl & (0+7),c movlw 4 movff wreg,F1327 btfss _Calibrate_ADC_Fl/(0+8),_Calibrate_ADC_Fl & (0+7),c goto l30
содержащую кучу бестолковых подробностей, константных ссылок и скрупулёзно указывающую все флажки, хотя в реальности этого не требуется. Нормальные программы, написанные на асме руками, выглядят скорее так:
ReadData btfsc TxReadyFl ; = Данные не передаются. return ; ; Найти пролог ReadData0 rcall ReadByte ; Принять байт bc ReadDataE ; = Нет данных ReadData2 xorlw 0x5D ; bnz ReadData0 ; = Не начало пролога rcall ReadByte ; Принять байт bc ReadDataE ; = Нет данных xorlw 0x5D ; bnz ReadData0 ; = Не второй байт пролога ; Принять область данных movlw 17 ; Размер области данных movwf Work0 ; Инициализировать счётчик clrf TxCheck+0 ; Сбросить контрольную сумму clrf TxCheck+1 ; lfsr 2,TxBuffer ; Установить указатель на буфер ReadData1 rcall ReadByte ; Принять байт bc ReadDataE ; = Нет данных movwf postinc2 ; Сохранить байт в буфере addwf TxCheck+0 ; Добавить в контрольную сумму movlw 0 ; Старший байт addwfc TxCheck+1 ; decfsz Work0 ; Перевести счётчик принятых байтов bra ReadData1 ; ... btg LED ; Переключить светодиод bsf TxReadyFl ; Поставить задание на передачу ReadDataE return ; ; ReadByte bsf c ; C=1 btfsc RXE ; = Есть данные return ; ; bcf RD# ; Выставить сигнал RD movfw portb ; Прочитать данные bsf RD# ; Снять сигнал RD bcf c ; C=0 return ;
Александр Голов, Москва, snipped-for-privacy@mail.ru