- Timestamp:
- 09/02/2017 06:14:05 PM (7 years ago)
- Branches:
- master
- Children:
- 4f967e8
- Parents:
- 8c8a883
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
emu/vid.c
r8c8a883 rb6f5f64 34 34 #define REG_ODTBA 7 35 35 #define REG_ATBA 8 36 #define REG_CGBA 10 36 37 #define REG_ATBAC 11 37 38 … … 48 49 #define OD0_BLA 0x0010 49 50 #define OD0_CB 0x0800 51 52 #define AT_CG 0x8000 50 53 51 54 #define WIN_SZ_W 0x10000 … … 63 66 uint16_t *mem; 64 67 bool tran; 65 } bm_obj_t; 68 int32_t fon_h; 69 } obj_t; 66 70 67 71 static int32_t reg_off = REG_OFF; … … 72 76 static uint32_t pal[16]; 73 77 74 static bm_obj_t bm_objs[16];75 static int32_t n_ bm_objs = 0;78 static obj_t objs[16]; 79 static int32_t n_objs = 0; 76 80 77 81 static SDL_Window *win; … … 80 84 static SDL_atomic_t frame; 81 85 86 static void rend_bm(uint16_t *vid, int32_t w, int32_t h, uint32_t *pix, int32_t pitch) 87 { 88 for (int32_t y = 0; y < h; ++y) { 89 for (int32_t x = 0; x < w / 4; ++x) { 90 uint16_t v4 = *vid++; 91 92 *pix++ = pal[(v4 & 0x000f) >> 0]; 93 *pix++ = pal[(v4 & 0x00f0) >> 4]; 94 *pix++ = pal[(v4 & 0x0f00) >> 8]; 95 *pix++ = pal[(v4 & 0xf000) >> 12]; 96 } 97 98 pix += pitch / 4 - w; 99 } 100 } 101 102 static void rend_tx(uint16_t *vid, int32_t w, int32_t h, int32_t fon_h, 103 uint32_t *pix, int32_t pitch) 104 { 105 int32_t cgba = mem[REG_CGBA]; 106 107 uint16_t *cg0 = mem + ((cgba & 0x00f0) << 8); 108 uint16_t *cg1 = mem + ((cgba & 0x000f) << 12); 109 110 int32_t line = fon_h - 1; 111 112 for (int32_t y = 0; y < h; ++y) { 113 uint16_t *walk = vid; 114 115 for (int32_t col2 = 0; col2 < w / 16; ++col2) { 116 uint16_t ch2 = *walk++; 117 118 for (int32_t i = 0; i < 2; ++i) { 119 int32_t ch = (uint8_t)ch2; 120 int32_t at = *walk++; 121 122 int32_t bg = at & 0x000f; 123 int32_t fg = (at & 0x00f0) >> 4; 124 125 uint16_t *cg = (at & AT_CG) != 0 ? cg0 : cg1; 126 int32_t bits = cg[256 * line + ch]; 127 int32_t mask = 0x01; 128 129 for (int32_t k = 0; k < 8; ++k) { 130 *pix++ = (bits & mask) != 0 ? pal[fg] : pal[bg]; 131 mask <<= 1; 132 } 133 134 ch2 >>= 8; 135 } 136 } 137 138 if (--line < 0) { 139 line = fon_h - 1; 140 vid = walk; 141 } 142 143 pix += pitch / 4 - w; 144 } 145 } 146 82 147 void vid_sdl(void) 83 148 { … … 98 163 } 99 164 100 void *buf;101 int32_t pitch;102 103 165 if (SDL_LockMutex(cpu_mutex) < 0) { 104 166 fail("SDL_LockMutex() failed: %s", SDL_GetError()); 105 167 } 106 168 107 for (int32_t i = 0; i < n_ bm_objs; ++i) {108 bm_obj_t *bm_obj = bm_objs + i;109 110 pal[0] = bm_obj->tran ? pal[0] & 0xffffff00 : pal[0] | 0x000000ff;169 for (int32_t i = 0; i < n_objs; ++i) { 170 obj_t *obj = objs + i; 171 172 pal[0] = obj->tran ? pal[0] & 0xffffff00 : pal[0] | 0x000000ff; 111 173 112 174 SDL_Rect src = { 113 .x = 0, .y = 0, .w = bm_obj->w, .h = bm_obj->h175 .x = 0, .y = 0, .w = obj->w, .h = obj->h 114 176 }; 177 178 void *buf; 179 int32_t pitch; 115 180 116 181 if (SDL_LockTexture(tex, &src, &buf, &pitch) < 0) { … … 118 183 } 119 184 120 uint32_t *pix = buf; 121 uint16_t *vid = bm_obj->mem; 122 123 for (int32_t y = 0; y < src.h; ++y) { 124 for (int32_t x = 0; x < src.w / 4; ++x) { 125 uint16_t v4 = *vid++; 126 127 *pix++ = pal[(v4 & 0x000f) >> 0]; 128 *pix++ = pal[(v4 & 0x00f0) >> 4]; 129 *pix++ = pal[(v4 & 0x0f00) >> 8]; 130 *pix++ = pal[(v4 & 0xf000) >> 12]; 131 } 132 133 pix += pitch / 4 - src.w; 185 if (obj->fon_h < 0) { 186 rend_bm(obj->mem, obj->w, obj->h, buf, pitch); 187 } 188 else { 189 rend_tx(obj->mem, obj->w, obj->h, obj->fon_h, buf, pitch); 134 190 } 135 191 … … 137 193 138 194 SDL_Rect dst = { 139 .x = SCALE( bm_obj->x), .y = SCALE(bm_obj->y),140 .w = SCALE( bm_obj->w), .h = SCALE(bm_obj->h)195 .x = SCALE(obj->x), .y = SCALE(obj->y), 196 .w = SCALE(obj->w), .h = SCALE(obj->h) 141 197 }; 142 198 143 199 ver2("vid rend %d %dx%d -> (%d, %d) (%d, %d) %dx%d", 144 200 i, 145 bm_obj->w, bm_obj->h,146 bm_obj->x, bm_obj->y,147 SCALE( bm_obj->x), SCALE(bm_obj->y),148 SCALE( bm_obj->w), SCALE(bm_obj->h));201 obj->w, obj->h, 202 obj->x, obj->y, 203 SCALE(obj->x), SCALE(obj->y), 204 SCALE(obj->w), SCALE(obj->h)); 149 205 150 206 if (SDL_RenderCopy(ren, tex, &src, &dst) < 0) { … … 250 306 int32_t odtba = mem[REG_ODTBA] & 0xffc0; 251 307 252 n_ bm_objs = 0;308 n_objs = 0; 253 309 254 310 for (int32_t i = 0; i < 16; ++i) { … … 263 319 } 264 320 265 int32_t w = (od[1] & 0xfc00) >> 6;321 int32_t w = (od[1] & 0xfc00) >> 10; 266 322 267 323 if (w == 0) { … … 293 349 294 350 int32_t x = (od[1] & 0x03ff) * 2; 295 int32_t off = ((od[0] & 0x00c0) << 10) | od[2]; 351 int32_t off = od[2]; 352 353 obj_t *obj = objs + n_objs; 354 355 if (cb) { 356 int32_t vcr1 = mem[REG_VCR1]; 357 obj->fon_h = (vcr1 & 0xf000) >> 12; 358 w = w * 4 / 3 * 2 * 8; // 4 words per block, 3 words per 2 chars, 8 pixels per char 359 } 360 else { 361 off |= (od[0] & 0x00c0) << 10; 362 obj->fon_h = -1; 363 w *= 16; // 16 pixels per block 364 } 365 366 obj->x = x; 367 obj->y = flips[0]; 368 obj->w = w; 369 obj->h = flips[1] - flips[0]; 370 obj->mem = mem + off; 371 obj->tran = tde; 296 372 297 373 ver2("vid obj %d %c %c %d:%d %d+%d 0x%05x", 298 374 i, cb ? 'c' : 'b', tde ? 't' : '-', flips[0], flips[1], x, w, off); 299 375 300 if (!cb) { 301 bm_obj_t *bm_obj = bm_objs + n_bm_objs; 302 303 bm_obj->x = x; 304 bm_obj->y = flips[0]; 305 bm_obj->w = w; 306 bm_obj->h = flips[1] - flips[0]; 307 bm_obj->mem = mem + off; 308 bm_obj->tran = tde; 309 310 ++n_bm_objs; 311 } 312 else { 313 int32_t vcr1 = mem[REG_VCR1]; 314 int32_t fon_h = (vcr1 & 0xf000) >> 12; 315 } 376 ++n_objs; 316 377 } 317 378
Note:
See TracChangeset
for help on using the changeset viewer.