Mercurial > repos > blastem
diff segacd.c @ 2058:70260f6051dd segacd
Initial work on CDC emulation
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 21 Jan 2022 20:24:48 -0800 |
parents | 88deea42caf0 |
children | 7c1760b5b3e5 |
line wrap: on
line diff
--- a/segacd.c Thu Jan 20 00:56:46 2022 -0800 +++ b/segacd.c Fri Jan 21 20:24:48 2022 -0800 @@ -355,6 +355,10 @@ } case GA_MEM_MODE: return cd->gate_array[reg] & 0xFF1F; + case GA_CDC_CTRL: + return cd->gate_array[reg] | cd->cdc.ar; + case GA_CDC_REG_DATA: + return lc8951_reg_read(&cd->cdc); case GA_STOP_WATCH: case GA_TIMER: timers_run(cd, m68k->current_cycle); @@ -457,6 +461,14 @@ cd->gate_array[reg] |= value & (BIT_RET|BIT_MEM_MODE|MASK_PRIORITY); break; } + case GA_CDC_CTRL: + lc8951_ar_write(&cd->cdc, value); + cd->gate_array[reg] &= 0xC000; + cd->gate_array[reg] = value & 0x0700; + break; + case GA_CDC_REG_DATA: + lc8951_reg_write(&cd->cdc, value); + break; case GA_STOP_WATCH: //docs say you should only write zero to reset //mcd-verificator comments suggest any value will reset @@ -517,6 +529,13 @@ //these registers treat all writes as word-wide value16 = value | (value << 8); break; + case GA_CDC_CTRL: + if (address & 1) { + lc8951_ar_write(&cd->cdc, value); + } else { + cd->gate_array[reg] = value << 8; + } + return vcontext; default: if (address & 1) { value16 = cd->gate_array[reg] & 0xFF00 | value; @@ -829,6 +848,7 @@ cd->memptr_start_index = 0; cd->gate_array[1] = 1; cd->gate_array[0x1B] = 0x100; + lc8951_init(&cd->cdc); return cd; }