home *** CD-ROM | disk | FTP | other *** search
- /* Definitions for interrupt handling */
-
-
- #define _imkstr_(x) #x
-
- /*
- * ROM_VECTOR, RAM_VECTOR & CHANGE_VECTOR macros for 6805, 6809,
- * 68HC11/6801/6301 and 680x0
- *
- * ROM_VECTOR: points a ROM based vector directly at an interrupt
- * function.
- *
- * RAM_VECTOR: points a ROM based vector at a JMP instruction in
- * the "data" psect which jumps to the interrupt function.
- * If "data" is linked into RAM, this results in a "soft"
- * vector which can be modified.
- *
- * CHANGE_VECTOR: changes the a JMP instruction defined by RAM_VECTOR to
- * point at a different interrupt function.
- *
- * READ_RAM_VECTOR: returns the address of the interrupt function
- * to which a RAM vector effectively points.
- *
- * Colin Weaver, August 1992
- */
-
- /*
- * 68HC11,6801,6301,6805 ei() and di()
- */
-
- #if m6800 || m6805
- #define ei() asm(" cli")
- #define di() asm(" sei")
- #endif /* m6800 */
-
- /*
- * 6805 ROM_VECTOR, RAM_VECTOR, CHANGE_VECTOR, READ_RAM_VECTOR
- */
-
- #if m6805
- #define ROM_VECTOR(vec, fun) \
- asm(" ifge (" _imkstr_(vec) "!.$F)-$E"); \
- asm(" fail Can't modify reset vector"); \
- asm(" endc"); \
- asm(" psect vectors,ovrld"); \
- asm(" global _" _imkstr_(fun)); \
- asm(" org " _imkstr_(vec) "!.$F"); \
- asm(" fdb _" _imkstr_(fun)); \
- asm(" psect text")
-
- struct _RAM_VEC {
- unsigned char jmp; /* jmp opcode */
- interrupt void (*addr)(void); /* address field */
- };
-
- #define RAM_VECTOR(vec, fun) \
- asm(" ifge (" _imkstr_(vec) "!.$F)-$E"); \
- asm(" fail Can't modify reset vector"); \
- asm(" endc"); \
- asm(" psect vectors,ovrld"); \
- asm(" global _" _imkstr_(fun)); \
- asm(" org " _imkstr_(vec) "!.$F"); \
- asm(" fdb 999f"); \
- asm(" psect data,class=CODE"); \
- asm("999:"); \
- asm(" jmp _" _imkstr_(fun)); \
- asm(" psect text")
-
- extern unsigned char _Lvectors[];
- #define CHANGE_VECTOR(vec, fun) (*(struct _RAM_VEC **)(_Lvectors+(vec&0x0F)))->addr = fun
- #define READ_RAM_VECTOR(vec) ((*(struct _RAM_VEC **)(_Lvectors+(vec&0x0F)))->addr)
- #endif
-
- /*
- * 68HC11, 6801, 6301, 6809 ROM_VECTOR, RAM_VECTOR, CHANGE_VECTOR, etc.
- */
-
- #if m6800 || m6809
- #define ROM_VECTOR(vec, fun) \
- asm(" ifge " _imkstr_(vec) "-$FFFE"); \
- asm(" fail Can't modify reset vector"); \
- asm(" endc"); \
- asm(" psect vectors,abs,ovrld"); \
- asm(" global _" _imkstr_(fun)); \
- asm(" org " _imkstr_(vec)); \
- asm(" fdb _" _imkstr_(fun)); \
- asm(" psect text")
-
- struct _RAM_VEC {
- unsigned char jmp; /* jmp opcode */
- interrupt void (*addr)(void); /* address field */
- };
-
- #define RAM_VECTOR(vec, fun) \
- asm(" ifge " _imkstr_(vec) "-$FFFE"); \
- asm(" fail Can't modify reset vector"); \
- asm(" endc"); \
- asm(" psect vectors,abs,ovrld"); \
- asm(" global _" _imkstr_(fun)); \
- asm(" org " _imkstr_(vec)); \
- asm(" fdb 999f"); \
- asm(" psect data,class=DATA"); \
- asm("999:"); \
- asm(" jmp _" _imkstr_(fun)); \
- asm(" psect text")
-
- #define CHANGE_VECTOR(vec, fun) (*(struct _RAM_VEC **)vec)->addr = fun
- #define READ_RAM_VECTOR(vec) ((*(struct _RAM_VEC **)vec)->addr)
- #endif
-
- #if m6809
- /* ei() and di() are for the IRQ, efi() and edi() are for FIRQ */
-
- #define ei() asm(" andcc #$EF")
- #define di() asm(" orcc #$10")
- #define efi() asm(" andcc #$BF")
- #define dfi() asm(" orcc #$40")
- #endif /* m6809 */
-
- /*
- * 68000 interrupt vector and interrupt handling
- */
-
- #if m68k
-
- #define di() asm("or.w #$700,sr")
- #define ei() asm("and.w #$F8FF,sr")
-
- #define ROM_VECTOR(vec, fun) \
- asm(" psect vectors,ovrld"); \
- asm(" global _" _imkstr_(fun)); \
- asm(" org " _imkstr_(vec)); \
- asm(" dc.l _" _imkstr_(fun)); \
- asm(" psect text")
-
- struct _RAM_VEC {
- unsigned short jmp; /* jmp opcode */
- interrupt void (*addr)(void); /* address field */
- };
-
- #define RAM_VECTOR(vec, fun) \
- asm(" psect vectors,ovrld"); \
- asm(" global _" _imkstr_(fun)); \
- asm(" org " _imkstr_(vec)); \
- asm(" dc.l 999f"); \
- asm(" psect data,class=DATA"); \
- asm("999:"); \
- asm(" jmp _" _imkstr_(fun)); \
- asm(" psect text")
-
- extern unsigned char _Lvectors[];
- #define CHANGE_VECTOR(vec, fun) (*(struct _RAM_VEC **)(_Lvectors+(vec)))->addr = fun
- #define READ_RAM_VECTOR(vec) ((*(struct _RAM_VEC **)(_Lvectors+(vec)))->addr)
-
- #endif /* m68k */
-
- #ifdef ROM_VECTOR
- #define set_vector(vec, fun) ROM_VECTOR(vec, fun)
- #endif
-
- #if i8051
- #define ei() asm(" setb ea")
- #define di() asm(" clr ea")
- #define set_vector(vec, fun) \
- asm(" global _" _imkstr_(fun)); \
- asm(" psect vectors,ovrld"); \
- asm(" org " _imkstr_(vec)); \
- asm(" ljmp _" _imkstr_(fun)); \
- asm(" psect text")
-
- #endif /* i8051 */
-
- #if i8096
- #define ei() asm(" ei")
- #define di() asm(" di")
- #define set_vector(vec, fun) \
- asm(" psect vectors,ovrld"); \
- asm(" global _" _imkstr_(fun)); \
- asm(" org " _imkstr_(vec) " and 0x7F"); \
- asm(" dcw _" _imkstr_(fun)); \
- asm(" psect text")
-
- #endif /* i8096 */
-
- #if h8300
- #define ei() asm(" andc #H'7F,ccr")
- #define di() asm(" orc #H'80,ccr")
- #define set_vector(vec, fun) \
- asm(" psect vectors,ovrld"); \
- asm(" global _" _imkstr_(fun)); \
- asm(" org " _imkstr_(vec) " and H'FF"); \
- asm(" dc.w _" _imkstr_(fun)); \
- asm(" psect text")
-
- #endif /* h8300 */
-
- #if i8086
- #define ei() asm(" sti")
- #define di() asm(" cli")
- #endif /* i8086 */
-
- #if z80
- #define ei() asm(" ei")
- #define di() asm(" di")
- #endif z80
-
-
- /* The type of a pointer to an interrupt vector */
-
- #if defined(i8086) && !defined(FLAT_MODEL)
-
- typedef far interrupt void (*isr)(void);
- extern isr set_vector(volatile far isr *, isr);
-
- #else /* i8086 */
-
- typedef interrupt void (*isr)(void);
-
- #ifndef set_vector
- extern isr set_vector(volatile isr *, isr);
- #endif
-
- #endif /* i8086 */
-