mirror of
https://github.com/buserror/mii_emu.git
synced 2024-06-25 15:29:30 +00:00
Added mii_dispose() -- clean up everything
Seems there are no leaks; only blocks left non-freed are the queue of drivers, which is static anyway Also added a MII_TERMINATE state to quit any 'main' loop. Signed-off-by: Michel Pollet <buserror@gmail.com>
This commit is contained in:
parent
73059bfd93
commit
5d0abefadf
|
@ -308,7 +308,7 @@ extern const unsigned int mii_droid_size;
|
||||||
nk_x11_render(NK_ANTI_ALIASING_ON, MAX_VERTEX_BUFFER, MAX_ELEMENT_BUFFER);
|
nk_x11_render(NK_ANTI_ALIASING_ON, MAX_VERTEX_BUFFER, MAX_ELEMENT_BUFFER);
|
||||||
glXSwapBuffers(win.dpy, win.win);
|
glXSwapBuffers(win.dpy, win.win);
|
||||||
}
|
}
|
||||||
|
mii_dispose(&g_mii);
|
||||||
cleanup:
|
cleanup:
|
||||||
nk_x11_shutdown();
|
nk_x11_shutdown();
|
||||||
glXMakeCurrent(win.dpy, 0, 0);
|
glXMakeCurrent(win.dpy, 0, 0);
|
||||||
|
|
|
@ -167,6 +167,9 @@ static void *mii_thread_func(void *arg)
|
||||||
break;
|
break;
|
||||||
case MII_RUNNING:
|
case MII_RUNNING:
|
||||||
break;
|
break;
|
||||||
|
case MII_TERMINATE:
|
||||||
|
mii_thread_running = false;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mii->video.frame_count != last_frame) {
|
if (mii->video.frame_count != last_frame) {
|
||||||
|
@ -193,6 +196,7 @@ static void *mii_thread_func(void *arg)
|
||||||
usleep(sleep_time);
|
usleep(sleep_time);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mii_dispose(mii);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
17
src/mii.c
17
src/mii.c
|
@ -497,7 +497,6 @@ mii_init(
|
||||||
mii->bank[MII_BANK_ROM].mem = (uint8_t*)&iie_enhanced_rom_bin[0];
|
mii->bank[MII_BANK_ROM].mem = (uint8_t*)&iie_enhanced_rom_bin[0];
|
||||||
mii->cpu.trap = MII_TRAP;
|
mii->cpu.trap = MII_TRAP;
|
||||||
mii_reset(mii, true);
|
mii_reset(mii, true);
|
||||||
mii_speaker_init(mii, &mii->speaker);
|
|
||||||
mii->cpu_state = mii_cpu_init(&mii->cpu);
|
mii->cpu_state = mii_cpu_init(&mii->cpu);
|
||||||
for (int i = 0; i < 7; i++)
|
for (int i = 0; i < 7; i++)
|
||||||
mii->slot[i].id = i;
|
mii->slot[i].id = i;
|
||||||
|
@ -508,6 +507,8 @@ mii_prepare(
|
||||||
mii_t *mii,
|
mii_t *mii,
|
||||||
uint32_t flags )
|
uint32_t flags )
|
||||||
{
|
{
|
||||||
|
mii_dd_system_init(mii, &mii->dd);
|
||||||
|
mii_speaker_init(mii, &mii->speaker);
|
||||||
printf("%s driver table\n", __func__);
|
printf("%s driver table\n", __func__);
|
||||||
mii_slot_drv_t * drv = mii_slot_drv_list;
|
mii_slot_drv_t * drv = mii_slot_drv_list;
|
||||||
while (drv) {
|
while (drv) {
|
||||||
|
@ -519,6 +520,20 @@ mii_prepare(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mii_dispose(
|
||||||
|
mii_t *mii )
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
if (mii->slot[i].drv && mii->slot[i].drv->dispose)
|
||||||
|
mii->slot[i].drv->dispose(mii, &mii->slot[i]);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < MII_BANK_COUNT; i++)
|
||||||
|
mii_bank_dispose(&mii->bank[i]);
|
||||||
|
mii_speaker_dispose(&mii->speaker);
|
||||||
|
mii_dd_system_dispose(&mii->dd);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mii_reset(
|
mii_reset(
|
||||||
mii_t *mii,
|
mii_t *mii,
|
||||||
|
|
17
src/mii.h
17
src/mii.h
|
@ -11,7 +11,6 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include "mii_65c02.h"
|
#include "mii_65c02.h"
|
||||||
#include "fifo_declare.h"
|
|
||||||
#include "mii_dd.h"
|
#include "mii_dd.h"
|
||||||
#include "mii_bank.h"
|
#include "mii_bank.h"
|
||||||
#include "mii_slot.h"
|
#include "mii_slot.h"
|
||||||
|
@ -33,7 +32,10 @@ enum {
|
||||||
MII_BANK_COUNT,
|
MII_BANK_COUNT,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A 'trap' is a sequence of 2 special NOPs that are used to trigger
|
||||||
|
* a callback. The callback is called with the mii_t * and the trap ID
|
||||||
|
*/
|
||||||
typedef void (*mii_trap_handler_cb)(
|
typedef void (*mii_trap_handler_cb)(
|
||||||
mii_t * mii,
|
mii_t * mii,
|
||||||
uint8_t trap);
|
uint8_t trap);
|
||||||
|
@ -49,6 +51,7 @@ enum {
|
||||||
MII_RUNNING = 0, // default
|
MII_RUNNING = 0, // default
|
||||||
MII_STOPPED,
|
MII_STOPPED,
|
||||||
MII_STEP,
|
MII_STEP,
|
||||||
|
MII_TERMINATE,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -144,6 +147,12 @@ void
|
||||||
mii_prepare(
|
mii_prepare(
|
||||||
mii_t *mii,
|
mii_t *mii,
|
||||||
uint32_t flags );
|
uint32_t flags );
|
||||||
|
/*
|
||||||
|
* Stop the emulator, dispose of everything, free memory etc.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
mii_dispose(
|
||||||
|
mii_t *mii );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parses arguments until in finds one that isn't for mii, and returns
|
* Parses arguments until in finds one that isn't for mii, and returns
|
||||||
|
@ -262,8 +271,8 @@ extern mii_slot_drv_t * mii_slot_drv_list;
|
||||||
#define MII_TRAP 0xdbfb
|
#define MII_TRAP 0xdbfb
|
||||||
/*
|
/*
|
||||||
* Request a trap ID for the given callback. Calling code is responsible
|
* Request a trap ID for the given callback. Calling code is responsible
|
||||||
* for setting up the trap using the 2 magic NOPs in sequence. See mii_smartport.c
|
* for setting up the trap using the 2 magic NOPs in sequence.
|
||||||
* for an example.
|
* See mii_smartport.c for an example.
|
||||||
*/
|
*/
|
||||||
uint8_t
|
uint8_t
|
||||||
mii_register_trap(
|
mii_register_trap(
|
||||||
|
|
Loading…
Reference in New Issue
Block a user