]> cloudbase.mooo.com Git - avrcpm.git/blobdiff - avr/macros.inc
* cpm/BIOS.MAC
[avrcpm.git] / avr / macros.inc
index 74c9f215ade7cf397d3080e614b04ffd39666d6b..659212ffa6403dfc8802b55ebf094ca883609a83 100644 (file)
@@ -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.
 ;
 ;
 ;
 .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