|
|
| version 1.3, 2004/08/11 17:45:06 | version 1.4, 2005/02/04 06:42:07 |
|---|---|
| Line 9 | Line 9 |
| void nevent_allreset(void) { | void nevent_allreset(void) { |
| UINT i; | |
| ZeroMemory(&nevent, sizeof(nevent)); | ZeroMemory(&nevent, sizeof(nevent)); |
| nevent.first = NEVENTITEM_TERM; | |
| for (i=0; i<NEVENT_MAXEVENTS; i++) { | |
| nevent.item[i].next = NEVENTITEM_NONE; | |
| } | |
| } | } |
| void nevent_progress(void) { | void nevent_progress(void) { |
| SINT32 nextbase; | |
| UINT eventnum; | |
| UINT waitevents; | |
| UINT i; | |
| UINT curid; | |
| NEVENTITEM item; | NEVENTITEM item; |
| UINT waitlevel[NEVENT_MAXEVENTS]; | NEVENTITEM itemnext; |
| NEVENTITEM *witem; | |
| NEVENTITEM waititem[NEVENT_MAXEVENTS]; | |
| SINT32 nextbase; | |
| NEVENTITEM *wi; | |
| CPU_CLOCK += CPU_BASECLOCK; | CPU_CLOCK += CPU_BASECLOCK; |
| nextbase = NEVENT_MAXCLOCK; | item = nevent.first; |
| eventnum = 0; | witem = waititem; |
| waitevents = 0; | while(item != NEVENTITEM_TERM) { |
| for (i=0; i<nevent.readyevents; i++) { | |
| curid = nevent.level[i]; | |
| item = nevent.item + curid; | |
| item->clock -= CPU_BASECLOCK; | item->clock -= CPU_BASECLOCK; |
| if (item->clock > 0) { | if (item->clock > 0) { |
| // イベント待ち中 | break; |
| nevent.level[eventnum++] = curid; | |
| if (nextbase >= item->clock) { | |
| nextbase = item->clock; | |
| } | |
| } | |
| else { | |
| waitlevel[waitevents++] = curid; | |
| // TRACEOUT(("event = %x", curid)); | |
| } | } |
| *witem++ = item; | |
| itemnext = item->next; | |
| item->next = NEVENTITEM_NONE; | |
| item = itemnext; | |
| } | |
| nevent.first = item; | |
| if (item != NEVENTITEM_TERM) { | |
| nextbase = item->clock; | |
| item = item->next; | |
| while(item != NEVENTITEM_TERM) { | |
| item->clock -= CPU_BASECLOCK; | |
| item = item->next; | |
| } | |
| } | |
| else { | |
| nextbase = NEVENT_MAXCLOCK; | |
| } | } |
| nevent.readyevents = eventnum; | |
| CPU_BASECLOCK = nextbase; | CPU_BASECLOCK = nextbase; |
| CPU_REMCLOCK += nextbase; | CPU_REMCLOCK += nextbase; |
| // TRACEOUT(("nextbase = %d (%d)", nextbase, CPU_REMCLOCK)); | // TRACEOUT(("nextbase = %d (%d)", nextbase, CPU_REMCLOCK)); |
| // イベント発生 | // イベント発生 |
| for (i=0; i<waitevents; i++) { | wi = waititem; |
| curid = waitlevel[i]; | while(wi < witem) { |
| item = nevent.item + curid; | item = *wi++; |
| if (item->proc != NULL) { | if (item->proc != NULL) { |
| item->proc(curid); | item->proc(item - nevent.item); |
| } | } |
| } | } |
| } | } |
| void nevent_reset(UINT id) { | void nevent_reset(UINT id) { |
| UINT i; | NEVENTITEM item; |
| NEVENTITEM *back; | |
| NEVENTITEM cur; | |
| // 現在進行してるイベントを検索 | item = nevent.item + id; |
| for (i=0; i<nevent.readyevents; i++) { | if (item->next != NEVENTITEM_NONE) { |
| if (nevent.level[i] == id) { | back = &nevent.first; |
| break; | cur = *back; |
| } | while(cur != item) { |
| } | __ASSERT(cur != NEVENTITEM_NONE); |
| // イベントは存在した? | __ASSERT(cur != NEVENTITEM_TERM); |
| if (i < nevent.readyevents) { | back = &cur->next; |
| // 存在していたら削る | cur = *back; |
| nevent.readyevents--; | |
| for (; i<nevent.readyevents; i++) { | |
| nevent.level[i] = nevent.level[i+1]; | |
| } | } |
| *back = cur->next; | |
| cur->next = NEVENTITEM_NONE; | |
| } | } |
| } | } |
| Line 82 void nevent_set(UINT id, SINT32 eventclo | Line 92 void nevent_set(UINT id, SINT32 eventclo |
| SINT32 clock; | SINT32 clock; |
| NEVENTITEM item; | NEVENTITEM item; |
| UINT eventid; | NEVENTITEM *back; |
| UINT i; | NEVENTITEM n; |
| NEVENTITEM p; | |
| // TRACEOUT(("event %d - %xclocks", id, eventclock)); | // TRACEOUT(("event %d - %xclocks", id, eventclock)); |
| clock = CPU_BASECLOCK - CPU_REMCLOCK; | clock = CPU_BASECLOCK - CPU_REMCLOCK; |
| item = nevent.item + id; | item = nevent.item + id; |
| item->baseclock = eventclock; | item->baseclock = eventclock; |
| item->proc = proc; | item->proc = proc; |
| if (absolute) { | if (absolute) { |
| Line 98 void nevent_set(UINT id, SINT32 eventclo | Line 110 void nevent_set(UINT id, SINT32 eventclo |
| item->clock += eventclock; | item->clock += eventclock; |
| } | } |
| // イベントの削除 | if (item->next != NEVENTITEM_NONE) { |
| nevent_reset(id); | back = &nevent.first; |
| n = *back; | |
| // イベントの挿入位置の検索 | while(n != item) { |
| for (eventid=0; eventid<nevent.readyevents; eventid++) { | __ASSERT(n != NEVENTITEM_NONE); |
| if (item->clock < nevent.item[nevent.level[eventid]].clock) { | __ASSERT(n != NEVENTITEM_TERM); |
| break; | back = &n->next; |
| } | n = *back; |
| } | } |
| *back = n->next; | |
| // イベントの挿入 | n->next = NEVENTITEM_NONE; |
| for (i=nevent.readyevents; i>eventid; i--) { | } |
| nevent.level[i] = nevent.level[i-1]; | |
| } | n = nevent.first; |
| nevent.level[eventid] = id; | if ((n == NEVENTITEM_TERM) || (item->clock < n->clock)) { |
| nevent.readyevents++; | item->next = n; |
| nevent.first = item; | |
| // もし最短イベントだったら... | |
| if (eventid == 0) { | |
| clock = CPU_BASECLOCK; | clock = CPU_BASECLOCK; |
| if (item->clock > 0) { | if (item->clock > 0) { |
| clock -= item->clock; | clock -= item->clock; |
| Line 125 void nevent_set(UINT id, SINT32 eventclo | Line 135 void nevent_set(UINT id, SINT32 eventclo |
| CPU_REMCLOCK -= clock; | CPU_REMCLOCK -= clock; |
| // TRACEOUT(("reset nextbase -%d (%d)", clock, CPU_REMCLOCK)); | // TRACEOUT(("reset nextbase -%d (%d)", clock, CPU_REMCLOCK)); |
| } | } |
| else { | |
| p = n->next; | |
| while((p != NEVENTITEM_TERM) && (item->clock >= p->clock)) { | |
| n = p; | |
| p = n->next; | |
| } | |
| item->next = p; | |
| n->next = item; | |
| } | |
| } | } |
| void nevent_repeat(UINT id) { | void nevent_repeat(UINT id) { |
| Line 137 void nevent_repeat(UINT id) { | Line 156 void nevent_repeat(UINT id) { |
| void nevent_setbyms(UINT id, SINT32 ms, NEVENTCB proc, BRESULT absolute) { | void nevent_setbyms(UINT id, SINT32 ms, NEVENTCB proc, BRESULT absolute) { |
| nevent_set(id, (pccore.realclock / 1000) * ms, proc, absolute); | SINT32 clock; |
| #if defined(FIX_Z80A) | |
| clock = (2000000 * 2 / 1000) * ms; | |
| #else | |
| clock = (pccore.realclock / 1000) * ms; | |
| #endif | |
| nevent_set(id, clock, proc, absolute); | |
| } | } |
| BRESULT nevent_iswork(UINT id) { | BRESULT nevent_iswork(UINT id) { |
| UINT i; | NEVENTITEM item; |
| // 現在進行してるイベントを検索 | item = nevent.item + id; |
| for (i=0; i<nevent.readyevents; i++) { | if (item->next != NEVENTITEM_NONE) { |
| if (nevent.level[i] == id) { | return(TRUE); |
| return(TRUE); | } |
| } | else { |
| return(FALSE); | |
| } | } |
| return(FALSE); | |
| } | } |
| SINT32 nevent_getwork(UINT id) { | SINT32 nevent_getwork(UINT id) { |
| UINT i; | NEVENTITEM item; |
| // 現在進行してるイベントを検索 | item = nevent.item + id; |
| for (i=0; i<nevent.readyevents; i++) { | if (item->next != NEVENTITEM_NONE) { |
| if (nevent.level[i] == id) { | return(item->baseclock - |
| return(nevent.item[id].baseclock - | (item->clock - (CPU_BASECLOCK - CPU_REMCLOCK))); |
| (nevent.item[id].clock - (CPU_BASECLOCK - CPU_REMCLOCK))); | } |
| } | else { |
| return(-1); | |
| } | } |
| return(-1); | |
| } | } |
| SINT32 nevent_getremain(UINT id) { | SINT32 nevent_getremain(UINT id) { |
| UINT i; | NEVENTITEM item; |
| // 現在進行してるイベントを検索 | item = nevent.item + id; |
| for (i=0; i<nevent.readyevents; i++) { | if (item->next != NEVENTITEM_NONE) { |
| if (nevent.level[i] == id) { | return(item->clock - (CPU_BASECLOCK - CPU_REMCLOCK)); |
| return(nevent.item[id].clock - (CPU_BASECLOCK - CPU_REMCLOCK)); | } |
| } | else { |
| return(-1); | |
| } | } |
| return(-1); | |
| } | } |
| void nevent_forceexit(void) { | void nevent_forceexit(void) { |