From 3dbc37ba351ec5a7a8d2b69ef9a2afdb9273c173 Mon Sep 17 00:00:00 2001 From: Brad Grantham Date: Fri, 20 Jul 2018 16:09:59 -0700 Subject: [PATCH] Port to Linux and fix gcc warnings Introduce GLEW for GL extension management Fix warnings about "&" used in logical-AND with precedence likely not matching programmer's intent Fix a GL shader type incompatibility uint vs int in lores shader Add Makefile.linux --- Makefile.linux | 16 +++++++++++ apple2e.cpp | 1 + interface.cpp | 75 +++++++++++++++++++++++++++++--------------------- 3 files changed, 61 insertions(+), 31 deletions(-) create mode 100644 Makefile.linux diff --git a/Makefile.linux b/Makefile.linux new file mode 100644 index 0000000..551c909 --- /dev/null +++ b/Makefile.linux @@ -0,0 +1,16 @@ +INCFLAGS += -I/opt/local/include +CXXFLAGS += $(INCFLAGS) -g -Wall --std=c++11 -O2 +LDFLAGS += -L/opt/local/lib +LDLIBS += -lglfw -lao -lGL -lGLEW + +OBJECTS = apple2e.o dis6502.o fake6502.o interface.o + +# keyboard.o + +all: apple2e + +apple2e: $(OBJECTS) + $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS) + +clean: + rm $(OBJECTS) diff --git a/apple2e.cpp b/apple2e.cpp index 821d4f8..1dd30b4 100644 --- a/apple2e.cpp +++ b/apple2e.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include diff --git a/interface.cpp b/interface.cpp index 69bdab5..afcf429 100644 --- a/interface.cpp +++ b/interface.cpp @@ -7,6 +7,10 @@ #include #include #include +#include +#include +#include +#include #include // implicit centering in widget? Or special centering widget? @@ -15,6 +19,10 @@ // hbox // what is window resize / shrink policy? +#if defined(__linux__) +#include +#endif // defined(__linux__) + #define GLFW_INCLUDE_GLCOREARB #include @@ -398,6 +406,7 @@ static const char *text_vertex_shader = "\n\ // 224-255 is normal 64-95 static const char *text_fragment_shader = "\n\ + precision highp float;\n\ in vec2 raster_coords;\n\ uniform int blink;\n\ uniform vec4 foreground;\n\ @@ -517,52 +526,52 @@ static const char *lores_fragment_shader = "\n\ else\n\ lorespixel = byte / 16u;\n\ switch(lorespixel) {\n\ - case 0:\n\ + case 0u:\n\ color = vec4(0, 0, 0, 1);\n\ break;\n\ - case 1:\n\ + case 1u:\n\ color = vec4(227.0/255.0, 30.0/255.0, 96.0/255.0, 1);\n\ break;\n\ - case 2:\n\ + case 2u:\n\ color = vec4(96.0/255.0, 78.0/255.0, 189.0/255.0, 1);\n\ break;\n\ - case 3:\n\ + case 3u:\n\ color = vec4(255.0/255.0, 68.0/255.0, 253.0/255.0, 1);\n\ break;\n\ - case 4:\n\ + case 4u:\n\ color = vec4(9.0/255.0, 163.0/255.0, 96.0/255.0, 1);\n\ break;\n\ - case 5:\n\ + case 5u:\n\ color = vec4(156.0/255.0, 156.0/255.0, 156.0/255.0, 1);\n\ break;\n\ - case 6:\n\ + case 6u:\n\ color = vec4(20.0/255.0, 207.0/255.0, 253.0/255.0, 1);\n\ break;\n\ - case 7:\n\ + case 7u:\n\ color = vec4(208.0/255.0, 195.0/255.0, 255.0/255.0, 1);\n\ break;\n\ - case 8:\n\ + case 8u:\n\ color = vec4(96.0/255.0, 114.0/255.0, 3.0/255.0, 1);\n\ break;\n\ - case 9:\n\ + case 9u:\n\ color = vec4(255.0/255.0, 106.0/255.0, 60.0/255.0, 1);\n\ break;\n\ - case 10:\n\ + case 10u:\n\ color = vec4(156.0/255.0, 156.0/255.0, 156.0/255.0, 1);\n\ break;\n\ - case 11:\n\ + case 11u:\n\ color = vec4(255.0/255.0, 160.0/255.0, 208.0/255.0, 1);\n\ break;\n\ - case 12:\n\ + case 12u:\n\ color = vec4(20.0/255.0, 245.0/255.0, 60.0/255.0, 1);\n\ break;\n\ - case 13:\n\ + case 13u:\n\ color = vec4(208.0/255.0, 221.0/255.0, 141.0/255.0, 1);\n\ break;\n\ - case 14:\n\ + case 14u:\n\ color = vec4(114.0/255.0, 255.0/255.0, 208.0/255.0, 1);\n\ break;\n\ - case 15:\n\ + case 15u:\n\ color = vec4(255.0/255.0, 255.0/255.0, 255.0/255.0, 1);\n\ break;\n\ }\n\ @@ -1076,7 +1085,7 @@ struct apple2screen : public widget { float w, h; tie(w, h) = get_min_dimensions(); - if(x >= 0 && y >= 0 & x < w && y < h) { + if(x >= 0 && y >= 0 && x < w && y < h) { if(!use_joystick) paddle_buttons[0] = true; return true; @@ -1113,7 +1122,7 @@ struct apple2screen : public widget // insert float w, h; tie(w, h) = get_min_dimensions(); - if(x >= 0 && y >= 0 & x < w && y < h) { + if(x >= 0 && y >= 0 && x < w && y < h) { FILE *fp = fopen(paths[0], "r"); fseek(fp, 0, SEEK_END); long length = ftell(fp); @@ -1172,7 +1181,7 @@ struct text_widget : public widget set(bg, 0, 0, 0, 0); // construct string texture - auto_ptr bytes(new unsigned char[content.size() + 1]); + unique_ptr bytes(new unsigned char[content.size() + 1]); int i = 0; for(auto c : content) { if(c >= ' ' && c <= '?') @@ -1238,7 +1247,7 @@ struct momentary : public text_widget { float w, h; tie(w, h) = get_min_dimensions(); - if(x >= 0 && y >= 0 & x < w && y < h) { + if(x >= 0 && y >= 0 && x < w && y < h) { on = true; set(fg, 0, 0, 0, 1); set(bg, 1, 1, 1, 1); @@ -1251,7 +1260,7 @@ struct momentary : public text_widget { float w, h; tie(w, h) = get_min_dimensions(); - on = (x >= 0 && y >= 0 & x < w && y < h); + on = (x >= 0 && y >= 0 && x < w && y < h); if(on) { set(fg, 0, 0, 0, 1); set(bg, 1, 1, 1, 1); @@ -1311,7 +1320,7 @@ struct toggle : public text_widget { float w, h; tie(w, h) = get_min_dimensions(); - if(x >= 0 && y >= 0 & x < w && y < h) { + if(x >= 0 && y >= 0 && x < w && y < h) { if(on) { set(fg, 0, 0, 0, 1); set(bg, 1, 1, 1, 1); @@ -1328,7 +1337,7 @@ struct toggle : public text_widget { float w, h; tie(w, h) = get_min_dimensions(); - if(x >= 0 && y >= 0 & x < w && y < h) { + if(x >= 0 && y >= 0 && x < w && y < h) { if(on) { set(fg, 0, 0, 0, 1); set(bg, 1, 1, 1, 1); @@ -1367,6 +1376,9 @@ toggle *caps_toggle; void initialize_gl(void) { +#if defined(__linux__) + glewInit(); +#endif // defined(__linux__) GLuint va; glGenVertexArrays(1, &va); glBindVertexArray(va); @@ -1384,6 +1396,7 @@ void initialize_gl(void) CheckOpenGL(__FILE__, __LINE__); image_program = GenerateProgram("image", hires_vertex_shader, image_fragment_shader); + assert(image_program != 0); image_texture_location = glGetUniformLocation(image_program, "image"); image_texture_coord_scale_location = glGetUniformLocation(image_program, "image_coord_scale"); image_to_screen_location = glGetUniformLocation(image_program, "to_screen"); @@ -1391,6 +1404,7 @@ void initialize_gl(void) image_y_offset_location = glGetUniformLocation(image_program, "y_offset"); hires_program = GenerateProgram("hires", hires_vertex_shader, hires_fragment_shader); + assert(hires_program != 0); hires_texture_location = glGetUniformLocation(hires_program, "hires_texture"); hires_texture_coord_scale_location = glGetUniformLocation(hires_program, "hires_texture_coord_scale"); hires_to_screen_location = glGetUniformLocation(hires_program, "to_screen"); @@ -1398,6 +1412,7 @@ void initialize_gl(void) hires_y_offset_location = glGetUniformLocation(hires_program, "y_offset"); hirescolor_program = GenerateProgram("hirescolor", hires_vertex_shader, hirescolor_fragment_shader); + assert(hirescolor_program != 0); hirescolor_texture_location = glGetUniformLocation(hirescolor_program, "hires_texture"); hirescolor_texture_coord_scale_location = glGetUniformLocation(hirescolor_program, "hires_texture_coord_scale"); hirescolor_to_screen_location = glGetUniformLocation(hirescolor_program, "to_screen"); @@ -1405,6 +1420,7 @@ void initialize_gl(void) hirescolor_y_offset_location = glGetUniformLocation(hirescolor_program, "y_offset"); text_program = GenerateProgram("textport", text_vertex_shader, text_fragment_shader); + assert(text_program != 0); textport_texture_location = glGetUniformLocation(text_program, "textport_texture"); textport_texture_coord_scale_location = glGetUniformLocation(text_program, "textport_texture_coord_scale"); textport_font_texture_location = glGetUniformLocation(text_program, "font_texture"); @@ -1418,6 +1434,7 @@ void initialize_gl(void) CheckOpenGL(__FILE__, __LINE__); text80_program = GenerateProgram("textport80", text_vertex_shader, text80_fragment_shader); + assert(text80_program != 0); textport80_texture_location = glGetUniformLocation(text80_program, "textport_texture"); textport80_texture_coord_scale_location = glGetUniformLocation(text80_program, "textport_texture_coord_scale"); textport80_aux_texture_location = glGetUniformLocation(text80_program, "textport_aux_texture"); @@ -1431,7 +1448,8 @@ void initialize_gl(void) textport80_font_texture_coord_scale_location = glGetUniformLocation(text80_program, "font_texture_coord_scale"); CheckOpenGL(__FILE__, __LINE__); - lores_program = GenerateProgram("textport", text_vertex_shader, lores_fragment_shader); + lores_program = GenerateProgram("lores", text_vertex_shader, lores_fragment_shader); + assert(lores_program != 0); lores_texture_location = glGetUniformLocation(lores_program, "lores_texture"); lores_texture_coord_scale_location = glGetUniformLocation(lores_program, "lores_texture_coord_scale"); lores_x_offset_location = glGetUniformLocation(lores_program, "x_offset"); @@ -1555,7 +1573,7 @@ struct floppy_icon : public widget { float w, h; tie(w, h) = get_min_dimensions(); - if(x >= 0 && y >= 0 & x < w && y < h) + if(x >= 0 && y >= 0 && x < w && y < h) return true; return false; } @@ -1577,7 +1595,7 @@ struct floppy_icon : public widget // insert float w, h; tie(w, h) = get_min_dimensions(); - if(x >= 0 && y >= 0 & x < w && y < h) { + if(x >= 0 && y >= 0 && x < w && y < h) { event_queue.push_back({INSERT_FLOPPY, number, strdup(paths[0])}); switched->which = 1; return true; @@ -1779,11 +1797,6 @@ static void motion(GLFWwindow *window, double x, double y) chrono::time_point now = std::chrono::system_clock::now(); chrono::duration elapsed = now - start_time; - double dx, dy; - - dx = x - gOldMouseX; - dy = y - gOldMouseY; - gOldMouseX = x; gOldMouseY = y;