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