Changeset 43ea417 in buchla-emu for emu


Ignore:
Timestamp:
08/26/2017 11:36:48 PM (7 years ago)
Author:
Alexander Heinrich <alex.heinrich@…>
Branches:
master
Children:
5475ecf
Parents:
7ba68aa
Message:

Render text in midas lcd screen

File:
1 edited

Legend:

Unmodified
Added
Removed
  • emu/lcd.c

    r7ba68aa r43ea417  
    2222#define ver3(...) _ver(lcd_verbose, 2, __VA_ARGS__)
    2323
    24 #define WIN_W (1520 * 2 / 3)
    25 #define WIN_H (950 * 2 / 3)
     24#define WIN_W (1634 * 2 / 3)
     25#define WIN_H (342 * 2 / 3)
    2626
    2727#define CON_W 86
    28 #define CON_H 25
     28#define CON_H 9
    2929
    3030#define CON_BGR 0x00000000
     
    4747#define G_ERASE         0x52
    4848#define G_SLEEP         0x53
    49 #define G_DSPCTL        0x58
     49#define G_DSPOFF        0x58
     50#define G_DSPON         0x59
    5051#define G_HSCRL         0x5A
    5152#define G_OVRLAY        0x5B
     
    5960static SDL_atomic_t frame;
    6061
     62static uint32_t render = 0;
     63
    6164static TTF_Font *fon;
    6265static int32_t fon_w, fon_h;
     
    7275static int32_t cur_ad_c = 0;
    7376
     77static uint32_t last_val = 0x00;
     78static uint32_t last_off = 0;
     79static int32_t last_sz = -1;
     80static int32_t mult_val_c = 0;
     81
     82static void (*cursdir)(void);
     83
    7484int32_t lcd_verbose = 0;
    7585
     
    112122}
    113123
     124static void up(void)
     125{
     126        if (cur_y > 0) {
     127                --cur_y;
     128                return;
     129        }
     130
     131        // TODO: What happens when cursor out of bounds
     132}
     133
    114134static void down(void)
    115135{
     
    119139        }
    120140
    121         scroll();
     141        // TODO: What happens when cursor out of bounds
    122142}
    123143
     
    126146        uint32_t n_cur_y = cur_addr / 85;
    127147
    128         printf("Cur x %u\n", n_cur_x);
    129         printf("Cur y %u\n", n_cur_y);
     148        ver2("lcd cur x %u\n", n_cur_x);
     149        ver2("lcd cur y %u\n", n_cur_y);
     150
    130151        if (n_cur_x < CON_W - 1) {
    131152                cur_x = (int32_t) n_cur_x;
     
    139160        }
    140161        else {
     162                cur_x = 0;
     163                cur_y = 9;
    141164                err("invalid y cursor pos in lcd %u:%d", n_cur_y, CON_H);
    142165        }
     
    145168static void echo(uint8_t c)
    146169{
    147         if (c < 32) {
     170        if (c >127) {
     171                return;
     172        }
     173        else if (c < 32) {
    148174                switch (c) {
    149175                case '\r':
     
    165191                case 0:
    166192                        mem[cur_y][cur_x] = ' ';
    167                         forw();
     193                        (*cursdir)();
    168194                        break;
    169195
     
    183209        else {
    184210                mem[cur_y][cur_x] = c;
    185                 forw();
    186         }
    187 
    188         SDL_AtomicAdd(&frame, 1);
     211                (*cursdir)();
     212        }
     213
     214        if (render) {
     215                SDL_AtomicAdd(&frame, 1);
     216        }
     217}
     218
     219static void clear_mem(void) {
     220        for (int32_t y = 0; y < CON_H; ++y) {
     221                for (int32_t x = 0; x < CON_W; ++x) {
     222                        mem[y][x] = ' ';
     223                }
     224
     225                mem[y][CON_W] = 0;
     226        }
    189227}
    190228
     
    308346        }
    309347
    310         for (int32_t y = 0; y < CON_H; ++y) {
    311                 for (int32_t x = 0; x < CON_W; ++x) {
    312                         mem[y][x] = ' ';
    313                 }
    314 
    315                 mem[y][CON_W] = 0;
    316         }
     348        clear_mem();
    317349
    318350}
     
    343375        switch (current_op) {
    344376                case G_MREAD:
    345                         printf("current op: %d\n", current_op);
     377                        ver2("lcd current op: %d\n", current_op);
    346378                        rv = mem[cur_y][cur_x];
    347379                        break;
     380
    348381                default:
    349382                        rv = 0x00;
     
    355388void lcd_write(uint32_t off, int32_t sz, uint32_t val)
    356389{
    357         ver2("lcd wr %u:%d 0x%0*x", off, sz * 8, sz * 2, val);
     390
     391        if(last_val != val && mult_val_c > 0) {
     392                if(mult_val_c > 1) {
     393                        ver2("lcd wr %u:%d 0x%0*x was called %u more times", last_off, last_sz * 8, last_sz * 2, last_val, mult_val_c);
     394                }
     395                else {
     396                        ver2("lcd wr %u:%d 0x%0*x", last_off, last_sz * 8, last_sz * 2, last_val);
     397                }
     398
     399                ver2("lcd wr %u:%d 0x%0*x", off, sz * 8, sz * 2, val);
     400                mult_val_c = 0;
     401        }
     402        else if(last_val == val && mult_val_c >= 0) {
     403                ++mult_val_c;
     404        }
     405        else {
     406                ver2("lcd wr %u:%d 0x%0*x", off, sz * 8, sz * 2, val);
     407        }
     408
     409        last_val = val;
     410        last_off = off;
     411        last_sz = sz;
    358412
    359413        if (off == 0) {
     
    362416                                        echo((uint8_t)val);
    363417                                break;
     418
    364419                        case G_CRSWR:
    365420                                if (cur_ad_c == 0) {
     
    372427                                }
    373428                                break;
     429
     430                        case G_DSPON:
     431                                // TODO Configure blinking of cursor(s)
     432                                break;
     433
    374434                        default:
    375435                                break;
     
    381441                                current_op = G_MWRITE;
    382442                                break;
     443
    383444                        case G_CRSMRT:
    384                                 forw();
    385                                 break;
     445                                cursdir = &forw;
     446                                current_op = G_CRSMRT;
     447                                break;
     448
     449                        case G_CRSMUP:
     450                                cursdir = &up;
     451                                current_op = G_CRSMUP;
     452                                break;
     453
     454                        case G_CRSMDN:
     455                                cursdir = &down;
     456                                current_op = G_CRSMDN;
     457                                break;
     458
    386459                        case G_CRSWR:
    387460                                current_op = G_CRSWR;
    388461                                break;
     462
    389463                        case G_MREAD:
    390464                                current_op = G_MREAD;
    391465                                break;
     466
     467                        case G_DSPOFF:
     468                                if (SDL_SetRenderDrawColor(ren, 0x00, 0x00, 0x00, 0xff) < 0) {
     469                                        fail("SDL_SetRenderDrawColor() failed: %s", SDL_GetError());
     470                                }
     471                                if (SDL_RenderClear(ren) < 0) {
     472                                        fail("SDL_RenderClear() failed: %s", SDL_GetError());
     473                                }
     474                                SDL_RenderPresent(ren);
     475                                render = 0;
     476                                current_op = G_DSPOFF;
     477                                break;
     478
     479                        case G_DSPON:
     480                                render = 1;
     481                                current_op = G_DSPON;
     482                                break;
     483
     484                        case G_CRSFRM:
     485                                // TODO Setup Cursor Form...
     486                                current_op = 0x00;
     487                                break;
     488
    392489                        default:
    393490                                current_op = 0x00;
Note: See TracChangeset for help on using the changeset viewer.