Changes in / [5475ecf:43ea417] in buchla-emu


Ignore:
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • .cproject

    r5475ecf r43ea417  
    6868                </scannerConfigBuildInfo>
    6969        </storageModule>
    70         <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
    7170</cproject>
  • .settings/language.settings.xml

    r5475ecf r43ea417  
    66                        <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
    77                        <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 &quot;${INPUTS}&quot;" 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 &quot;${INPUTS}&quot;" prefer-non-shared="true">
    99                                <language-scope id="org.eclipse.cdt.core.gcc"/>
    1010                                <language-scope id="org.eclipse.cdt.core.g++"/>
  • emu/ser.c

    r5475ecf r43ea417  
    6060};
    6161
    62 static uint8_t mem[CON_H][CON_W];
     62static uint8_t mem[CON_H][CON_W + 1];
    6363
    6464static SDL_Window *win;
     
    8181static void scroll(void)
    8282{
    83         memmove(mem, mem + 1, (CON_H - 1) * CON_W);
     83        memmove(mem, mem + 1, (CON_H - 1) * (CON_W + 1));
    8484        memset(mem + (CON_H - 1), ' ', CON_W);
    8585}
     
    256256        for (int32_t y = 0; y < CON_H; ++y) {
    257257                char line[CON_W + 1];
    258                 line[CON_W] = 0;
    259258
    260259                if (SDL_LockMutex(cpu_mutex) < 0) {
     
    262261                }
    263262
    264                 memcpy(line, mem[y], CON_W);
     263                memcpy(line, mem[y], CON_W + 1);
    265264
    266265                if (SDL_UnlockMutex(cpu_mutex) < 0) {
     
    516515                        mem[y][x] = ' ';
    517516                }
     517
     518                mem[y][CON_W] = 0;
    518519        }
    519520}
  • emu/vid.c

    r5475ecf r43ea417  
    3434#define REG_ODTBA 7
    3535#define REG_ATBA 8
    36 #define REG_CGBA 10
    3736#define REG_ATBAC 11
    3837
     
    4948#define OD0_BLA 0x0010
    5049#define OD0_CB 0x0800
    51 
    52 #define AT_CG 0x8000
    5350
    5451#define WIN_SZ_W 0x10000
     
    6663        uint16_t *mem;
    6764        bool tran;
    68         int32_t fon_h;
    69 } obj_t;
     65} bm_obj_t;
    7066
    7167static int32_t reg_off = REG_OFF;
     
    7672static uint32_t pal[16];
    7773
    78 static obj_t objs[16];
    79 static int32_t n_objs = 0;
     74static bm_obj_t bm_objs[16];
     75static int32_t n_bm_objs = 0;
    8076
    8177static SDL_Window *win;
     
    8480static SDL_atomic_t frame;
    8581
    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 
    14782void vid_sdl(void)
    14883{
     
    16398        }
    16499
     100        void *buf;
     101        int32_t pitch;
     102
    165103        if (SDL_LockMutex(cpu_mutex) < 0) {
    166104                fail("SDL_LockMutex() failed: %s", SDL_GetError());
    167105        }
    168106
    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;
    173111
    174112                SDL_Rect src = {
    175                         .x = 0, .y = 0, .w = obj->w, .h = obj->h
     113                        .x = 0, .y = 0, .w = bm_obj->w, .h = bm_obj->h
    176114                };
    177 
    178                 void *buf;
    179                 int32_t pitch;
    180115
    181116                if (SDL_LockTexture(tex, &src, &buf, &pitch) < 0) {
     
    183118                }
    184119
    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;
    190134                }
    191135
     
    193137
    194138                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)
    197141                };
    198142
    199143                ver2("vid rend %d %dx%d -> (%d, %d) (%d, %d) %dx%d",
    200144                                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));
    205149
    206150                if (SDL_RenderCopy(ren, tex, &src, &dst) < 0) {
     
    306250        int32_t odtba = mem[REG_ODTBA] & 0xffc0;
    307251
    308         n_objs = 0;
     252        n_bm_objs = 0;
    309253
    310254        for (int32_t i = 0; i < 16; ++i) {
     
    319263                }
    320264
    321                 int32_t w64 = (od[1] & 0xfc00) >> 10;
    322 
    323                 if (w64 == 0) {
     265                int32_t w = (od[1] & 0xfc00) >> 6;
     266
     267                if (w == 0) {
    324268                        ver3("vid obj %d empty", i);
    325269                        continue;
     
    349293
    350294                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];
    374296
    375297                ver2("vid obj %d %c %c %d:%d %d+%d 0x%05x",
    376298                                i, cb ? 'c' : 'b', tde ? 't' : '-', flips[0], flips[1], x, w, off);
    377299
    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                }
    379316        }
    380317
Note: See TracChangeset for help on using the changeset viewer.