diff --git a/vimlac/Makefile b/vimlac/Makefile index 34391b9..a154f16 100755 --- a/vimlac/Makefile +++ b/vimlac/Makefile @@ -3,7 +3,8 @@ CFILES = cpu.c dcpu.c ptrptp.c memory.c kb.c ttyin.c ttyout.c trace.c error.c lo HFILES = cpu.h dcpu.h ptrptp.h memory.h kb.h ttyin.h ttyout.h trace.h error.h log.h plist.h bootstrap.h display_sdl.h OFILES = vimlac.o $(DEVFILES) -CFLAGS=-O2 -Wall -pedantic -std=c99 -g -I /usr/local/include/SDL2/ -l SDL2-2.0.0 +CFLAGS=-O2 -Wall -pedantic -std=c99 -g -I /usr/local/include/SDL2/ +LDFLAGS=-l SDL2-2.0.0 test: vimlac rm -f vimlac.log trace.out *.pbm; time ./vimlac -b ptr -ptr chars.ptp -r 040 -r 0100 @@ -15,7 +16,7 @@ test_cpu: test_cpu.c $(DEVFILES) Makefile gcc -o test_cpu ${CFLAGS} $(DEVFILES) test_cpu.c vimlac: ${OFILES} Makefile - gcc -o vimlac ${CFLAGS} ${OFILES} + gcc -o vimlac ${CFLAGS} ${OFILES} ${LDFLAGS} test_ptr: test_ptr.c ptrptp.c error.c Makefile gcc -o test_ptr ${CFLAGS} error.c ptrptp.c test_ptr.c diff --git a/vimlac/cpu.c b/vimlac/cpu.c index 542329d..d234196 100755 --- a/vimlac/cpu.c +++ b/vimlac/cpu.c @@ -141,6 +141,12 @@ cpu_running(void) } +void +cpu_abort(void) +{ + cpu_on = false; +} + void cpu_set_AC(WORD new_ac) { diff --git a/vimlac/cpu.h b/vimlac/cpu.h index 3c0a50c..6f7e45a 100755 --- a/vimlac/cpu.h +++ b/vimlac/cpu.h @@ -25,6 +25,7 @@ void cpu_set_AC(WORD ac); void cpu_set_L(WORD l); void cpu_set_PC(WORD pc); void cpu_set_DS(WORD ds); +void cpu_abort(void); #endif diff --git a/vimlac/dcpu.c b/vimlac/dcpu.c index f29352c..c408985 100755 --- a/vimlac/dcpu.c +++ b/vimlac/dcpu.c @@ -9,7 +9,7 @@ #include "vimlac.h" #include "dcpu.h" #include "memory.h" -#include "display_pbm.h" +#include "display.h" #include "log.h" #include "trace.h" diff --git a/vimlac/display_sdl.c b/vimlac/display_sdl.c index 9aa9cb4..e342a59 100644 --- a/vimlac/display_sdl.c +++ b/vimlac/display_sdl.c @@ -17,8 +17,13 @@ * Constants, etc. ******/ -#define MAX_X 512 // max X coord -#define MAX_Y 512 // max Y coord +// screen/display stuff +#define MAX_X 512 // max X coord for display +#define MAX_Y 512 // max Y coord for display +#define SCALE_MAX_X 2048 // max vimlac X coord +#define SCALE_MAX_Y 2048 // max vimlac Y coord + +// initial and increment size for dynamic DisplayList #define DL_INIT_SIZE 2048 // initial size of the DisplayList array #define DL_INC_SIZE 1024 // how much we increase DisplayList size @@ -32,10 +37,10 @@ typedef struct DrawLine } DrawLine; // display state variables -static SDL_Window* window = NULL; // the SDL window reference -static SDL_Renderer* renderer = NULL; // reference to SDL renderer +static SDL_Window *window = NULL; // the SDL window reference +static SDL_Renderer *renderer = NULL; // reference to SDL renderer -static DrawLine *DisplayList; // the DrawLine array +static DrawLine *DisplayList; // the DrawLine array (dynamic) static int DisplayListSize = 0; // current size of the dynamic DisplayList static int NumLines = 0; // number of lines in DisplayList static bool DisplayDirty = false; // true if the DisplayList has changed @@ -69,6 +74,16 @@ void display_draw(int x1, int y1, int x2, int y2) DisplayListSize = newsize; } + // invert the Y coords + y1 = SCALE_MAX_Y - y1; + y2 = SCALE_MAX_Y - y2; + + // scale line coords + x1 = x1 / (SCALE_MAX_X / MAX_X); + y1 = y1 / (SCALE_MAX_Y / MAX_Y); + x2 = x2 / (SCALE_MAX_X / MAX_X); + y2 = y2 / (SCALE_MAX_Y / MAX_Y); + // add new line to DisplayList DrawLine *p = &DisplayList[NumLines++]; @@ -131,18 +146,58 @@ Description : Initialize the SDL system. bool display_init() { + printf("display_init: called\n"); + + SDL_DisplayMode dm; + if (SDL_Init(SDL_INIT_VIDEO) != 0) return false; - if (SDL_CreateWindowAndRenderer(MAX_X, MAX_Y, 0, &window, &renderer) != 0) + if (SDL_GetDesktopDisplayMode(0, &dm) != 0) + { + printf("SDL_GetDesktopDisplayMode failed: %s\n", SDL_GetError()); + return false; + } + printf("Screen wxh = %d x %d\n", dm.w, dm.h); + +// if (SDL_CreateWindowAndRenderer(MAX_X, MAX_Y, 0, &window, &renderer) != 0) +// { +// if (renderer) +// SDL_DestroyRenderer(renderer); +// if (window) +// SDL_DestroyWindow(window); +// return false; +// } + + window = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, MAX_X, + MAX_Y, SDL_WINDOW_SHOWN); + +// window = SDL_CreateWindow( +// "An SDL2 window", // window title +// SDL_WINDOWPOS_UNDEFINED, // initial x position +// SDL_WINDOWPOS_UNDEFINED, // initial y position +// MAX_X, // width, in pixels +// MAX_Y, // height, in pixels +// SDL_WINDOW_OPENGL // flags - see below +// ); + if (!window) + { + return false; + } + + + renderer = SDL_CreateRenderer(window, -1, 0); + if (!renderer) { - if (renderer) - SDL_DestroyRenderer(renderer); if (window) SDL_DestroyWindow(window); return false; } + // set window title + SDL_SetWindowTitle(window, "vimlac 0.1"); + // allocate the initial DisplayList array DisplayList = malloc(sizeof(DrawLine) * DL_INIT_SIZE); if (DisplayList) diff --git a/vimlac/vimlac.c b/vimlac/vimlac.c index afbfb1d..7233157 100755 --- a/vimlac/vimlac.c +++ b/vimlac/vimlac.c @@ -32,12 +32,12 @@ #include #include #include +#include #include "vimlac.h" #include "bootstrap.h" #include "memory.h" #include "ptrptp.h" -//#include "display_pbm.h" #include "display.h" #include "cpu.h" #include "dcpu.h" @@ -140,6 +140,16 @@ run(WORD pc) if (!dcpu_running() && display_dirty()) display_write(); + + SDL_Event e; + while (SDL_PollEvent(&e) != 0) + { + if (e.type == SDL_QUIT) + { + cpu_abort(); + printf("cpu_on set to %s\n", cpu_running() ? "true" : "false"); + } + } } trace_close();