Mercurial > repos > blastem
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; |