diff --git a/gpsim-0.32.1-lcd.patch b/gpsim-0.32.1-lcd.patch new file mode 100644 index 0000000..00d54f8 --- /dev/null +++ b/gpsim-0.32.1-lcd.patch @@ -0,0 +1,492 @@ +Index: extras/lcd/examples/README +=================================================================== +--- extras/lcd/examples/README (revision 2626) ++++ extras/lcd/examples/README (revision 2627) +@@ -9,10 +9,10 @@ + Building + + The Makefile in this directory is for the top level packager. So +-to "build" the project, do this: ++to "build" lcd_mod.cod`, do this: + + +-$ gpasm lcd_mod.asm ++$ make -f makefile + + This should assemble with no errors. + +Index: extras/lcd/examples/makefile +=================================================================== +--- extras/lcd/examples/makefile (nonexistent) ++++ extras/lcd/examples/makefile (revision 2627) +@@ -0,0 +1,16 @@ ++ ++all : lcd_mod.cod ++ ++ifdef EXTENDED_INSTRUCTIONS ++ ASM_FLAGS = -c --extended ++else ++ ASM_FLAGS = -c ++endif ++ ++ ++%.o : %.asm ++ gpasm $(ASM_FLAGS) $< ++ ++%.cod : %.o ++ gplink --map -q -o $@ $< ++ +Index: extras/lcd/lcd.h +=================================================================== +--- extras/lcd/lcd.h (revision 2626) ++++ extras/lcd/lcd.h (revision 2627) +@@ -60,6 +60,7 @@ + + typedef char _5X7 [7][6]; + typedef char _5X8 [8][6]; ++struct raw_font { _5X8 C_5X8;}; + + class LcdFont { + public: +Index: extras/lcd/lcdfont.h +=================================================================== +--- extras/lcd/lcdfont.h (revision 2626) ++++ extras/lcd/lcdfont.h (revision 2627) +@@ -1,5 +1,5 @@ + #define FONT_LEN 256 +-_5X8 test[FONT_LEN] = { ++raw_font font_list[FONT_LEN] = { + { /* 0 */ + " ", + " ", +Index: extras/lcd/lcdgui.cc +=================================================================== +--- extras/lcd/lcdgui.cc (revision 2626) ++++ extras/lcd/lcdgui.cc (revision 2627) +@@ -31,29 +31,32 @@ + + cairo_surface_t *LcdFont::create_image(LcdDisplay *lcdP, _5X8 *ch) + { +- int rows = 6 + lcdP->dots.y * lcdP->pixels.y; +- int cols = 1 + lcdP->dots.x * lcdP->pixels.x; +- cairo_surface_t *image = gdk_window_create_similar_surface(mywindow, +- CAIRO_CONTENT_COLOR_ALPHA, cols, rows); +- cairo_t *cr = cairo_create(image); +- cairo_set_line_width(cr, 0.5); ++ int rows = 6 + lcdP->dots.y * lcdP->pixels.y; ++ int cols = 1 + lcdP->dots.x * lcdP->pixels.x; ++ cairo_surface_t *image = gdk_window_create_similar_surface(mywindow, ++ CAIRO_CONTENT_COLOR_ALPHA, cols, rows); ++ cairo_t *cr = cairo_create(image); ++ cairo_set_line_width(cr, 0.5); + +- for (int j = 0; j < lcdP->dots.y; j++) { +- for (int i = 0; i < lcdP->dots.x; i++) { +- if (ch[0][j][i] == '.') { +- double y = 5 + lcdP->pixels.y * j; +- double x = i * lcdP->pixels.x; +- cairo_set_source_rgb(cr, double(0x11) / 255, double(0x33) / 255, double(0x11) / 255); +- cairo_rectangle(cr, x, y, lcdP->pixels.x, lcdP->pixels.y); +- cairo_fill_preserve(cr); +- cairo_set_source_rgb(cr, double(0x66) / 255, double(0x88) / 255, double(0x66) / 255); +- cairo_stroke(cr); +- } ++ for (int j = 0; j < lcdP->dots.y; j++) ++ { ++ for (int i = 0; i < lcdP->dots.x; i++) ++ { ++ if (ch[0][j][i] == '.') ++ { ++ double y = 5 + lcdP->pixels.y * j; ++ double x = i * lcdP->pixels.x; ++ cairo_set_source_rgb(cr, double(0x11) / 255, double(0x33) / 255, double(0x11) / 255); ++ cairo_rectangle(cr, x, y, lcdP->pixels.x, lcdP->pixels.y); ++ cairo_fill_preserve(cr); ++ cairo_set_source_rgb(cr, double(0x66) / 255, double(0x88) / 255, double(0x66) / 255); ++ cairo_stroke(cr); ++ } ++ } + } +- } + +- cairo_destroy(cr); +- return image; ++ cairo_destroy(cr); ++ return image; + } + + +@@ -66,147 +69,169 @@ + + LcdFont::LcdFont(gint characters, GtkWidget *parent_window, LcdDisplay *lcdP) + { +- pixmaps.reserve(characters); +- mywindow = gtk_widget_get_window(parent_window); ++ pixmaps.reserve(characters); ++ mywindow = gtk_widget_get_window(parent_window); + +- for (gint i = 0; i < characters; i++) { +- if (strlen(test[i][0]) < 5) { +- pixmaps.push_back(nullptr); ++ for (gint i = 0; i < characters; i++) ++ { ++ if (strlen(font_list[i].C_5X8[0]) < 5) ++ { ++ pixmaps.push_back(nullptr); + +- } else { +- pixmaps.push_back(create_image(lcdP, &test[i])); ++ } ++ else ++ { ++ pixmaps.push_back(create_image(lcdP, &font_list[i].C_5X8)); ++ } + } +- } + } + + + LcdFont::~LcdFont() + { +- for (size_t i = 0; i < pixmaps.size(); ++i) { +- if (pixmaps[i]) { +- cairo_surface_destroy(pixmaps[i]); ++ for (size_t i = 0; i < pixmaps.size(); ++i) ++ { ++ if (pixmaps[i]) ++ { ++ cairo_surface_destroy(pixmaps[i]); ++ } + } +- } + } + + + void LcdFont::update_pixmap(int pos, _5X8 *tempchar, LcdDisplay *lcdP) + { +- if (pixmaps[pos]) { +- cairo_surface_destroy(pixmaps[pos]); +- pixmaps[pos] = nullptr; +- } ++ if (pixmaps[pos]) ++ { ++ cairo_surface_destroy(pixmaps[pos]); ++ pixmaps[pos] = nullptr; ++ } + +- pixmaps[pos] = create_image(lcdP, tempchar); ++ pixmaps[pos] = create_image(lcdP, tempchar); + } + + + cairo_surface_t *LcdFont::getPixMap(unsigned int index) + { +- return ((index < pixmaps.size()) && pixmaps[index]) ? pixmaps[index] : pixmaps[0]; ++ return ((index < pixmaps.size()) && pixmaps[index]) ? pixmaps[index] : pixmaps[0]; + } + + + void LcdDisplay::update_cgram_pixmaps() + { +- int i, j, k; +- _5X8 tempchar; ++ int i, j, k; ++ _5X8 tempchar; + +- if (fontP == nullptr) { +- return; +- } ++ if (fontP == nullptr) ++ { ++ return; ++ } + +- for (i = 0; i < CGRAM_SIZE / 8; i++) { +- for (j = 0; j < 8; j++) { +- for (k = 0; k < 5; k++) { +- if (m_hd44780->getCGRam(8 * i + j) & (1 << (4 - k))) { +- tempchar[j][k] = '.'; ++ for (i = 0; i < CGRAM_SIZE / 8; i++) ++ { ++ for (j = 0; j < 8; j++) ++ { ++ for (k = 0; k < 5; k++) ++ { ++ if (m_hd44780->getCGRam(8 * i + j) & (1 << (4 - k))) ++ { ++ tempchar[j][k] = '.'; + +- } else { +- tempchar[j][k] = ' '; ++ } ++ else ++ { ++ tempchar[j][k] = ' '; ++ } ++ } ++ ++ tempchar[j][5] = 0; + } +- } + +- tempchar[j][5] = 0; ++ fontP->update_pixmap(i, &tempchar, this); ++ fontP->update_pixmap(i + 8, &tempchar, this); + } + +- fontP->update_pixmap(i, &tempchar, this); +- fontP->update_pixmap(i + 8, &tempchar, this); +- } +- +- m_hd44780->setCGRamupdate(false); ++ m_hd44780->setCGRamupdate(false); + } + + + cairo_surface_t *LcdDisplay::get_pixmap(gint row, gint col) + { +- if (m_hd44780->CGRamupdate()) { +- update_cgram_pixmaps(); +- } ++ if (m_hd44780->CGRamupdate()) ++ { ++ update_cgram_pixmaps(); ++ } + +- return fontP ? fontP->getPixMap(m_hd44780->getDDRam(row, col)) : nullptr; ++ return fontP ? fontP->getPixMap(m_hd44780->getDDRam(row, col)) : nullptr; + } + + +-static gboolean lcd_expose_event(GtkWidget *widget, GdkEvent * , gpointer user_data) ++static gboolean lcd_expose_event(GtkWidget *widget, GdkEvent *, gpointer user_data) + { +- LcdDisplay *lcdP = static_cast(user_data); +- // If there is no font, then go create it. ++ LcdDisplay *lcdP = static_cast(user_data); ++ // If there is no font, then go create it. + +- if (!lcdP->fontP) { +- lcdP->fontP = new LcdFont(FONT_LEN, widget, lcdP); +- } ++ if (!lcdP->fontP) ++ { ++ lcdP->fontP = new LcdFont(FONT_LEN, widget, lcdP); ++ } + +- GtkAllocation allocation; +- gtk_widget_get_allocation(widget, &allocation); +- lcdP->w_width = allocation.width; +- lcdP->w_height = allocation.height; +- cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(widget)); +- lcdP->update(cr); +- cairo_destroy(cr); +- return FALSE; ++ GtkAllocation allocation; ++ gtk_widget_get_allocation(widget, &allocation); ++ lcdP->w_width = allocation.width; ++ lcdP->w_height = allocation.height; ++ cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(widget)); ++ lcdP->update(cr); ++ cairo_destroy(cr); ++ return FALSE; + } + + + void LcdDisplay::update(cairo_t *cr) + { +- guint i, j; +- cairo_set_source_rgb(cr, +- double(0x78) / 255, double(0xa8) / 255, double(0x78) / 255); +- cairo_rectangle(cr, 0.0, 0.0, w_width, w_height); +- cairo_fill(cr); +- gint cw = get_char_width(); +- gint ch = get_char_height(); +- gint border = get_border(); ++ guint i, j; ++ cairo_set_source_rgb(cr, ++ double(0x78) / 255, double(0xa8) / 255, double(0x78) / 255); ++ cairo_rectangle(cr, 0.0, 0.0, w_width, w_height); ++ cairo_fill(cr); ++ gint cw = get_char_width(); ++ gint ch = get_char_height(); ++ gint border = get_border(); + +- if (!(disp_type & TWO_ROWS_IN_ONE)) { +- for (j = 0; j < rows; j++) +- for (i = 0; i < cols; i++) { +- cairo_set_source_surface(cr, get_pixmap(j, i), border + i * cw, border + j * (ch)); +- cairo_paint(cr); +- } ++ if (!(disp_type & TWO_ROWS_IN_ONE)) ++ { ++ for (j = 0; j < rows; j++) ++ for (i = 0; i < cols; i++) ++ { ++ cairo_set_source_surface(cr, get_pixmap(j, i), border + i * cw, border + j * (ch)); ++ cairo_paint(cr); ++ } + +- } else { +- guint pos; ++ } ++ else ++ { ++ guint pos; + +- for (pos = 0, j = 0; j < rows; j++) +- for (i = 0; i < cols; pos++, i++) { +- cairo_set_source_surface(cr, get_pixmap(j, i), border + pos * cw, border); +- cairo_paint(cr); +- } +- } ++ for (pos = 0, j = 0; j < rows; j++) ++ for (i = 0; i < cols; pos++, i++) ++ { ++ cairo_set_source_surface(cr, get_pixmap(j, i), border + pos * cw, border); ++ cairo_paint(cr); ++ } ++ } + } + + +-static gint cursor_event(GtkWidget * , GdkEvent *event, gpointer * ) ++static gint cursor_event(GtkWidget *, GdkEvent *event, gpointer * ) + { +- if ((event->type == GDK_BUTTON_PRESS) && +- ((event->button.button == 1) || +- (event->button.button == 3))) { +- return TRUE; +- } ++ if ((event->type == GDK_BUTTON_PRESS) && ++ ((event->button.button == 1) || ++ (event->button.button == 3))) ++ { ++ return TRUE; ++ } + +- return FALSE; ++ return FALSE; + } + + +@@ -217,63 +242,68 @@ + + void LcdDisplay::CreateGraphics() + { +- window = gtk_window_new(GTK_WINDOW_TOPLEVEL); ++ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + +- if (window) { +- char title[128]; +- g_snprintf(title, sizeof(title), "%d X %d", rows, cols); ++ if (window) ++ { ++ char title[128]; ++ g_snprintf(title, sizeof(title), "%d X %d", rows, cols); + +- if (disp_type & TWO_ROWS_IN_ONE) { +- g_strlcat(title, " (in one row)", sizeof(title)); +- } ++ if (disp_type & TWO_ROWS_IN_ONE) ++ { ++ g_strlcat(title, " (in one row)", sizeof(title)); ++ } + +- gtk_widget_realize(window); +- gtk_window_set_title(GTK_WINDOW(window), "LCD"); +- GtkWidget *main_vbox = gtk_vbox_new(FALSE, 5); +- gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 0); +- gtk_container_add(GTK_CONTAINER(window), main_vbox); +- GtkWidget *vbox = +- gtk_widget_new(gtk_vbox_get_type(), +- "GtkBox::homogeneous", FALSE, +- //"GtkBox::spacing", 5, +- //"GtkContainer::border_width", 10, +- "GtkWidget::parent", main_vbox, +- "GtkWidget::visible", TRUE, +- nullptr); +- GtkWidget *frame = +- gtk_widget_new(gtk_frame_get_type(), +- "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN, +- "GtkFrame::label_xalign", 0.5, +- "GtkFrame::label", title, +- //"GtkContainer::border_width", 10, +- "GtkWidget::parent", vbox, +- "GtkWidget::visible", TRUE, +- nullptr); +- darea = gtk_drawing_area_new(); ++ gtk_widget_realize(window); ++ gtk_window_set_title(GTK_WINDOW(window), "LCD"); ++ GtkWidget *main_vbox = gtk_vbox_new(FALSE, 5); ++ gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 0); ++ gtk_container_add(GTK_CONTAINER(window), main_vbox); ++ GtkWidget *vbox = ++ gtk_widget_new(gtk_vbox_get_type(), ++ "GtkBox::homogeneous", FALSE, ++ //"GtkBox::spacing", 5, ++ //"GtkContainer::border_width", 10, ++ "GtkWidget::parent", main_vbox, ++ "GtkWidget::visible", TRUE, ++ nullptr); ++ GtkWidget *frame = ++ gtk_widget_new(gtk_frame_get_type(), ++ "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN, ++ "GtkFrame::label_xalign", 0.5, ++ "GtkFrame::label", title, ++ //"GtkContainer::border_width", 10, ++ "GtkWidget::parent", vbox, ++ "GtkWidget::visible", TRUE, ++ nullptr); ++ darea = gtk_drawing_area_new(); + +- if (!(disp_type & TWO_ROWS_IN_ONE)) { +- gtk_widget_set_size_request(darea, +- cols * get_char_width() + 2 * get_border(), +- rows * (get_char_height() + get_border()) + get_border()); ++ if (!(disp_type & TWO_ROWS_IN_ONE)) ++ { ++ gtk_widget_set_size_request(darea, ++ cols * get_char_width() + 2 * get_border(), ++ rows * (get_char_height() + get_border()) + get_border()); + +- } else { +- gtk_widget_set_size_request(darea, +- rows * cols * get_char_width() + 2 * get_border(), +- get_char_height() + 2 * get_border()); ++ } ++ else ++ { ++ gtk_widget_set_size_request(darea, ++ rows * cols * get_char_width() + 2 * get_border(), ++ get_char_height() + 2 * get_border()); ++ } ++ ++ gtk_container_add(GTK_CONTAINER(frame), darea); ++ g_signal_connect(darea, ++ "expose_event", ++ G_CALLBACK(lcd_expose_event), ++ this); ++ gtk_widget_add_events(darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); ++ g_signal_connect(darea, ++ "button_press_event", ++ G_CALLBACK(cursor_event), ++ nullptr); ++ gtk_widget_show_all(window); + } +- +- gtk_container_add(GTK_CONTAINER(frame), darea); +- g_signal_connect(darea, +- "expose_event", +- G_CALLBACK(lcd_expose_event), +- this); +- gtk_widget_add_events(darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); +- g_signal_connect(darea, +- "button_press_event", +- G_CALLBACK(cursor_event), +- nullptr); +- gtk_widget_show_all(window); +- } + } + + #endif //HAVE_GUI diff --git a/gpsim.spec b/gpsim.spec index be3eed3..b162dfe 100644 --- a/gpsim.spec +++ b/gpsim.spec @@ -1,6 +1,6 @@ Name: gpsim Version: 0.32.1 -Release: 2%{?dist} +Release: 3%{?dist} Summary: A simulator for Microchip (TM) PIC (TM) microcontrollers Summary(fr): Un simulateur pour les microcontrôleurs PIC (TM) Microchip (TM) @@ -9,13 +9,13 @@ License: GPLv2+ and LGPLv2+ URL: http://gpsim.sourceforge.net/gpsim.html Source: http://downloads.sourceforge.net/gpsim/gpsim-%{version}.tar.gz Source1: gpsim.png -#Patch1: gpsim-settings_exdbm.patch +Patch1: %{name}-%{version}-lcd.patch -BuildRequires: gcc-c++ +BuildRequires: gcc-c++ BuildRequires: gtk2-devel, flex, readline-devel, popt-devel BuildRequires: autoconf gputils desktop-file-utils automake libtool -BuildRequires: make +BuildRequires: make %description @@ -53,7 +53,7 @@ mv ChangeLog ChangeLog.raw iconv -f ISO88592 -t UTF8 AUTHORS.raw -o AUTHORS iconv -f ISO88592 -t UTF8 ChangeLog.raw -o ChangeLog rm -f AUTHORS.raw ChangeLog.raw -#%patch1 -p0 +%patch 1 -p0 autoconf %build @@ -100,6 +100,9 @@ desktop-file-install --vendor=""\ %{_includedir}/* %changelog +* Tue Mar 12 2024 Roy Rankin - 0.32.1-3 +- add patch to fix lcd module + * Wed Jan 24 2024 Fedora Release Engineering - 0.32.1-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild