X-Git-Url: http://git.squeep.com/?p=dcpu16;a=blobdiff_plain;f=hw_lem1802.c;h=1be1810fa933720c3da6436b04be742d1633248e;hp=dd8d33fdcb48fcdda46cef9f0dd718fc09042f30;hb=a9cc197dc14d237e6bcea74591b81688de81ad66;hpb=74629db149379f2d67cd2b1cf575b46ef6e317b6 diff --git a/hw_lem1802.c b/hw_lem1802.c index dd8d33f..1be1810 100644 --- a/hw_lem1802.c +++ b/hw_lem1802.c @@ -17,7 +17,6 @@ #include "chargen-4x8.h" #include "hw_lem1802.h" -#undef DEBUG #ifdef DEBUG #define TRACE(...) do { printf("[debug] "); printf(__VA_ARGS__); printf("\n"); } while (0) #else /* DEBUG */ @@ -142,10 +141,12 @@ void font_tile_paint_(struct pixel_ *p, struct pixel_ *fg, struct pixel_ *bg, DC size_t pix_x, pix_y; unsigned char *font_bitmap = (unsigned char *)tile; +#if 0 TRACE("%s>> fg:(%u,%u,%u) bg:(%u,%u,%u) font_bitmap:%02x %02x %02x %02x", __func__, fg->r, fg->g, fg->b, bg->r, bg->g, bg->b, font_bitmap[0], font_bitmap[1], font_bitmap[2], font_bitmap[3]); +#endif for (pix_x = 0; pix_x < CELL_X_SZ; pix_x++) { for (pix_y = 0; pix_y < CELL_Y_SZ; pix_y++) { @@ -169,10 +170,12 @@ void pixbuf_addr_paint_(struct pixel_ *pixbuf, DCPU16_WORD *mem, DCPU16_WORD bas cell_x = (addr - base) % CELL_X; cell_y = (addr - base) / CELL_X; +#if 0 TRACE("%s>> addr:0x%04x col:%u row:%u v:%hu", __func__, addr, cell_x, cell_y, mem[addr]); +#endif blink = mem[addr] & 0x0080; @@ -199,7 +202,9 @@ void lem1802_pixbuf_refresh_full_(struct lem1802_ *display, DCPU16_WORD *mem) { struct pixel_ border; size_t tile; +#if 0 TRACE("%s>> video_base:0x%04x", __func__, display->video_base); +#endif if (display->video_base == 0) { /* disconnected, blank display. static might be fun, too */ @@ -241,14 +246,6 @@ int pixbuf_render_pnm_(void *data, struct pixel_ *pixbuf, size_t x, size_t y) { #ifdef HAVE_LIBPNG static -void pixbuf_render_png_user_warning_(png_structp png, png_const_charp msg) { - (void)png, (void)msg; -} -static -void pixbuf_render_png_user_error_(png_structp png, png_const_charp msg) { - (void)png, (void)msg; -} -static int pixbuf_render_png_(void *data, struct pixel_ *pixbuf, size_t x, size_t y) { FILE *f = (FILE *)data; int retval = 0; @@ -256,7 +253,7 @@ int pixbuf_render_png_(void *data, struct pixel_ *pixbuf, size_t x, size_t y) { png_infop info; size_t i; - png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, pixbuf_render_png_user_error_, pixbuf_render_png_user_warning_); + png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (png == NULL) { goto f_done; } @@ -291,58 +288,51 @@ f_done: #endif /* HAVE_LIBPNG */ #ifdef HAVE_LIBVNCSERVER -struct vnc_server_ { - rfbScreenInfoPtr rfbScreen; -}; - -/* create and return a new struct vnc_server_, for use as a vnc renderer's generic data */ -void *lem1802_vnc_init_data(int argc, char *argv[], struct dcpu16_hw *hw) { - struct vnc_server_ *s; - struct pixel_ *pixbuf = ((struct lem1802_ *)(hw->data))->pixbuf; +/* create and return a new screen, easiest to do here because we know the screen dimensions */ +rfbScreenInfoPtr lem1802_rfb_new(int argc, char *argv[]) { + rfbScreenInfoPtr s; int paddedWidth = PIX_X + ( (PIX_X & 3) ? (4 - (PIX_X & 3)) : 0 ); int height = PIX_Y; int bitsPerSample = 8; int samplesPerPixel = 3; int bytesPerPixel = 4; - s = calloc(1, sizeof *s); + s = rfbGetScreen(&argc, argv, paddedWidth, height, bitsPerSample, samplesPerPixel, bytesPerPixel); if (s == NULL) return NULL; - s->rfbScreen = rfbGetScreen(&argc, argv, paddedWidth, height, bitsPerSample, samplesPerPixel, bytesPerPixel); - if (s->rfbScreen == NULL) { - free(s); - return NULL; - } - - s->rfbScreen->desktopName = "NYA ELEKTRISKA LEM1802"; - s->rfbScreen->alwaysShared = TRUE; + s->alwaysShared = TRUE; #if 0 - s->rfbScreen->kbdAddEvent = HandleKey; */ - s->rfbScreen->httpDir = "../classes"; + s->httpDir = "../classes"; #endif - s->rfbScreen->frameBuffer = (char *)pixbuf; + TRACE("%s>> s:%p", __func__, s); + TRACE("%s>> s->kbdAddEvent:%p s->frameBuffer:%p", __func__, s->kbdAddEvent, s->frameBuffer); - rfbInitServer(s->rfbScreen); + return s; +} - rfbRunEventLoop(s->rfbScreen,-1,TRUE); +/* set up a new screen to see our pixels */ +void lem1802_vnc_associate(struct dcpu16_hw *hw, rfbScreenInfoPtr s) { + struct lem1802_ *display = (struct lem1802_ *)hw->data; - TRACE("%s>> initialized new vnc server", __func__); + s->desktopName = "NYA ELEKTRISKA LEM1802"; + s->frameBuffer = (char *)display->pixbuf; - return s; + TRACE("%s>> s:%p\n", __func__, s); } +/* notify rfb server that pixels may have changed */ static int pixbuf_render_vnc_(void *data, struct pixel_ *pixbuf, size_t x, size_t y) { + rfbScreenInfoPtr s = (rfbScreenInfoPtr)data; int retval = 0; - struct vnc_server_ *s = (struct vnc_server_ *)data; (void)pixbuf; /* derp */ - rfbMarkRectAsModified(s->rfbScreen,0,0,x,y); + rfbMarkRectAsModified(s, 0, 0, x, y); TRACE("%s>>", __func__); @@ -536,7 +526,9 @@ struct dcpu16_hw *lem1802_new(struct dcpu16 *vm) { } ((struct lem1802_ *)(hw->data))->refresh_rate = 1666; - ((struct lem1802_ *)(hw->data))->blink_rate = 100000; + ((struct lem1802_ *)(hw->data))->blink_rate = 75000; + + hw->vm = vm; return hw; }