95
95
void c64dtvflash_store(int addr, BYTE value)
98
if (flash_log_enabled) log_message(c64dtvflash_log, "flash_store: addr %x, value %x, mode %i\n",addr,value,c64dtvflash_state);
99
switch(c64dtvflash_state) {
98
if (flash_log_enabled) {
99
log_message(c64dtvflash_log, "flash_store: addr %x, value %x, mode %i\n", addr, value, c64dtvflash_state);
101
switch (c64dtvflash_state) {
101
if (((addr&0xffe)==0xaaa)&&(value==0xaa)) c64dtvflash_state=FLASH_CMD1;
103
if (((addr & 0xffe) == 0xaaa) && (value == 0xaa)) {
104
c64dtvflash_state = FLASH_CMD1;
104
if (((addr&0xffe)==0x554)&&(value==0x55))
105
c64dtvflash_state=FLASH_CMD2;
107
c64dtvflash_state=FLASH_IDLE;
108
if (((addr & 0xffe) == 0x554) && (value == 0x55)) {
109
c64dtvflash_state = FLASH_CMD2;
111
c64dtvflash_state = FLASH_IDLE;
110
if ((addr&0xffe)==0xaaa) {
112
case 0x90: c64dtvflash_state=FLASH_PRODUCTID; return; /* Product ID Entry */
113
case 0xf0: c64dtvflash_state=FLASH_IDLE; return; /* Product ID Exit */
114
case 0x80: c64dtvflash_state=FLASH_CMD3; return; /* Erase/Single Pulse Program/Lockdown */
115
case 0xa0: c64dtvflash_state=FLASH_PROGRAM; return; /* Byte/Word Program */
116
case 0xd0: c64dtvflash_state=FLASH_SETCONF; return; /* Set Configuration Register */
117
case 0xc0: c64dtvflash_state=FLASH_PROGPROT; return; /* Program/Lock Protection Register */
118
default: c64dtvflash_state=FLASH_IDLE; return;
115
if ((addr & 0xffe) == 0xaaa) {
117
case 0x90: c64dtvflash_state = FLASH_PRODUCTID; return; /* Product ID Entry */
118
case 0xf0: c64dtvflash_state = FLASH_IDLE; return; /* Product ID Exit */
119
case 0x80: c64dtvflash_state = FLASH_CMD3; return; /* Erase/Single Pulse Program/Lockdown */
120
case 0xa0: c64dtvflash_state = FLASH_PROGRAM; return; /* Byte/Word Program */
121
case 0xd0: c64dtvflash_state = FLASH_SETCONF; return; /* Set Configuration Register */
122
case 0xc0: c64dtvflash_state = FLASH_PROGPROT; return; /* Program/Lock Protection Register */
123
default: c64dtvflash_state = FLASH_IDLE; return;
120
} else c64dtvflash_state=FLASH_IDLE;
126
c64dtvflash_state = FLASH_IDLE;
122
129
case FLASH_PRODUCTID: /* Product ID Mode */
123
if (value==0xf0) c64dtvflash_state=FLASH_IDLE; /* Product ID Exit */
131
c64dtvflash_state = FLASH_IDLE; /* Product ID Exit */
125
134
case FLASH_CMD3: /* Erase/Single Pulse Program/Lockdown */
126
if (((addr&0xffe)==0xaaa)&&(value==0xaa))
127
c64dtvflash_state=FLASH_CMD4;
129
c64dtvflash_state=FLASH_IDLE;
135
if (((addr & 0xffe) == 0xaaa) && (value == 0xaa)) {
136
c64dtvflash_state = FLASH_CMD4;
138
c64dtvflash_state = FLASH_IDLE;
131
141
case FLASH_CMD4: /* Erase/Single Pulse Program/Lockdown */
132
if (((addr&0xffe)==0x554)&&(value==0x55))
133
c64dtvflash_state=FLASH_CMD5;
135
c64dtvflash_state=FLASH_IDLE;
142
if (((addr & 0xffe) == 0x554) && (value == 0x55)) {
143
c64dtvflash_state = FLASH_CMD5;
145
c64dtvflash_state = FLASH_IDLE;
137
148
case FLASH_CMD5: /* Erase/Single Pulse Program/Lockdown */
139
150
case 0x30: /* Sector Erase */
140
if ((addr>>16)==0x1f) {
151
if ((addr >> 16) == 0x1f) {
152
j = (addr & 0x1fe000);
155
j = (addr & 0x1f0000);
147
158
if (c64dtvflash_mem_lock[paddr_to_sector(addr)]) {
148
if (flash_log_enabled) log_message(c64dtvflash_log, "flash: ignoring erase (locked) %06x-%06x\n",j,k);
159
if (flash_log_enabled) {
160
log_message(c64dtvflash_log, "flash: ignoring erase (locked) %06x-%06x\n", j, k);
150
for (i=j;i<k;i++) c64dtvflash_mem[i]=0xff;
151
if (flash_log_enabled) log_message(c64dtvflash_log, "flash: erased %06x-%06x\n",j,k);
163
for (i = j; i < k; i++) {
164
c64dtvflash_mem[i] = 0xff;
166
if (flash_log_enabled) {
167
log_message(c64dtvflash_log, "flash: erased %06x-%06x\n", j, k);
154
171
case 0x10: /* Chip Erase */
155
for (i=0;i<0x200000;i++) {
156
if (!(c64dtvflash_mem_lock[paddr_to_sector(addr)])) c64dtvflash_mem[i]=0xff;
158
if (flash_log_enabled) log_message(c64dtvflash_log, "flash: chip erased\n");
172
for (i = 0; i < 0x200000; i++) {
173
if (!(c64dtvflash_mem_lock[paddr_to_sector(addr)])) {
174
c64dtvflash_mem[i] = 0xff;
177
if (flash_log_enabled) {
178
log_message(c64dtvflash_log, "flash: chip erased\n");
160
181
case 0x60: /* Sector Lockdown */
161
c64dtvflash_mem_lock[paddr_to_sector(addr)]=0xff;
162
if (flash_log_enabled) log_message(c64dtvflash_log, "flash: sector %i lockdown\n",paddr_to_sector(addr));
182
c64dtvflash_mem_lock[paddr_to_sector(addr)] = 0xff;
183
if (flash_log_enabled) {
184
log_message(c64dtvflash_log, "flash: sector %i lockdown\n", paddr_to_sector(addr));
164
187
case 0xa0: /* Single Pulse Program Mode */
165
c64dtvflash_state=FLASH_SPPROGRAM;
166
if (flash_log_enabled) log_message(c64dtvflash_log, "flash: entering single pulse program mode\n");
188
c64dtvflash_state = FLASH_SPPROGRAM;
189
if (flash_log_enabled) {
190
log_message(c64dtvflash_log, "flash: entering single pulse program mode\n");
169
c64dtvflash_state=FLASH_IDLE;
194
c64dtvflash_state = FLASH_IDLE;
171
196
case FLASH_PROGRAM: /* Byte/Word Program */
172
197
if (c64dtvflash_mem_lock[paddr_to_sector(addr)]) {
173
if (flash_log_enabled) log_message(c64dtvflash_log, "flash: ignoring byte program (locked) %02x to %06x\n",value,addr);
198
if (flash_log_enabled) {
199
log_message(c64dtvflash_log, "flash: ignoring byte program (locked) %02x to %06x\n", value, addr);
175
c64dtvflash_mem[addr]&=value;
176
if (flash_log_enabled) log_message(c64dtvflash_log, "flash: written %02x to %06x\n", c64dtvflash_mem[addr], addr); /* DEBUG */
202
c64dtvflash_mem[addr] &= value;
203
if (flash_log_enabled) {
204
log_message(c64dtvflash_log, "flash: written %02x to %06x\n", c64dtvflash_mem[addr], addr); /* DEBUG */
178
c64dtvflash_state=FLASH_IDLE;
207
c64dtvflash_state = FLASH_IDLE;
180
209
case FLASH_SETCONF: /* Set Configuration Register */
181
c64dtvflash_state=FLASH_IDLE;
182
if (flash_log_enabled) log_message(c64dtvflash_log, "flash: set configuration register %02x (unimplemented)\n",value);
210
c64dtvflash_state = FLASH_IDLE;
211
if (flash_log_enabled) {
212
log_message(c64dtvflash_log, "flash: set configuration register %02x (unimplemented)\n", value);
184
215
case FLASH_PROGPROT: /* Program/Lock Protection Register */
185
if ((addr==0x100)&&((value&0xf)==0)) {
186
if (flash_log_enabled) log_message(c64dtvflash_log, "flash: lock protection register (unimplemented)\n");
216
if ((addr == 0x100) && ((value & 0xf) == 0)) {
217
if (flash_log_enabled) {
218
log_message(c64dtvflash_log, "flash: lock protection register (unimplemented)\n");
188
if (flash_log_enabled) log_message(c64dtvflash_log, "flash: program protection register %x = %02x (unimplemented)\n",addr,value);
221
if (flash_log_enabled) {
222
log_message(c64dtvflash_log, "flash: program protection register %x = %02x (unimplemented)\n", addr, value);
190
c64dtvflash_state=FLASH_IDLE;
225
c64dtvflash_state = FLASH_IDLE;
192
227
case FLASH_SPPROGRAM: /* Single Pulse Program Mode */
193
if (!(c64dtvflash_mem_lock[paddr_to_sector(addr)])) c64dtvflash_mem[addr]&=value;
228
if (!(c64dtvflash_mem_lock[paddr_to_sector(addr)])) {
229
c64dtvflash_mem[addr] &= value;
196
233
log_message(c64dtvflash_log, "BUG: Unknown flash chip emulation state.");
306
350
/* ------------------------------------------------------------------------- */
308
unsigned int c64dtvflash_rom_loaded=0;
352
unsigned int c64dtvflash_rom_loaded = 0;
310
354
static int c64dtvflash_load_rom(void)
312
int retval=0; /* need to change this when ui gets changed for error indication */
313
if (flash_log_enabled) log_message(c64dtvflash_log, "loading ROM");
314
if (!util_check_null_string(c64dtvflash_filename))
316
if ((retval = util_file_load(c64dtvflash_filename, c64dtvflash_mem, (size_t)0x200000, UTIL_FILE_LOAD_RAW)) < 0)
318
log_message(c64dtvflash_log, "Reading C64DTV ROM image %s failed.", c64dtvflash_filename);
356
int retval = 0; /* need to change this when ui gets changed for error indication */
357
if (flash_log_enabled) {
358
log_message(c64dtvflash_log, "loading ROM");
360
if (!util_check_null_string(c64dtvflash_filename)) {
361
if ((retval = util_file_load(c64dtvflash_filename, c64dtvflash_mem, (size_t)0x200000, UTIL_FILE_LOAD_RAW)) < 0) {
362
log_message(c64dtvflash_log, "Reading C64DTV ROM image %s failed.", c64dtvflash_filename);
365
log_message(c64dtvflash_log, "Read C64DTV ROM image %s.", c64dtvflash_filename);
321
log_message(c64dtvflash_log, "Read C64DTV ROM image %s.", c64dtvflash_filename);
324
log_message(c64dtvflash_log, "No C64DTV ROM image filename specified.");
329
/* copy ROMs to Flash ROM emulation if no image file specified */
331
if (flash_log_enabled) log_message(c64dtvflash_log, "copy ROMs to Flash");
332
memcpy(c64dtvflash_mem + 0xe000, c64memrom_kernal64_rom,
333
C64_KERNAL_ROM_SIZE);
334
memcpy(c64dtvflash_mem + 0xa000, c64memrom_basic64_rom,
336
memcpy(c64dtvflash_mem + 0x1000, mem_chargen_rom,
337
C64_CHARGEN_ROM_SIZE);
338
memcpy(c64dtvflash_mem + 0x9000, mem_chargen_rom,
339
C64_CHARGEN_ROM_SIZE);
340
memcpy(c64dtvflash_mem + 0xd000, mem_chargen_rom,
341
C64_CHARGEN_ROM_SIZE);
343
c64dtvflash_rom_loaded = retval;
368
log_message(c64dtvflash_log, "No C64DTV ROM image filename specified.");
373
/* copy ROMs to Flash ROM emulation if no image file specified */
375
if (flash_log_enabled) {
376
log_message(c64dtvflash_log, "copy ROMs to Flash");
378
memcpy(c64dtvflash_mem + 0xe000, c64memrom_kernal64_rom,
379
C64_KERNAL_ROM_SIZE);
380
memcpy(c64dtvflash_mem + 0xa000, c64memrom_basic64_rom,
382
memcpy(c64dtvflash_mem + 0x1000, mem_chargen_rom,
383
C64_CHARGEN_ROM_SIZE);
384
memcpy(c64dtvflash_mem + 0x9000, mem_chargen_rom,
385
C64_CHARGEN_ROM_SIZE);
386
memcpy(c64dtvflash_mem + 0xd000, mem_chargen_rom,
387
C64_CHARGEN_ROM_SIZE);
389
c64dtvflash_rom_loaded = retval;
348
394
void c64dtvflash_init(void)
350
if (c64dtvflash_log == LOG_ERR)
351
c64dtvflash_log = log_open("C64DTVFLASH");
353
c64dtvflash_load_rom();
355
if (flash_log_enabled) log_message(c64dtvflash_log, "END init");
396
if (c64dtvflash_log == LOG_ERR) {
397
c64dtvflash_log = log_open("C64DTVFLASH");
400
c64dtvflash_load_rom();
402
if (flash_log_enabled) {
403
log_message(c64dtvflash_log, "END init");
358
407
void c64dtvflash_shutdown(void)
360
if (!util_check_null_string(c64dtvflash_filename))
362
if (c64dtvflash_mem_rw) {
363
if (util_file_save(c64dtvflash_filename, c64dtvflash_mem, 0x200000) < 0)
364
log_message(c64dtvflash_log, "Writing C64DTV ROM image %s failed.", c64dtvflash_filename);
366
log_message(c64dtvflash_log, "Wrote C64DTV ROM image %s.", c64dtvflash_filename);
369
if (flash_log_enabled) log_message(c64dtvflash_log, "END shutdown");
409
if (!util_check_null_string(c64dtvflash_filename)) {
410
if (c64dtvflash_mem_rw) {
411
if (util_file_save(c64dtvflash_filename, c64dtvflash_mem, 0x200000) < 0) {
412
log_message(c64dtvflash_log, "Writing C64DTV ROM image %s failed.", c64dtvflash_filename);
414
log_message(c64dtvflash_log, "Wrote C64DTV ROM image %s.", c64dtvflash_filename);
418
if (flash_log_enabled) {
419
log_message(c64dtvflash_log, "END shutdown");
373
424
void c64dtvflash_reset(void)
376
c64dtvflash_state = FLASH_IDLE;
377
for (i=0;i<39;i++) c64dtvflash_mem_lock[i] = 0;
427
c64dtvflash_state = FLASH_IDLE;
428
for (i = 0; i < 39; i++) {
429
c64dtvflash_mem_lock[i] = 0;
380
433
/* ------------------------------------------------------------------------- */