home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / HITECH-C / MOTOROLA.EXE / INTRPT.H < prev    next >
C/C++ Source or Header  |  1993-04-21  |  6KB  |  224 lines

  1. /* Definitions for interrupt handling */
  2.  
  3.  
  4. #define    _imkstr_(x)    #x
  5.  
  6. /*
  7.  *    ROM_VECTOR, RAM_VECTOR & CHANGE_VECTOR macros for 6805, 6809,
  8.  *    68HC11/6801/6301 and 680x0
  9.  *
  10.  *    ROM_VECTOR: points a ROM based vector directly at an interrupt
  11.  *            function.
  12.  *
  13.  *    RAM_VECTOR: points a ROM based vector at a JMP instruction in
  14.  *            the "data" psect which jumps to the interrupt function.
  15.  *            If "data" is linked into RAM, this results in a "soft"
  16.  *            vector which can be modified.
  17.  *
  18.  *    CHANGE_VECTOR:  changes the a JMP instruction defined by RAM_VECTOR to
  19.  *            point at a different interrupt function.
  20.  *
  21.  *    READ_RAM_VECTOR:    returns the address of the interrupt function
  22.  *                to which a RAM vector effectively points.
  23.  *
  24.  *    Colin Weaver, August 1992
  25.  */
  26.  
  27. /*
  28.  *    68HC11,6801,6301,6805    ei() and di()
  29.  */
  30.  
  31. #if    m6800 || m6805
  32. #define    ei()    asm("    cli")
  33. #define    di()    asm("    sei")
  34. #endif    /* m6800 */
  35.  
  36. /*
  37.  *    6805    ROM_VECTOR, RAM_VECTOR, CHANGE_VECTOR, READ_RAM_VECTOR
  38.  */
  39.  
  40. #if    m6805
  41. #define ROM_VECTOR(vec, fun) \
  42.         asm("    ifge    (" _imkstr_(vec) "!.$F)-$E"); \
  43.         asm("    fail    Can't modify reset vector"); \
  44.         asm("    endc"); \
  45.         asm("    psect    vectors,ovrld"); \
  46.         asm("    global    _" _imkstr_(fun)); \
  47.         asm("    org    " _imkstr_(vec) "!.$F"); \
  48.         asm("    fdb    _" _imkstr_(fun)); \
  49.         asm("    psect    text")
  50.  
  51. struct _RAM_VEC {
  52.     unsigned char    jmp;        /* jmp opcode */
  53.     interrupt void    (*addr)(void);    /* address field */
  54. };
  55.  
  56. #define    RAM_VECTOR(vec, fun) \
  57.         asm("    ifge    (" _imkstr_(vec) "!.$F)-$E"); \
  58.         asm("    fail    Can't modify reset vector"); \
  59.         asm("    endc"); \
  60.         asm("    psect    vectors,ovrld"); \
  61.         asm("    global    _" _imkstr_(fun)); \
  62.         asm("    org    " _imkstr_(vec) "!.$F"); \
  63.         asm("    fdb    999f"); \
  64.         asm("    psect    data,class=CODE"); \
  65.         asm("999:"); \
  66.         asm("    jmp    _" _imkstr_(fun)); \
  67.         asm("    psect    text")
  68.  
  69. extern unsigned char    _Lvectors[];
  70. #define CHANGE_VECTOR(vec, fun)    (*(struct _RAM_VEC **)(_Lvectors+(vec&0x0F)))->addr = fun
  71. #define    READ_RAM_VECTOR(vec)    ((*(struct _RAM_VEC **)(_Lvectors+(vec&0x0F)))->addr)
  72. #endif
  73.  
  74. /*
  75.  *    68HC11, 6801, 6301, 6809 ROM_VECTOR, RAM_VECTOR, CHANGE_VECTOR, etc.
  76.  */
  77.  
  78. #if    m6800 || m6809
  79. #define ROM_VECTOR(vec, fun) \
  80.         asm("    ifge    " _imkstr_(vec) "-$FFFE"); \
  81.         asm("    fail    Can't modify reset vector"); \
  82.         asm("    endc"); \
  83.         asm("    psect    vectors,abs,ovrld"); \
  84.         asm("    global    _" _imkstr_(fun)); \
  85.         asm("    org    " _imkstr_(vec)); \
  86.         asm("    fdb    _" _imkstr_(fun)); \
  87.         asm("    psect    text")
  88.  
  89. struct _RAM_VEC {
  90.     unsigned char    jmp;        /* jmp opcode */
  91.     interrupt void    (*addr)(void);    /* address field */
  92. };
  93.  
  94. #define    RAM_VECTOR(vec, fun) \
  95.         asm("    ifge    " _imkstr_(vec) "-$FFFE"); \
  96.         asm("    fail    Can't modify reset vector"); \
  97.         asm("    endc"); \
  98.         asm("    psect    vectors,abs,ovrld"); \
  99.         asm("    global    _" _imkstr_(fun)); \
  100.         asm("    org    " _imkstr_(vec)); \
  101.         asm("    fdb    999f"); \
  102.         asm("    psect    data,class=DATA"); \
  103.         asm("999:"); \
  104.         asm("    jmp    _" _imkstr_(fun)); \
  105.         asm("    psect    text")
  106.  
  107. #define CHANGE_VECTOR(vec, fun)    (*(struct _RAM_VEC **)vec)->addr = fun
  108. #define    READ_RAM_VECTOR(vec)    ((*(struct _RAM_VEC **)vec)->addr)
  109. #endif
  110.  
  111. #if    m6809
  112. /* ei() and di() are for the IRQ, efi() and edi() are for FIRQ */
  113.  
  114. #define    ei()    asm("    andcc    #$EF")
  115. #define    di()    asm("    orcc    #$10")
  116. #define    efi()    asm("    andcc    #$BF")
  117. #define    dfi()    asm("    orcc    #$40")
  118. #endif    /* m6809 */
  119.  
  120. /*
  121.  *    68000 interrupt vector and interrupt handling
  122.  */
  123.  
  124. #if    m68k
  125.  
  126. #define    di()    asm("or.w #$700,sr")
  127. #define    ei()    asm("and.w #$F8FF,sr")
  128.  
  129. #define    ROM_VECTOR(vec, fun) \
  130.         asm("    psect    vectors,ovrld"); \
  131.         asm("    global    _" _imkstr_(fun)); \
  132.         asm("    org    " _imkstr_(vec)); \
  133.         asm("    dc.l    _" _imkstr_(fun)); \
  134.         asm("    psect    text")
  135.  
  136. struct _RAM_VEC {
  137.     unsigned short    jmp;        /* jmp opcode */
  138.     interrupt void    (*addr)(void);    /* address field */
  139. };
  140.  
  141. #define    RAM_VECTOR(vec, fun) \
  142.         asm("    psect    vectors,ovrld"); \
  143.         asm("    global    _" _imkstr_(fun)); \
  144.         asm("    org    " _imkstr_(vec)); \
  145.         asm("    dc.l    999f"); \
  146.         asm("    psect    data,class=DATA"); \
  147.         asm("999:"); \
  148.         asm("    jmp    _" _imkstr_(fun)); \
  149.         asm("    psect    text")
  150.  
  151. extern unsigned char    _Lvectors[];
  152. #define CHANGE_VECTOR(vec, fun)    (*(struct _RAM_VEC **)(_Lvectors+(vec)))->addr = fun
  153. #define    READ_RAM_VECTOR(vec)    ((*(struct _RAM_VEC **)(_Lvectors+(vec)))->addr)
  154.  
  155. #endif    /* m68k */
  156.  
  157. #ifdef    ROM_VECTOR
  158. #define    set_vector(vec, fun)    ROM_VECTOR(vec, fun)
  159. #endif
  160.  
  161. #if    i8051
  162. #define    ei()    asm("    setb    ea")
  163. #define    di()    asm("    clr    ea")
  164. #define    set_vector(vec, fun) \
  165.         asm("    global    _" _imkstr_(fun)); \
  166.         asm("    psect    vectors,ovrld"); \
  167.         asm("    org    " _imkstr_(vec)); \
  168.         asm("    ljmp    _" _imkstr_(fun)); \
  169.         asm("    psect    text")
  170.  
  171. #endif    /* i8051 */
  172.  
  173. #if    i8096
  174. #define    ei()    asm("    ei")
  175. #define    di()    asm("    di")
  176. #define    set_vector(vec, fun) \
  177.         asm("    psect    vectors,ovrld"); \
  178.         asm("    global    _" _imkstr_(fun)); \
  179.         asm("    org    " _imkstr_(vec) " and 0x7F"); \
  180.         asm("    dcw    _" _imkstr_(fun)); \
  181.         asm("    psect    text")
  182.  
  183. #endif    /* i8096 */
  184.  
  185. #if    h8300
  186. #define    ei()    asm("    andc    #H'7F,ccr")
  187. #define    di()    asm("    orc    #H'80,ccr")
  188. #define    set_vector(vec, fun) \
  189.         asm("    psect    vectors,ovrld"); \
  190.         asm("    global    _" _imkstr_(fun)); \
  191.         asm("    org    " _imkstr_(vec) " and H'FF"); \
  192.         asm("    dc.w    _" _imkstr_(fun)); \
  193.         asm("    psect    text")
  194.  
  195. #endif    /* h8300 */
  196.  
  197. #if    i8086
  198. #define    ei()    asm("    sti")
  199. #define    di()    asm("    cli")
  200. #endif    /* i8086 */
  201.  
  202. #if    z80
  203. #define    ei()    asm("    ei")
  204. #define    di()    asm("    di")
  205. #endif    z80
  206.  
  207.  
  208. /*    The type of a pointer to an interrupt vector */
  209.  
  210. #if    defined(i8086) && !defined(FLAT_MODEL)
  211.  
  212. typedef far interrupt void (*isr)(void);
  213. extern isr set_vector(volatile far isr *, isr);
  214.  
  215. #else    /* i8086 */
  216.  
  217. typedef interrupt void (*isr)(void);
  218.  
  219. #ifndef    set_vector
  220. extern isr set_vector(volatile isr *, isr);
  221. #endif
  222.  
  223. #endif    /* i8086 */
  224.