Changes in / [5475ecf:43ea417] in buchla-emu
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
.cproject
r5475ecf r43ea417 68 68 </scannerConfigBuildInfo> 69 69 </storageModule> 70 <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>71 70 </cproject> -
.settings/language.settings.xml
r5475ecf r43ea417 6 6 <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> 7 7 <provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/> 8 <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash=" 617322979982056114" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">8 <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-1750853831677083752" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> 9 9 <language-scope id="org.eclipse.cdt.core.gcc"/> 10 10 <language-scope id="org.eclipse.cdt.core.g++"/> -
emu/ser.c
r5475ecf r43ea417 60 60 }; 61 61 62 static uint8_t mem[CON_H][CON_W ];62 static uint8_t mem[CON_H][CON_W + 1]; 63 63 64 64 static SDL_Window *win; … … 81 81 static void scroll(void) 82 82 { 83 memmove(mem, mem + 1, (CON_H - 1) * CON_W);83 memmove(mem, mem + 1, (CON_H - 1) * (CON_W + 1)); 84 84 memset(mem + (CON_H - 1), ' ', CON_W); 85 85 } … … 256 256 for (int32_t y = 0; y < CON_H; ++y) { 257 257 char line[CON_W + 1]; 258 line[CON_W] = 0;259 258 260 259 if (SDL_LockMutex(cpu_mutex) < 0) { … … 262 261 } 263 262 264 memcpy(line, mem[y], CON_W );263 memcpy(line, mem[y], CON_W + 1); 265 264 266 265 if (SDL_UnlockMutex(cpu_mutex) < 0) { … … 516 515 mem[y][x] = ' '; 517 516 } 517 518 mem[y][CON_W] = 0; 518 519 } 519 520 } -
emu/vid.c
r5475ecf r43ea417 34 34 #define REG_ODTBA 7 35 35 #define REG_ATBA 8 36 #define REG_CGBA 1037 36 #define REG_ATBAC 11 38 37 … … 49 48 #define OD0_BLA 0x0010 50 49 #define OD0_CB 0x0800 51 52 #define AT_CG 0x800053 50 54 51 #define WIN_SZ_W 0x10000 … … 66 63 uint16_t *mem; 67 64 bool tran; 68 int32_t fon_h; 69 } obj_t; 65 } bm_obj_t; 70 66 71 67 static int32_t reg_off = REG_OFF; … … 76 72 static uint32_t pal[16]; 77 73 78 static obj_tobjs[16];79 static int32_t n_ objs = 0;74 static bm_obj_t bm_objs[16]; 75 static int32_t n_bm_objs = 0; 80 76 81 77 static SDL_Window *win; … … 84 80 static SDL_atomic_t frame; 85 81 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 147 82 void vid_sdl(void) 148 83 { … … 163 98 } 164 99 100 void *buf; 101 int32_t pitch; 102 165 103 if (SDL_LockMutex(cpu_mutex) < 0) { 166 104 fail("SDL_LockMutex() failed: %s", SDL_GetError()); 167 105 } 168 106 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;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; 173 111 174 112 SDL_Rect src = { 175 .x = 0, .y = 0, .w = obj->w, .h =obj->h113 .x = 0, .y = 0, .w = bm_obj->w, .h = bm_obj->h 176 114 }; 177 178 void *buf;179 int32_t pitch;180 115 181 116 if (SDL_LockTexture(tex, &src, &buf, &pitch) < 0) { … … 183 118 } 184 119 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); 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; 190 134 } 191 135 … … 193 137 194 138 SDL_Rect dst = { 195 .x = SCALE( obj->x), .y = SCALE(obj->y),196 .w = SCALE( obj->w), .h = SCALE(obj->h)139 .x = SCALE(bm_obj->x), .y = SCALE(bm_obj->y), 140 .w = SCALE(bm_obj->w), .h = SCALE(bm_obj->h) 197 141 }; 198 142 199 143 ver2("vid rend %d %dx%d -> (%d, %d) (%d, %d) %dx%d", 200 144 i, 201 obj->w,obj->h,202 obj->x,obj->y,203 SCALE( obj->x), SCALE(obj->y),204 SCALE( obj->w), SCALE(obj->h));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)); 205 149 206 150 if (SDL_RenderCopy(ren, tex, &src, &dst) < 0) { … … 306 250 int32_t odtba = mem[REG_ODTBA] & 0xffc0; 307 251 308 n_ objs = 0;252 n_bm_objs = 0; 309 253 310 254 for (int32_t i = 0; i < 16; ++i) { … … 319 263 } 320 264 321 int32_t w 64 = (od[1] & 0xfc00) >> 10;322 323 if (w 64== 0) {265 int32_t w = (od[1] & 0xfc00) >> 6; 266 267 if (w == 0) { 324 268 ver3("vid obj %d empty", i); 325 269 continue; … … 349 293 350 294 int32_t x = (od[1] & 0x03ff) * 2; 351 int32_t off, fon_h, w; 352 353 if (cb) { 354 off = od[2]; 355 int32_t vcr1 = mem[REG_VCR1]; 356 fon_h = (vcr1 & 0xf000) >> 12; 357 w = w64 * 4 / 3 * 2 * 8; 358 } 359 else { 360 off = ((od[0] & 0x00c0) << 10) | od[2]; 361 fon_h = -1; 362 w = w64 * 16; 363 } 364 365 obj_t *obj = objs + n_objs; 366 367 obj->x = x; 368 obj->y = flips[0]; 369 obj->w = w; 370 obj->h = flips[1] - flips[0]; 371 obj->mem = mem + off; 372 obj->tran = tde; 373 obj->fon_h = fon_h; 295 int32_t off = ((od[0] & 0x00c0) << 10) | od[2]; 374 296 375 297 ver2("vid obj %d %c %c %d:%d %d+%d 0x%05x", 376 298 i, cb ? 'c' : 'b', tde ? 't' : '-', flips[0], flips[1], x, w, off); 377 299 378 ++n_objs; 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 } 379 316 } 380 317
Note:
See TracChangeset
for help on using the changeset viewer.