comparison upd78k2_util.c @ 2716:033d8d4308e3

Fix enough issues in uPD78K/II core so that LaserActive firmware regularly polls front-panel button state
author Michael Pavone <pavone@retrodev.com>
date Sat, 12 Jul 2025 22:25:20 -0700
parents d30e7f605ff8
children 8ce5d1a7ef54
comparison
equal deleted inserted replaced
2715:8d4ee0c04ee0 2716:033d8d4308e3
186 } 186 }
187 187
188 uint8_t upd78237_sfr_read(uint32_t address, void *context) 188 uint8_t upd78237_sfr_read(uint32_t address, void *context)
189 { 189 {
190 upd78k2_context *upd = context; 190 upd78k2_context *upd = context;
191 if (address < 8) {
192 return upd->port_data[address];
193 }
194 switch (address) 191 switch (address)
195 { 192 {
193 case 0x00:
194 case 0x04:
195 case 0x05:
196 case 0x06:
197 return upd->port_data[address];
198 case 0x02:
199 case 0x07:
200 //input only
201 if (upd->io_read) {
202 upd->io_read(upd, address);
203 }
204 return upd->port_input[address];
205 break;
206 case 0x01:
207 case 0x03:
208 if (upd->io_read) {
209 upd->io_read(upd, address);
210 }
211 return (upd->port_input[address] & upd->port_mode[address]) | (upd->port_data[address] & ~upd->port_mode[address]);
196 case 0x10: 212 case 0x10:
197 return upd->cr00; 213 return upd->cr00;
198 case 0x11: 214 case 0x11:
199 return upd->cr00 >> 8; 215 return upd->cr00 >> 8;
200 case 0x12: 216 case 0x12:
260 case 0x04: 276 case 0x04:
261 case 0x05: 277 case 0x05:
262 case 0x06: 278 case 0x06:
263 printf("P%X: %02X\n", address & 7, value); 279 printf("P%X: %02X\n", address & 7, value);
264 upd->port_data[address & 7] = value; 280 upd->port_data[address & 7] = value;
281 if (upd->io_write) {
282 upd->io_write(upd, address);
283 }
265 break; 284 break;
266 case 0x10: 285 case 0x10:
267 upd78k2_update_timer0(upd); 286 upd78k2_update_timer0(upd);
268 upd->cr00 &= 0xFF00; 287 upd->cr00 &= 0xFF00;
269 upd->cr00 |= value; 288 upd->cr00 |= value;
398 upd->ism0 &= 0xFF; 417 upd->ism0 &= 0xFF;
399 upd->ism0 |= value << 8; 418 upd->ism0 |= value << 8;
400 printf("ISM0: %04X\n", upd->ism0); 419 printf("ISM0: %04X\n", upd->ism0);
401 break; 420 break;
402 case 0xF4: 421 case 0xF4:
422 printf("INTM0: %02X\n", value);
403 upd->intm0 = value; 423 upd->intm0 = value;
404 break; 424 break;
405 case 0xF5: 425 case 0xF5:
426 printf("INTM1: %02X\n", value);
406 upd->intm1 = value; 427 upd->intm1 = value;
407 break; 428 break;
408 case 0xF8: 429 case 0xF8:
409 upd->ist = value; 430 upd->ist = value;
410 break; 431 break;