mirror of
https://github.com/bradgrantham/apple2e.git
synced 2025-03-12 03:33:48 +00:00
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
This commit is contained in:
parent
6745843b0c
commit
3dbc37ba35
16
Makefile.linux
Normal file
16
Makefile.linux
Normal file
@ -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)
|
@ -10,6 +10,7 @@
|
|||||||
#include <deque>
|
#include <deque>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
#include <functional>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,6 +7,10 @@
|
|||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
#include <functional>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cassert>
|
||||||
#include <ao/ao.h>
|
#include <ao/ao.h>
|
||||||
|
|
||||||
// implicit centering in widget? Or special centering widget?
|
// implicit centering in widget? Or special centering widget?
|
||||||
@ -15,6 +19,10 @@
|
|||||||
// hbox
|
// hbox
|
||||||
// what is window resize / shrink policy?
|
// what is window resize / shrink policy?
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
|
#include <GL/glew.h>
|
||||||
|
#endif // defined(__linux__)
|
||||||
|
|
||||||
#define GLFW_INCLUDE_GLCOREARB
|
#define GLFW_INCLUDE_GLCOREARB
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
@ -398,6 +406,7 @@ static const char *text_vertex_shader = "\n\
|
|||||||
// 224-255 is normal 64-95
|
// 224-255 is normal 64-95
|
||||||
|
|
||||||
static const char *text_fragment_shader = "\n\
|
static const char *text_fragment_shader = "\n\
|
||||||
|
precision highp float;\n\
|
||||||
in vec2 raster_coords;\n\
|
in vec2 raster_coords;\n\
|
||||||
uniform int blink;\n\
|
uniform int blink;\n\
|
||||||
uniform vec4 foreground;\n\
|
uniform vec4 foreground;\n\
|
||||||
@ -517,52 +526,52 @@ static const char *lores_fragment_shader = "\n\
|
|||||||
else\n\
|
else\n\
|
||||||
lorespixel = byte / 16u;\n\
|
lorespixel = byte / 16u;\n\
|
||||||
switch(lorespixel) {\n\
|
switch(lorespixel) {\n\
|
||||||
case 0:\n\
|
case 0u:\n\
|
||||||
color = vec4(0, 0, 0, 1);\n\
|
color = vec4(0, 0, 0, 1);\n\
|
||||||
break;\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\
|
color = vec4(227.0/255.0, 30.0/255.0, 96.0/255.0, 1);\n\
|
||||||
break;\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\
|
color = vec4(96.0/255.0, 78.0/255.0, 189.0/255.0, 1);\n\
|
||||||
break;\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\
|
color = vec4(255.0/255.0, 68.0/255.0, 253.0/255.0, 1);\n\
|
||||||
break;\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\
|
color = vec4(9.0/255.0, 163.0/255.0, 96.0/255.0, 1);\n\
|
||||||
break;\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\
|
color = vec4(156.0/255.0, 156.0/255.0, 156.0/255.0, 1);\n\
|
||||||
break;\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\
|
color = vec4(20.0/255.0, 207.0/255.0, 253.0/255.0, 1);\n\
|
||||||
break;\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\
|
color = vec4(208.0/255.0, 195.0/255.0, 255.0/255.0, 1);\n\
|
||||||
break;\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\
|
color = vec4(96.0/255.0, 114.0/255.0, 3.0/255.0, 1);\n\
|
||||||
break;\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\
|
color = vec4(255.0/255.0, 106.0/255.0, 60.0/255.0, 1);\n\
|
||||||
break;\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\
|
color = vec4(156.0/255.0, 156.0/255.0, 156.0/255.0, 1);\n\
|
||||||
break;\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\
|
color = vec4(255.0/255.0, 160.0/255.0, 208.0/255.0, 1);\n\
|
||||||
break;\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\
|
color = vec4(20.0/255.0, 245.0/255.0, 60.0/255.0, 1);\n\
|
||||||
break;\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\
|
color = vec4(208.0/255.0, 221.0/255.0, 141.0/255.0, 1);\n\
|
||||||
break;\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\
|
color = vec4(114.0/255.0, 255.0/255.0, 208.0/255.0, 1);\n\
|
||||||
break;\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\
|
color = vec4(255.0/255.0, 255.0/255.0, 255.0/255.0, 1);\n\
|
||||||
break;\n\
|
break;\n\
|
||||||
}\n\
|
}\n\
|
||||||
@ -1076,7 +1085,7 @@ struct apple2screen : public widget
|
|||||||
{
|
{
|
||||||
float w, h;
|
float w, h;
|
||||||
tie(w, h) = get_min_dimensions();
|
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)
|
if(!use_joystick)
|
||||||
paddle_buttons[0] = true;
|
paddle_buttons[0] = true;
|
||||||
return true;
|
return true;
|
||||||
@ -1113,7 +1122,7 @@ struct apple2screen : public widget
|
|||||||
// insert
|
// insert
|
||||||
float w, h;
|
float w, h;
|
||||||
tie(w, h) = get_min_dimensions();
|
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");
|
FILE *fp = fopen(paths[0], "r");
|
||||||
fseek(fp, 0, SEEK_END);
|
fseek(fp, 0, SEEK_END);
|
||||||
long length = ftell(fp);
|
long length = ftell(fp);
|
||||||
@ -1172,7 +1181,7 @@ struct text_widget : public widget
|
|||||||
set(bg, 0, 0, 0, 0);
|
set(bg, 0, 0, 0, 0);
|
||||||
|
|
||||||
// construct string texture
|
// construct string texture
|
||||||
auto_ptr<unsigned char> bytes(new unsigned char[content.size() + 1]);
|
unique_ptr<unsigned char> bytes(new unsigned char[content.size() + 1]);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for(auto c : content) {
|
for(auto c : content) {
|
||||||
if(c >= ' ' && c <= '?')
|
if(c >= ' ' && c <= '?')
|
||||||
@ -1238,7 +1247,7 @@ struct momentary : public text_widget
|
|||||||
{
|
{
|
||||||
float w, h;
|
float w, h;
|
||||||
tie(w, h) = get_min_dimensions();
|
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;
|
on = true;
|
||||||
set(fg, 0, 0, 0, 1);
|
set(fg, 0, 0, 0, 1);
|
||||||
set(bg, 1, 1, 1, 1);
|
set(bg, 1, 1, 1, 1);
|
||||||
@ -1251,7 +1260,7 @@ struct momentary : public text_widget
|
|||||||
{
|
{
|
||||||
float w, h;
|
float w, h;
|
||||||
tie(w, h) = get_min_dimensions();
|
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) {
|
if(on) {
|
||||||
set(fg, 0, 0, 0, 1);
|
set(fg, 0, 0, 0, 1);
|
||||||
set(bg, 1, 1, 1, 1);
|
set(bg, 1, 1, 1, 1);
|
||||||
@ -1311,7 +1320,7 @@ struct toggle : public text_widget
|
|||||||
{
|
{
|
||||||
float w, h;
|
float w, h;
|
||||||
tie(w, h) = get_min_dimensions();
|
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) {
|
if(on) {
|
||||||
set(fg, 0, 0, 0, 1);
|
set(fg, 0, 0, 0, 1);
|
||||||
set(bg, 1, 1, 1, 1);
|
set(bg, 1, 1, 1, 1);
|
||||||
@ -1328,7 +1337,7 @@ struct toggle : public text_widget
|
|||||||
{
|
{
|
||||||
float w, h;
|
float w, h;
|
||||||
tie(w, h) = get_min_dimensions();
|
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) {
|
if(on) {
|
||||||
set(fg, 0, 0, 0, 1);
|
set(fg, 0, 0, 0, 1);
|
||||||
set(bg, 1, 1, 1, 1);
|
set(bg, 1, 1, 1, 1);
|
||||||
@ -1367,6 +1376,9 @@ toggle *caps_toggle;
|
|||||||
|
|
||||||
void initialize_gl(void)
|
void initialize_gl(void)
|
||||||
{
|
{
|
||||||
|
#if defined(__linux__)
|
||||||
|
glewInit();
|
||||||
|
#endif // defined(__linux__)
|
||||||
GLuint va;
|
GLuint va;
|
||||||
glGenVertexArrays(1, &va);
|
glGenVertexArrays(1, &va);
|
||||||
glBindVertexArray(va);
|
glBindVertexArray(va);
|
||||||
@ -1384,6 +1396,7 @@ void initialize_gl(void)
|
|||||||
CheckOpenGL(__FILE__, __LINE__);
|
CheckOpenGL(__FILE__, __LINE__);
|
||||||
|
|
||||||
image_program = GenerateProgram("image", hires_vertex_shader, image_fragment_shader);
|
image_program = GenerateProgram("image", hires_vertex_shader, image_fragment_shader);
|
||||||
|
assert(image_program != 0);
|
||||||
image_texture_location = glGetUniformLocation(image_program, "image");
|
image_texture_location = glGetUniformLocation(image_program, "image");
|
||||||
image_texture_coord_scale_location = glGetUniformLocation(image_program, "image_coord_scale");
|
image_texture_coord_scale_location = glGetUniformLocation(image_program, "image_coord_scale");
|
||||||
image_to_screen_location = glGetUniformLocation(image_program, "to_screen");
|
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");
|
image_y_offset_location = glGetUniformLocation(image_program, "y_offset");
|
||||||
|
|
||||||
hires_program = GenerateProgram("hires", hires_vertex_shader, hires_fragment_shader);
|
hires_program = GenerateProgram("hires", hires_vertex_shader, hires_fragment_shader);
|
||||||
|
assert(hires_program != 0);
|
||||||
hires_texture_location = glGetUniformLocation(hires_program, "hires_texture");
|
hires_texture_location = glGetUniformLocation(hires_program, "hires_texture");
|
||||||
hires_texture_coord_scale_location = glGetUniformLocation(hires_program, "hires_texture_coord_scale");
|
hires_texture_coord_scale_location = glGetUniformLocation(hires_program, "hires_texture_coord_scale");
|
||||||
hires_to_screen_location = glGetUniformLocation(hires_program, "to_screen");
|
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");
|
hires_y_offset_location = glGetUniformLocation(hires_program, "y_offset");
|
||||||
|
|
||||||
hirescolor_program = GenerateProgram("hirescolor", hires_vertex_shader, hirescolor_fragment_shader);
|
hirescolor_program = GenerateProgram("hirescolor", hires_vertex_shader, hirescolor_fragment_shader);
|
||||||
|
assert(hirescolor_program != 0);
|
||||||
hirescolor_texture_location = glGetUniformLocation(hirescolor_program, "hires_texture");
|
hirescolor_texture_location = glGetUniformLocation(hirescolor_program, "hires_texture");
|
||||||
hirescolor_texture_coord_scale_location = glGetUniformLocation(hirescolor_program, "hires_texture_coord_scale");
|
hirescolor_texture_coord_scale_location = glGetUniformLocation(hirescolor_program, "hires_texture_coord_scale");
|
||||||
hirescolor_to_screen_location = glGetUniformLocation(hirescolor_program, "to_screen");
|
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");
|
hirescolor_y_offset_location = glGetUniformLocation(hirescolor_program, "y_offset");
|
||||||
|
|
||||||
text_program = GenerateProgram("textport", text_vertex_shader, text_fragment_shader);
|
text_program = GenerateProgram("textport", text_vertex_shader, text_fragment_shader);
|
||||||
|
assert(text_program != 0);
|
||||||
textport_texture_location = glGetUniformLocation(text_program, "textport_texture");
|
textport_texture_location = glGetUniformLocation(text_program, "textport_texture");
|
||||||
textport_texture_coord_scale_location = glGetUniformLocation(text_program, "textport_texture_coord_scale");
|
textport_texture_coord_scale_location = glGetUniformLocation(text_program, "textport_texture_coord_scale");
|
||||||
textport_font_texture_location = glGetUniformLocation(text_program, "font_texture");
|
textport_font_texture_location = glGetUniformLocation(text_program, "font_texture");
|
||||||
@ -1418,6 +1434,7 @@ void initialize_gl(void)
|
|||||||
CheckOpenGL(__FILE__, __LINE__);
|
CheckOpenGL(__FILE__, __LINE__);
|
||||||
|
|
||||||
text80_program = GenerateProgram("textport80", text_vertex_shader, text80_fragment_shader);
|
text80_program = GenerateProgram("textport80", text_vertex_shader, text80_fragment_shader);
|
||||||
|
assert(text80_program != 0);
|
||||||
textport80_texture_location = glGetUniformLocation(text80_program, "textport_texture");
|
textport80_texture_location = glGetUniformLocation(text80_program, "textport_texture");
|
||||||
textport80_texture_coord_scale_location = glGetUniformLocation(text80_program, "textport_texture_coord_scale");
|
textport80_texture_coord_scale_location = glGetUniformLocation(text80_program, "textport_texture_coord_scale");
|
||||||
textport80_aux_texture_location = glGetUniformLocation(text80_program, "textport_aux_texture");
|
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");
|
textport80_font_texture_coord_scale_location = glGetUniformLocation(text80_program, "font_texture_coord_scale");
|
||||||
CheckOpenGL(__FILE__, __LINE__);
|
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_location = glGetUniformLocation(lores_program, "lores_texture");
|
||||||
lores_texture_coord_scale_location = glGetUniformLocation(lores_program, "lores_texture_coord_scale");
|
lores_texture_coord_scale_location = glGetUniformLocation(lores_program, "lores_texture_coord_scale");
|
||||||
lores_x_offset_location = glGetUniformLocation(lores_program, "x_offset");
|
lores_x_offset_location = glGetUniformLocation(lores_program, "x_offset");
|
||||||
@ -1555,7 +1573,7 @@ struct floppy_icon : public widget
|
|||||||
{
|
{
|
||||||
float w, h;
|
float w, h;
|
||||||
tie(w, h) = get_min_dimensions();
|
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 true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1577,7 +1595,7 @@ struct floppy_icon : public widget
|
|||||||
// insert
|
// insert
|
||||||
float w, h;
|
float w, h;
|
||||||
tie(w, h) = get_min_dimensions();
|
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])});
|
event_queue.push_back({INSERT_FLOPPY, number, strdup(paths[0])});
|
||||||
switched->which = 1;
|
switched->which = 1;
|
||||||
return true;
|
return true;
|
||||||
@ -1779,11 +1797,6 @@ static void motion(GLFWwindow *window, double x, double y)
|
|||||||
chrono::time_point<chrono::system_clock> now = std::chrono::system_clock::now();
|
chrono::time_point<chrono::system_clock> now = std::chrono::system_clock::now();
|
||||||
chrono::duration<double> elapsed = now - start_time;
|
chrono::duration<double> elapsed = now - start_time;
|
||||||
|
|
||||||
double dx, dy;
|
|
||||||
|
|
||||||
dx = x - gOldMouseX;
|
|
||||||
dy = y - gOldMouseY;
|
|
||||||
|
|
||||||
gOldMouseX = x;
|
gOldMouseX = x;
|
||||||
gOldMouseY = y;
|
gOldMouseY = y;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user