1 /*
2  * @ingroup   lib_emu68_inl
3  * @file      emu68/inl68_progctrl.h
4  * @brief     68k program control inlines.
5  * @author    Benjamin Gerard
6  * @date      2009/05/18
7  */
8 
9 /* Copyright (c) 1998-2015 Benjamin Gerard */
10 
11 #ifndef INL68_PROGCTRL_H
12 #define INL68_PROGCTRL_H
13 
14 static inline
inl_tst68(emu68_t * const emu68,const int68_t a)15 void inl_tst68(emu68_t * const emu68, const int68_t a)
16 {
17   REG68.sr = ( REG68.sr & ( 0xFF00 | SR_X ) )
18     | (  !a << SR_Z_BIT )
19     | ( ( a >> ( SIGN_FIX - SR_N_BIT ) ) & SR_N )
20     ;
21 }
22 
23 static inline
inl_tas68(emu68_t * const emu68,const int68_t d)24 int68_t inl_tas68(emu68_t * const emu68, const int68_t d)
25 {
26   inl_tst68(emu68, d << BYTE_FIX);
27   return d | 0x80;
28 }
29 
30 static inline
inl_rts68(emu68_t * const emu68)31 void inl_rts68(emu68_t * const emu68)
32 {
33   REG68.pc = popl();
34 }
35 
36 static inline
inl_rte68(emu68_t * const emu68)37 void inl_rte68(emu68_t * const emu68)
38 {
39   REG68.sr = popw();
40   REG68.pc = popl();
41 }
42 
43 static inline
inl_rtr68(emu68_t * const emu68)44 void inl_rtr68(emu68_t * const emu68)
45 {
46   REG68.sr = ( REG68.sr & 0xFF00 ) | (u8)popw();
47   REG68.pc = popl();
48 }
49 
50 static inline
inl_bsr68(emu68_t * const emu68,const addr68_t addr)51 void inl_bsr68(emu68_t * const emu68, const addr68_t addr)
52 {
53   pushl(REG68.pc);
54   REG68.pc = addr;
55   inl_addcycle68(emu68,12);
56 }
57 
58 static inline
inl_jmp68(emu68_t * const emu68,const addr68_t addr)59 void inl_jmp68(emu68_t * const emu68, const addr68_t addr)
60 {
61   REG68.pc = addr;
62   inl_addcycle68(emu68,4);
63 }
64 
65 static inline
inl_jsr68(emu68_t * const emu68,const addr68_t addr)66 void inl_jsr68(emu68_t * const emu68, const addr68_t addr)
67 {
68   pushl(REG68.pc);
69   REG68.pc = addr;
70   inl_addcycle68(emu68,4);
71 }
72 
73 static inline
inl_nop68(emu68_t * const emu68)74 void inl_nop68(emu68_t * const emu68) { }
75 
76 #endif
77