Mirror of CollapseOS
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

77 рядки
2.2KB

  1. #include <string.h>
  2. #include "sms_vdp.h"
  3. void vdp_init(VDP *vdp)
  4. {
  5. tms_init(&vdp->tms);
  6. memset(vdp->cram, 0, VDP_CRAM_SIZE);
  7. }
  8. void vdp_cmd_wr(VDP *vdp, uint8_t val)
  9. {
  10. if (!vdp->tms.has_cmdlsb) {
  11. tms_cmd_wr(&vdp->tms, val);
  12. } else {
  13. if ((val & 0xc0) == 0xc0) {
  14. // palette RAM
  15. // curaddr > VRAM == addr in CRAM
  16. vdp->tms.curaddr = TMS_VRAM_SIZE + (vdp->tms.cmdlsb&0x1f);
  17. } else {
  18. tms_cmd_wr(&vdp->tms, val);
  19. }
  20. }
  21. }
  22. uint8_t vdp_data_rd(VDP *vdp)
  23. {
  24. TMS9918 *tms = &vdp->tms;
  25. if (tms->curaddr < TMS_VRAM_SIZE) {
  26. return tms_data_rd(&vdp->tms);
  27. } else if (tms->curaddr - TMS_VRAM_SIZE < VDP_CRAM_SIZE) {
  28. return vdp->cram[tms->curaddr++-TMS_VRAM_SIZE];
  29. } else {
  30. return 0;
  31. }
  32. }
  33. void vdp_data_wr(VDP *vdp, uint8_t val)
  34. {
  35. TMS9918 *tms = &vdp->tms;
  36. if (tms->curaddr < TMS_VRAM_SIZE) {
  37. tms_data_wr(&vdp->tms, val);
  38. } else if (tms->curaddr - TMS_VRAM_SIZE < VDP_CRAM_SIZE) {
  39. vdp->cram[tms->curaddr++-TMS_VRAM_SIZE] = val;
  40. }
  41. }
  42. uint8_t vdp_pixel(VDP *vdp, uint16_t x, uint16_t y)
  43. {
  44. if (x >= VDP_SCREENW) {
  45. return 0;
  46. }
  47. if (y >= VDP_SCREENH) {
  48. return 0;
  49. }
  50. TMS9918 *tms = &vdp->tms;
  51. // name table offset
  52. uint16_t offset = (tms->regs[2] & 0xe) << 10;
  53. offset += ((y/8) << 6) + ((x/8) << 1);
  54. uint16_t tableval = tms->vram[offset] + (tms->vram[offset+1] << 8);
  55. uint16_t tilenum = tableval & 0x1ff;
  56. // is palette select bit on? if yes, use sprite palette instead
  57. uint8_t palettemod = tableval & 0x800 ? 0x10 : 0;
  58. // tile offset this time. Each tile is 0x20 bytes long.
  59. offset = tilenum * 0x20;
  60. // Each 4 byte is a row. Find row first.
  61. offset += ((y%8) * 4);
  62. uint8_t bitnum = 7 - (x%8);
  63. // Now, let's compose the result by pushing the right bit of our 4 bytes
  64. // into our result.
  65. uint8_t palette_id = ((tms->vram[offset] >> bitnum) & 1) + \
  66. (((tms->vram[offset+1] >> bitnum) & 1) << 1) + \
  67. (((tms->vram[offset+2] >> bitnum) & 1) << 2) + \
  68. (((tms->vram[offset+3] >> bitnum) & 1) << 3);
  69. uint8_t rgb = vdp->cram[palettemod+palette_id];
  70. return rgb;
  71. }