17-Jan-04 01:19 Maxim Polyanskiy wrote to Alexander Torres:
AT>> Компилятор был МПАСМ, но возмжно я за давностью лет уже подзабыл что AT>> именно там было. Кажется все-таки не два макроса подряд, а смесь AT>> макросов в просыми ассемблерными командами, типа btfsz M djnz L MP> Да это вызовет ошибку - но это твоя ошибка, основанная на пропуске MP> макрокомманды, которая естественно состоит не из одного слова а из 2-х, Угу. MP> впрочем MP> наверно стоит задуматся тем кто писал асм, поскольку ситация принципиально MP> контролируемая... А воообще нужно не пользоватся многострочными макросами, MP> пока MP> знание языка не достигнет уровня, на котором эта ошика будет абсолютно MP> очевидна, либо очень осторожно относится к командам пропуска. Да нет, нужно просто сразу увидеть где ждут грабли подпорки себе написать.
*** Выдержки из p16cxx.inc
bit( .MACRO fil,num) (((fil)<<3)+(num)) .endm
STATUS equ 3 ; == $83 C equ bit(STATUS,0) DC equ bit(STATUS,1) Z equ bit(STATUS,2) и так далее...
*** Выдержка из файла p16mac.inc
__tst_skip .macro .if __skip_at == * .error "Attempt to skip multiword macro" .endif .endm
movlf .macro *val,dst __tst_skip .if (val)==0 clrf dst .else movlw val movwf dst .endif .endm
wswitch .macro * wswmsk .set 0 .endm
wcase .macro *val,lab __tst_skip xorlw (val^wswmsk) wswmsk .set val jz lab .endm
wsrest .macro * xorlw wswmsk wswmsk .set 0 .endm
; dst=(w&mask)|(dst&~mask) ; w =(w^dst)&mask InsBitsW .macro dst,mask __tst_skip xorwf dst,w .IF 'mask[0.1]'=='#' ; дадада! я тут вернулся к #5 для констант! andlw mask[1.0] ; терпеть не могу всякие movlw, ldi и т.п.! .ELSE ; mov он mov и есть, остальное от лукавого andwf mask,w .ENDIF xorwf dst,f .endm
*** Выдержки из файла bitsop.inc
skpnb .macro *bl [z] = 0 btfsc (([z]+bl)>>3),((bl)&7) __skip_at .set * .endm ifnb .macro *bl [z] = 0 btfss (([z]+bl)>>3),((bl)&7) __skip_at .set * .endm
jb .macro *bl,lab [z] = 0 __tst_skip btfsc (([z]+bl)>>3),((bl)&7) goto [z]+lab .endm
jnc .macro *lab [z] = 0 __tst_skip skpc goto [z]+lab .endm
; J_not_fall - уйти если два бита не в состоянии 10 jn_10 .macro *old,new,lab [z] = 0 __tst_skip skpnb old skpnb new goto [z]+lab .endm
skp00 .macro *b1,b2 __tst_skip skpb b1 skpnb b2 __skip_at .set * .endm
И так далее. И все эти btfss просто не использовать.
Правда, это не MPASM... Это aspic, а MPASM был сразу и со свистом вышвырнут. А если ещё посмотреть, что VMK под AS by Alfred Arnold для этих пиков да сцениксов вытворял... Но и ради гораздо большего объёма написанных строк, ради небольшого просто вломы большую систему макросов писать.
wbr, p.s. Господи, с каким удовольствием я сейчас пишу на С 90-95% кода... Надеюсь, никто не скажет, что я это делаю только потому, что не умею писать на асмах :-)