; Commonly used macros
;
-; Copyright (C) 2010 Leo C.
+; Copyright (C) 2010,2012,2013 Leo C.
;
; This file is part of avrcpm.
;
;
;
.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
rjmp @0
.endif
.endm
-
+#endif
;------------------------------------------------
;
.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