X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=dcpu16.h;h=ebf20721051e11823f4113735d443a13541d56bd;hb=57241bb9e6f6b1acb019efe4f32eb758cf9e93d7;hp=f2bf787b52a589525961ec69fd75cdf03bc1c565;hpb=0a1b4588f79e3719af9431a98da44350030df754;p=dcpu16 diff --git a/dcpu16.h b/dcpu16.h index f2bf787..ebf2072 100644 --- a/dcpu16.h +++ b/dcpu16.h @@ -40,6 +40,7 @@ struct dcpu16 { size_t hw_table_entries_; /* hardware list maintenance */ size_t hw_table_allocated_; /* hardware list maintenance */ + unsigned long long cycle_; /* number of cycles this core has executed */ unsigned int skip_ : 1; /* skip execution of next instruction */ unsigned int interrupts_deferred_ : 1; /* queue software interrupts */ unsigned int on_fire_ : 1; /* cpu is on fire */ @@ -48,7 +49,6 @@ struct dcpu16 { size_t interrupts_head_; /* interrupt queue maintenance */ size_t interrupts_tail_; /* interrupt queue maintenance */ - unsigned long long cycle; /* number of cycles this core has executed */ DCPU16_WORD reg[DCPU16_REG__NUM]; /* system registers, a b c x y z i j */ DCPU16_WORD ram[DCPU16_RAM]; /* memory */ }; @@ -68,6 +68,7 @@ struct dcpu16_acct_cb { }; typedef void (dcpu16_hw_signal_t)(struct dcpu16 *, void *); +typedef void (dcpu16_hw_data_free_t)(struct dcpu16_hw *); /* these are used to define hardware attached to the system */ struct dcpu16_hw { struct dcpu16 *vm; /* which system do I belong to */ @@ -82,9 +83,18 @@ struct dcpu16_hw { dcpu16_hw_signal_t *hwi; dcpu16_hw_signal_t *cycle; dcpu16_hw_signal_t *reset; + + dcpu16_hw_data_free_t *data_free; void *data; }; +typedef int (dcpu16_hw_data_init_t)(struct dcpu16_hw *, void *); +struct dcpu16_hw_module { + struct dcpu16_hw *template; + dcpu16_hw_data_init_t *data_init; + dcpu16_hw_data_free_t *data_free; +}; + /* instantiate a new core */ struct dcpu16 *dcpu16_new(void); @@ -116,6 +126,7 @@ void dcpu16_step(struct dcpu16 *); void dcpu16_delete(struct dcpu16 **); int dcpu16_interrupt(struct dcpu16 *, DCPU16_WORD); +void dcpu16_cycle_inc(struct dcpu16 *, unsigned int); /* register callbacks to handle warning and debug messages, default is writing to stderr, may be set to null */ void dcpu16_warn_cb_set(void (*)(char *, ...));