Ну , батенька вы и высказались ))) йа таки ддо сих пор не нашёл его компилятор, тем более при дис , судя по всему компилир пользовал оптимизацию , что (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Ken@t 20 февраля 2004 г. 13:50
В ответ на: Ответ: Дык для Форта и декомпилятор нужен для Форта (во сказал!) отправлено NickB 20 февраля 2004 г. 12:51

в общем то не так уж и плохо, но разбираться во всём этом ))) для V6 косворта обьём програграммы 32кб с псевдо паралельными вычислениями .... йа таки вам бибикну.
ну типа...
;******************* Управление сигналом SPOUT
; DO_SPOUT ()
; REG_B2.2 - 1 - требование обслуживания сигнала SPOUT
; Переменные
; bREG_1C -
; REG_CE -
; REG_CC - FE_PIP_TIME
; REG_70 - Обороты ???
; REG_62 - SPOUT_On - Время совершения события
; REG_16 - SPOUT_Off - Время совершения события
;
;
; REG_1A.7 -
; REG_1A.6 -
; REG_1A.5 - 1 - Требование установки сигнала SPOUT в "1"
; REG_1A.4 - 1 - Требование установки сигнала SPOUT в "1"
; REG_1A.3 - 1 - Игнорировать SPOUT, после выполнения процедуры очищается
; REG_1A.2 - 1 -
; REG_1A.1 - 1 -
; REG_1A.0 - 1 -
;
;
;*********************************************

2291 32B210 L2291 jbc REG_B2,BIT_02,L22A4 ; if ( !REG_B2.2 ) GOTO L22A4
2294 8B014824 cmp REG_70,$2448[Zero] ; if (REG.70 < $7530) ; CUTOFF RPM x4 ?? 7500 ???
70
2299 D10B jnh L22A6 ; GOTO L22A6
229B A00662 ld REG_62,IO_Timer ; REG_62 = IO_Timer // SPOUT_On =
229E A00616 ld REG_16,IO_Timer ; REG_16 = IO_Timer // SPOUT_Off=
22A1 71C01A andb REG_1A,#$C0 ; bREG_1A.7 = bREG_1A.6 = 1
22A4 20E6 L22A4 sjmp L238C ; GOTO L238C end DO_SPOUT
22A6 3D1A05 L22A6 jbs REG_1A,BIT_05,L22AE ; if ( REG_1A.5 ) GOTO L22AE // IgnImmed2
22A9 3C1A02 jbs REG_1A,BIT_04,L22AE ; if ( REG_1A.4 ) GOTO L22AE // IgnImmed1
22AC 203C sjmp L22EA ; Goto L22EA
22AE 3B1A34 L22AE jbs REG_1A,BIT_03,L22E5 ; if ( REG_1A.3 ) GOTO L22E5 // IgnoreIgnImmed
22B1 11B0 clrb REG_B0 ; REG_B0 = 0 // Текущее время таймера , только одно событие
22B3 305212 jbc REG_52,BIT_00,L22C8 ; if ( !REG_52.0 ) GOTO L22C8
22B6 B115B8 ldb REG_B8,#$15 ; REG_B8 = $15 // Событие SET+HS0.5
22B9 28D2 scall HS_OUT ;
22BB 30B002 jbc REG_B0,BIT_00,L22C0 ; if ( !REG_B0.0 ) GOTO L22C0 // Событие произошло
22BE 2010 sjmp L22D0 ; SPOUT_ON - Не произошло занят
22C0 91041A L22C0 orb REG_1A,#$04 ; REG_1A.2 = 1 // SPOUT = ON
22C3 A03062 ld REG_62,REG_30 ; REG_62 = REG_30 // SPOUT_On = когда on было
22C6 2013 sjmp L22DB ; GOTO L22DB
22C8 B105B8 L22C8 ldb REG_B8,#$05 ; REG_B8 = $05 // Событие OFF + HSO.5
22CB 28C0 scall HS_OUT ;
22CD 30B005 jbc REG_B0,BIT_00,L22D5 ; if ( !REG_B0.0 ) GOTO L22D5 // Событие произошло
22D0 9110B4 L22D0 orb REG_B4,#$10 ; REG_B4.4 = 1 // Событие SPOUT_OFF непроизошло
22D3 20B7 sjmp L238C ; GOTO L238C
22D5 71FB1A L22D5 andb REG_1A,#$FB ; REG_1A.2 = 0 // SPOUT = OFF
22D8 A03016 ld REG_16,REG_30 ; REG_16 = REG_30 // Last_SPOUT_Off = когда off было
22DB 351A02 L22DB jbc REG_1A,BIT_05,L22E0 ; if ( !REG_1A.5 ) GOTO L22E0 //
22DE 20A9 sjmp L2389 ; END DO_SPOUT
22E0 3C1A07 L22E0 jbs REG_1A,BIT_04,L22EA ; if ( REG_1A.4 ) GOTO L22EA
22E3 20A4 sjmp L2389 ; END DO_SPOUT
22E5 71F71A L22E5 andb REG_1A,#$F7 ; REG_1A.3 = 0
22E8 209F sjmp L2389 ; END DO_SPOUT
; Если есть требование SPOUT и нет REG_1A.5 или REG_1A.4
22EA 91081A L22EA orb REG_1A,#$08 ; REG_1A.3 = 1 // ?? Занят
22ED 381A6A jbs REG_1A,BIT_00,L235A ; if ( REG_1A.0 ) GOTO L235A //
22F0 391A03 jbs REG_1A,BIT_01,L22F6 ; if ( REG_1A.1 ) GOTO L22F6 //
22F3 3A1A59 jbs REG_1A,BIT_02,L234F ; if ( REG_1A.2 ) GOTO L234F //
; Нет REG_1A.0 REG_1A.1 REG_1A.2
22F6 0130 L22F6 clr REG_30 ; REG_30 = 0 //
22F8 A3012C24 ld REG_34,$242C[Zero] ; REG_34 = 0168 // REG_34 = $0168
34
22FD 45280034 add REG_36,REG_34,#$0028 ; REG_36 = REG_34 + $0028 // REG_36 = REG_34+$0028
36
2302 AC1C38 ldbze REG_38,REG_1C ; REG_38 = bREG_1C // REG_38 = REG_1C
2305 48383632 sub REG_32,REG_36,REG_38 ; REG_32 = REG_36 - REG_38 // REG_32 = REG_36 - REG_38 ( $0168 +$0028 -REG_1C )
2309 090134 shl REG_34,#$01 ; REG_34 *= 2 // $0168 *= 2
230C 8C3430 divu REG_30,REG_34 ; (long)REG_30,REG_32 / REG_34 => REG_30 div REG_32 rem ( $0168 +$0028 -REG_1C )/ ($0168 * 2) => (360+40-REG_1C)/720
230F DD30 jv L2341 ; Если реультат больше 1? - ошибка SPOUT пропускается
2311 A03018 ld REG_18,REG_30 ; REG_18 = REG_30 // ($0168+$0028-bREG_1C)/($0168*2) остаток от деления > 1
2314 91801B orb REG_1B,#$80 ; REG_1B.7 = 1
2317 4C18CE30 mulu REG_30,REG_CE,REG_18 ; (long)REG_30,REG_32 = REG_CE * REG_18 // REG_CE*( ($0168+$0028-bREG_1C)/($0168*2) )
231B 0D0130 shll REG_30,#$01 ; (long)REG_30,REG_32 * =2 // REG_CE*( ($0168+$0028-bREG_1C)/($0168*2) )* 2 ;
231E 490080CE sub REG_30,REG_CE,#$8000 ; REG_30 = REG_CE - $8000 // REG_CE-$8000
30
2323 0330 neg REG_30 ; REG_30 = -REG_30 // Типа REG_CE <0 ??
2325 48303234 sub REG_34,REG_32,REG_30 ; REG_34 = REG_32 - REG_30 // (REG_CE*( ($0168+$0028-bREG_1C)/($0168*2) )* 2)/65535 - ( -(REG_CE-$8000) )
2329 6C1E34 mulu REG_34,REG_1E ; REG_34 * Ton_PIP // (REG_CE*( ($0168+$0028-bREG_1C)/($0168*2) )* 2)/65535 - ( -(REG_CE-$8000) ) * Ton_PIP
232C 0D0134 shll REG_34,#$01 ; (long) REG_34 * = 2 // (REG_CE*( ($0168+$0028-bREG_1C)/($0168*2) )* 2)/65535 - ( -(REG_CE-$8000) ) * Ton_PIP * 2
232F A03634 ld REG_34,REG_36 ; REG_34 = ABOVE/65535 // (REG_CE*( ($0168+$0028-bREG_1C)/($0168*2) )* 2)/65535 - ( -(REG_CE-$8000) ) * Ton_PIP * 2 / $FFFF - время наступления события 1
; // (REG_CE*((360+40-bREG_1C)/720)* 2)/65535 - ( -(REG_CE-$8000) ) * T_CrankRev / $FFFF
2332 A1CC003C ld REG_3C,#$00CC ; REG_3C = $00CC // Фактически REG_CC - FE_PIP_TIME
2336 B115B8 ldb REG_B8,#$15 ; REG_B8 = 15 // SET+HSO.5
2339 B1C0B0 ldb REG_B0,#$C0 ; // Одно событие время его в REG_34 И [REG_3C]
233C 284F scall HS_OUT
233E 30B005 jbc REG_B0,BIT_00,L2346 ; if ( !REG_B0.0 ) GOTO L2346 // OK
2341 91021A L2341 orb REG_1A,#$02 ; REG_1A.1 = 1 // Ошибка SPOUT пропущен или требование SPOUT.ON ???
2344 2046 sjmp L238C ; END DO_SPOUT
2346 A03062 L2346 ld REG_62,REG_30 ; REG_62 = REG_30 // SPOUT_On = Время планируемого SPOUT
2349 71FD1A andb REG_1A,#$FD ; REG_1A.1 = 0
234C 91041A orb REG_1A,#$04 ; REG_1A.2 = 1
234F 881606 L234F cmp IO_Timer,REG_16 ; if ( IO_TIMER < SPOUT_Off ) // Здесь уточнить логику в диаграмме , можно ли совершить SPOUT.OFF ???
2352 DE04 jlt L2358 ; GOTO L2358 // Если SPOUT.OFF в будующим
2354 DD36 jv L238C ; if ( IO_TIMER > SPOUT_Off ) GOTO L238C // END DO_SPOUT
2356 2002 sjmp L235A ; GOTO L235A
2358 D532 L2358 jnv L238C ; if ( IO_TIMER == SPOUT_Off) GOTO L238C // END DO_SPOUT
235A 89CA011E L235A cmp REG_1E,#$01CA ; if ( Ton_PIP < $01CA ) //
235E D106 jnh L2366 ; GOTO L2366
2360 89B1281E cmp REG_1E,#$28B1 ; if ( Ton_PIP < $28B1 ) //
2364 D106 jnh L236C ; GOTO L236C //
2366 A1800334 L2366 ld REG_34,#$0380 ; REG_34 = $0380 // Если Ton_PIP < $01CA или Ton_PIP > $28B1 то время наступления события
236A 2003 sjmp L236F ; GOTO L236F
236C A01E34 L236C ld REG_34,REG_1E ; REG_34 = Ton_PIP // Время наступления события REG_1E содержит длительность сигнала PIP ON
236F A162003C L236F ld REG_3C,#$0062 ; REG_3C = $0062 // [REG_62] - смещение от SPOUT_On
2373 B105B8 ldb REG_B8,#$05 ; REG_B8 = $05 // CLR+HS0.5
2376 B1C0B0 ldb REG_B0,#$C0 ; REG_B0 = $C0 // ОДно событие время в REG_34 и [REG_3C]
2379 2812 scall HS_OUT ;
237B 30B005 jbc REG_B0,BIT_00,L2383 ; if ( !REG_B0.0 ) GOTO 2383 // SPOUT OK
237E 91011A orb REG_1A,#$01 ; REG_1A.1 = 1 // SPOUT FailEdge - пропущен
2381 2009 sjmp L238C ; GOTO L238C // END SPOUT
2383 71FA1A L2383 andb REG_1A,#$FA ; REG_1A.2 = REG_1A.0 = 0
2386 A03016 ld REG_16,REG_30 ; REG_16 = REG_30 // SPOUT_Off = Время события
2389 71FBB2 L2389 andb REG_B2,#$FB ; REG_B2.2 = 0 // SPOUT обслужен
238C F0 L238C ret


--- или
; REG_38 = Table Address
; REG_30(31) = значение
; REG_32(33) = значение
; REG_34 = Размер таблицы ( колонки + 1 -> множитель для REG_33)
; REG_3B = возвращаемое значение (REG_3B = $80)
;
;
;
;
;

TBL_Lookup:
3294 5C333436 L3294 mulub REG_36,REG_34,REG_33 ; bREG_36 = bREG_34*bREG_33
3298 743136 addb REG_36,REG_31 ; REG_36 += bREG_31
329B D302 jnc L329F ; if ( REG_36 < REG_31 ) GOTO L329F
329D 1737 incb REG_37 ; bREG_37 ++
329F 643638 L329F add REG_38,REG_36 ; REG_38 += REG_36
32A2 B23931 ldb REG_31,[REG_38]+ ; bREG_31 = [REG_38++]
32A5 B23833 ldb REG_33,[REG_38] ; bREG_33 = [REG_38]
32A8 281C scall L32C6 ; REG_3A = result
32AA 643438 add REG_38,REG_34 ; REG_38 += REG_34
32AD B23833 ldb REG_33,[REG_38] ; bREG_33 = [REG_38]
32B0 0538 dec REG_38 ; REG_38 --
32B2 B23831 ldb REG_31,[REG_38] ; bREG_31 = [REG_38]
32B5 B03B34 ldb REG_34,REG_3B ; bREG_34 = bREG_3B --- Вот сюда результат
32B8 280C scall L32C6 ; REG_3A = result
32BA B03B33 ldb REG_33,REG_3B ; bREG_33 = bREG_3B --- Вот результат сохранили
32BD B03431 ldb REG_31,REG_34 ; bREG_31 = bREG_34
32C0 B03230 ldb REG_30,REG_32 ; bREG_30 = bREG_32
32C3 2801 scall L32C6
32C5 F0 ret
;
;
; REG_3A = (b((bREG_30*bREG_33) - (bREG_30*bREG_31) + bREG_31 ))+ $0080 Ахринеть
; Линейная Интерполяция ?????
32C6 5C33303A L32C6 mulub REG_3A,REG_30,REG_33 ; REG_3A = bREG_30*bREG_33
32CA 5C313036 mulub REG_36,REG_30,REG_31 ; REG_36 = bREG_30*bREG_31
32CE 68363A sub REG_3A,REG_36 ; REG_3A -= REG_36
32D1 74313B addb REG_3B,REG_31 ; bREG_3B += bREG_31
32D4 6580003A add REG_3A,#$0080 ; REG_3A += $0080
32D8 F0 ret

В общем по ходу, там куча ненужных операции , а вы форт -форт, асм рулит


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru