| version 1.3, 2004/08/11 17:45:06 | version 1.5, 2008/06/02 20:07:30 | 
| 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; | 
 | } | } | 
 | CPU_BASECLOCK -= clock; | CPU_BASECLOCK -= clock; | 
 | 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; | 
 | } | } | 
 | } | } | 
 |  |  | 
| 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) { |