2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
15 FIFO::FIFO(int s, int empty_warn, int fill_warn)
18 //buf = (int*)malloc(size * sizeof(int));
22 empty_warn_val = empty_warn;
24 fill_warn_val = INT_MAX;
26 fill_warn_val = fill_warn;
39 fill_warn_flag = false;
40 if(empty_warn_val > 0) empty_warn_flag = false;
43 void FIFO::write(int val, bool *p_fill_warn)
45 __LIKELY_IF(cnt < size) {
47 __UNLIKELY_IF(wpt >= size) {
51 __UNLIKELY_IF(fill_warn_val < cnt) {
52 fill_warn_flag = true;
54 fill_warn_flag = false;
57 __UNLIKELY_IF(p_fill_warn != nullptr) {
58 *p_fill_warn = fill_warn_flag;
62 int FIFO::read(bool *p_empty_warn)
65 __LIKELY_IF(cnt > 0) {
67 __UNLIKELY_IF(rpt >= size) {
71 __UNLIKELY_IF(cnt <= 0) {
76 __UNLIKELY_IF(empty_warn_val > cnt) {
77 empty_warn_flag = true;
79 empty_warn_flag = false;
82 __UNLIKELY_IF(p_empty_warn != nullptr) {
83 *p_empty_warn = empty_warn_flag;
88 int FIFO::read_not_remove(int pt, bool *p_empty_warn)
90 __UNLIKELY_IF(p_empty_warn != nullptr) {
91 *p_empty_warn = empty_warn_flag;
93 __LIKELY_IF(pt >= 0 && pt < cnt) {
103 void FIFO::write_not_push(int pt, int d, bool *p_fill_warn)
105 __UNLIKELY_IF(p_fill_warn != nullptr) {
106 *p_fill_warn = fill_warn_flag;
108 __LIKELY_IF(pt >= 0 && pt < cnt) {
123 int FIFO::fifo_size()
130 return (cnt == size);
135 int val = size - cnt;
136 __UNLIKELY_IF(val < 0) val = 0;
137 __UNLIKELY_IF(val > size) val = size;
146 #define STATE_VERSION 1
148 bool FIFO::process_state(void *f, bool loading)
150 FILEIO *state_fio = (FILEIO *)f;
152 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
155 state_fio->StateValue(size);
156 state_fio->StateArray(buf, size * sizeof(int), 1);
157 state_fio->StateValue(cnt);
158 state_fio->StateValue(rpt);
159 state_fio->StateValue(wpt);