X-Git-Url: http://cloudbase.mooo.com/gitweb/avrcpm.git/blobdiff_plain/623dd899f6326f34aaf298fd4f83dbd69d7ef750..e8384f88b1a073f47591b9ca13b73da12a7c59a8:/avr/macros.inc diff --git a/avr/macros.inc b/avr/macros.inc index 74c9f21..659212f 100644 --- a/avr/macros.inc +++ b/avr/macros.inc @@ -1,6 +1,6 @@ ; Commonly used macros ; -; Copyright (C) 2010 Leo C. +; Copyright (C) 2010,2012,2013 Leo C. ; ; This file is part of avrcpm. ; @@ -106,19 +106,60 @@ ; ; .macro INTERRUPT - .set pos_ = PC - .org @0 ; vector address - .if abs(pos_ - PC) > 2048 - jmp pos_ + .set pos_ = PC ;save current position + .org @0 ;vector address + .set dist_ = pos_ - (PC+1) + + .if dist_ <= 2048 + rjmp pos_ + .elif (dist_ - (FLASHEND+1)) > -2048 + .set disp_ = (dist_ - (FLASHEND+1)) & 0xFFF +; rjmp pos_ - (FLASHEND+1) + .dw 0xC000 | disp_ .else - rjmp pos_ ; jump to handler + jmp pos_ ;jump to handler .endif - .org pos_ ; restore PC + + .org pos_ ;restore PC .endm ;------------------------------------------------ ; ; + +#if 1 + +.macro ljmp + .if FLASHEND > 0x0fff + .ifdef @0 + .set dist_ = @0 - (PC+1) + .if dist_ < 0 + .if dist_ >= -2048 + rjmp @0 + .elif dist_ < -(FLASHEND+1-2048) + .dw 0xC000 | (dist_ + (FLASHEND+1)) & 0xFFF + .else + jmp @0 + .endif + .else ; >0 + .if (dist_ < 2048) + rjmp @0 + .elif dist_ > (FLASHEND+1-2048) + .dw 0xC000 | (dist_ - (FLASHEND+1)) & 0xFFF + .else + jmp @0 + .endif + .endif + .else ; not def @0 + jmp @0 + .endif + .else ; <= 0x0fff + rjmp @0 + .endif +.endm + +#else + .macro ljmp .if FLASHEND > 0x0fff .ifdef @0 @@ -134,7 +175,7 @@ rjmp @0 .endif .endm - +#endif ;------------------------------------------------ ; @@ -142,15 +183,28 @@ .macro lcall .if FLASHEND > 0x0fff .ifdef @0 - .if abs(PC - @0) > 2047 - call @0 - .else - rcall @0 + .set dist_ = @0 - (PC+1) + .if dist_ < 0 + .if dist_ >= -2048 + rcall @0 + .elif dist_ < -(FLASHEND+1-2048) + .dw 0xC000 | (dist_ + (FLASHEND+1)) & 0xFFF + .else + call @0 + .endif + .else ; >0 + .if (dist_ < 2048) + rcall @0 + .elif dist_ > (FLASHEND+1-2048) + .dw 0xC000 | (dist_ - (FLASHEND+1)) & 0xFFF + .else + call @0 + .endif .endif - .else + .else ; not def @0 call @0 .endif - .else + .else ; <= 0x0fff rcall @0 .endif .endm