diff --git a/src/disk/mo.c b/src/disk/mo.c index 27bf7e5e0..c93f4b055 100644 --- a/src/disk/mo.c +++ b/src/disk/mo.c @@ -343,6 +343,11 @@ mo_load(mo_t *dev, char *fn) uint32_t size = 0; unsigned int found = 0; + if (!dev->drv) { + mo_eject(dev->id); + return 0; + } + is_mdi = image_is_mdi(fn); dev->drv->fp = plat_fopen(fn, dev->drv->read_only ? "rb" : "rb+"); @@ -403,7 +408,7 @@ mo_disk_reload(mo_t *dev) void mo_disk_unload(mo_t *dev) { - if (dev->drv->fp) { + if (dev->drv && dev->drv->fp) { fclose(dev->drv->fp); dev->drv->fp = NULL; } @@ -412,7 +417,7 @@ mo_disk_unload(mo_t *dev) void mo_disk_close(mo_t *dev) { - if (dev->drv->fp) { + if (dev->drv && dev->drv->fp) { mo_disk_unload(dev); memcpy(dev->drv->prev_image_path, dev->drv->image_path, sizeof(dev->drv->prev_image_path)); diff --git a/src/disk/zip.c b/src/disk/zip.c index 887a9c68e..7045b1e41 100644 --- a/src/disk/zip.c +++ b/src/disk/zip.c @@ -485,6 +485,11 @@ zip_load(zip_t *dev, char *fn) { int size = 0; + if (!dev->drv) { + zip_eject(dev->id); + return 0; + } + dev->drv->fp = plat_fopen(fn, dev->drv->read_only ? "rb" : "rb+"); if (!dev->drv->fp) { if (!dev->drv->read_only) { @@ -548,7 +553,7 @@ zip_disk_reload(zip_t *dev) void zip_disk_unload(zip_t *dev) { - if (dev->drv->fp) { + if (dev->drv && dev->drv->fp) { fclose(dev->drv->fp); dev->drv->fp = NULL; } @@ -557,7 +562,7 @@ zip_disk_unload(zip_t *dev) void zip_disk_close(zip_t *dev) { - if (dev->drv->fp) { + if (dev->drv && dev->drv->fp) { zip_disk_unload(dev); memcpy(dev->drv->prev_image_path, dev->drv->image_path, sizeof(dev->drv->prev_image_path)); diff --git a/src/video/vid_voodoo_fifo.c b/src/video/vid_voodoo_fifo.c index 8a84dabe4..f8495edec 100644 --- a/src/video/vid_voodoo_fifo.c +++ b/src/video/vid_voodoo_fifo.c @@ -160,7 +160,7 @@ cmdfifo_get(voodoo_t *voodoo) uint32_t val; if (!voodoo->cmdfifo_in_sub) { - while (voodoo->cmdfifo_depth_rd == voodoo->cmdfifo_depth_wr) { + while (voodoo->fifo_thread_run && (voodoo->cmdfifo_depth_rd == voodoo->cmdfifo_depth_wr)) { thread_wait_event(voodoo->wake_fifo_thread, -1); thread_reset_event(voodoo->wake_fifo_thread); }