From a4614438629c66914a6b8ee9696fe85eb5f4c4b0 Mon Sep 17 00:00:00 2001 From: Ian C Date: Sun, 23 May 2021 20:58:26 +0000 Subject: Updates for SDL2 --- src/Makefile | 200 +-------------------------------------------- src/gfx.c | 257 +++++++++++++++++++++++++++++----------------------------- src/gfx.h | 16 ---- src/gui.c | 6 +- src/memmenu.c | 4 - src/zx81.c | 7 +- 6 files changed, 139 insertions(+), 351 deletions(-) diff --git a/src/Makefile b/src/Makefile index 5103ab6..e50c10d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -26,7 +26,7 @@ # Simply comment out if not, and replace as needed. # Other CFLAGS lines *are* required. # -CFLAGS = -g -Wall -Werror -pedantic -ansi +CFLAGS = -O2 TARGET = ezx81 @@ -56,207 +56,13 @@ OBJECTS = main.o \ z80_decode.o \ z80_dis.o -CFLAGS += `sdl-config --cflags` +CFLAGS += `sdl2-config --cflags` -LIBS = `sdl-config --libs` +LIBS = `sdl2-config --libs` $(TARGET): $(OBJECTS) $(Z80LIB) $(CC) $(CFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS) -$(Z80LIB): z80/*.[ch] - cd z80; make "EXTERNAL_CFLAGS=`sdl-config --cflags`" ; cd .. - clean: rm -f $(TARGET) $(TARGET).exe $(OBJECTS) core - -depend: - makedepend -- $(CFLAGS) -- $(SOURCE) - if test -e Makefile ; then rm -f Makefile.bak ; fi - -# DO NOT DELETE THIS LINE -- make depend depends on it - -main.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -main.o: /usr/include/sys/_null.h /usr/include/sys/_types.h -main.o: /usr/include/machine/_types.h /usr/include/stdio.h -main.o: /usr/include/string.h /usr/include/strings.h -main.o: /usr/local/include/SDL11/SDL.h /usr/local/include/SDL11/SDL_main.h -main.o: /usr/local/include/SDL11/SDL_types.h -main.o: /usr/local/include/SDL11/SDL_getenv.h -main.o: /usr/local/include/SDL11/SDL_error.h -main.o: /usr/local/include/SDL11/begin_code.h -main.o: /usr/local/include/SDL11/close_code.h -main.o: /usr/local/include/SDL11/SDL_rwops.h -main.o: /usr/local/include/SDL11/SDL_timer.h -main.o: /usr/local/include/SDL11/SDL_audio.h -main.o: /usr/local/include/SDL11/SDL_byteorder.h -main.o: /usr/local/include/SDL11/SDL_cdrom.h -main.o: /usr/local/include/SDL11/SDL_joystick.h -main.o: /usr/local/include/SDL11/SDL_events.h -main.o: /usr/local/include/SDL11/SDL_active.h -main.o: /usr/local/include/SDL11/SDL_keyboard.h -main.o: /usr/local/include/SDL11/SDL_keysym.h -main.o: /usr/local/include/SDL11/SDL_mouse.h -main.o: /usr/local/include/SDL11/SDL_video.h -main.o: /usr/local/include/SDL11/SDL_mutex.h -main.o: /usr/local/include/SDL11/SDL_quit.h -main.o: /usr/local/include/SDL11/SDL_version.h z80.h z80_config.h zx81.h -main.o: gfx.h gui.h memmenu.h config.h exit.h -zx81.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -zx81.o: /usr/include/sys/_null.h /usr/include/sys/_types.h -zx81.o: /usr/include/machine/_types.h /usr/include/stdio.h -zx81.o: /usr/include/string.h /usr/include/strings.h zx81.h z80.h -zx81.o: z80_config.h /usr/local/include/SDL11/SDL.h -zx81.o: /usr/local/include/SDL11/SDL_main.h -zx81.o: /usr/local/include/SDL11/SDL_types.h -zx81.o: /usr/local/include/SDL11/SDL_getenv.h -zx81.o: /usr/local/include/SDL11/SDL_error.h -zx81.o: /usr/local/include/SDL11/begin_code.h -zx81.o: /usr/local/include/SDL11/close_code.h -zx81.o: /usr/local/include/SDL11/SDL_rwops.h -zx81.o: /usr/local/include/SDL11/SDL_timer.h -zx81.o: /usr/local/include/SDL11/SDL_audio.h -zx81.o: /usr/local/include/SDL11/SDL_byteorder.h -zx81.o: /usr/local/include/SDL11/SDL_cdrom.h -zx81.o: /usr/local/include/SDL11/SDL_joystick.h -zx81.o: /usr/local/include/SDL11/SDL_events.h -zx81.o: /usr/local/include/SDL11/SDL_active.h -zx81.o: /usr/local/include/SDL11/SDL_keyboard.h -zx81.o: /usr/local/include/SDL11/SDL_keysym.h -zx81.o: /usr/local/include/SDL11/SDL_mouse.h -zx81.o: /usr/local/include/SDL11/SDL_video.h -zx81.o: /usr/local/include/SDL11/SDL_mutex.h -zx81.o: /usr/local/include/SDL11/SDL_quit.h -zx81.o: /usr/local/include/SDL11/SDL_version.h gfx.h gui.h config.h util.h -zx81.o: exit.h -config.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -config.o: /usr/include/sys/_null.h /usr/include/sys/_types.h -config.o: /usr/include/machine/_types.h /usr/include/stdio.h -config.o: /usr/include/string.h /usr/include/strings.h exit.h config.h -gfx.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -gfx.o: /usr/include/sys/_null.h /usr/include/sys/_types.h -gfx.o: /usr/include/machine/_types.h /usr/include/stdio.h -gfx.o: /usr/include/string.h /usr/include/strings.h /usr/include/stdarg.h -gfx.o: gfx.h /usr/local/include/SDL11/SDL.h -gfx.o: /usr/local/include/SDL11/SDL_main.h -gfx.o: /usr/local/include/SDL11/SDL_types.h -gfx.o: /usr/local/include/SDL11/SDL_getenv.h -gfx.o: /usr/local/include/SDL11/SDL_error.h -gfx.o: /usr/local/include/SDL11/begin_code.h -gfx.o: /usr/local/include/SDL11/close_code.h -gfx.o: /usr/local/include/SDL11/SDL_rwops.h -gfx.o: /usr/local/include/SDL11/SDL_timer.h -gfx.o: /usr/local/include/SDL11/SDL_audio.h -gfx.o: /usr/local/include/SDL11/SDL_byteorder.h -gfx.o: /usr/local/include/SDL11/SDL_cdrom.h -gfx.o: /usr/local/include/SDL11/SDL_joystick.h -gfx.o: /usr/local/include/SDL11/SDL_events.h -gfx.o: /usr/local/include/SDL11/SDL_active.h -gfx.o: /usr/local/include/SDL11/SDL_keyboard.h -gfx.o: /usr/local/include/SDL11/SDL_keysym.h -gfx.o: /usr/local/include/SDL11/SDL_mouse.h -gfx.o: /usr/local/include/SDL11/SDL_video.h -gfx.o: /usr/local/include/SDL11/SDL_mutex.h -gfx.o: /usr/local/include/SDL11/SDL_quit.h -gfx.o: /usr/local/include/SDL11/SDL_version.h exit.h config.h font.h -gui.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -gui.o: /usr/include/sys/_null.h /usr/include/sys/_types.h -gui.o: /usr/include/machine/_types.h /usr/include/stdio.h -gui.o: /usr/include/string.h /usr/include/strings.h /usr/include/stdarg.h -gui.o: /usr/include/ctype.h /usr/include/_ctype.h /usr/include/runetype.h -gui.o: gui.h /usr/local/include/SDL11/SDL.h -gui.o: /usr/local/include/SDL11/SDL_main.h -gui.o: /usr/local/include/SDL11/SDL_types.h -gui.o: /usr/local/include/SDL11/SDL_getenv.h -gui.o: /usr/local/include/SDL11/SDL_error.h -gui.o: /usr/local/include/SDL11/begin_code.h -gui.o: /usr/local/include/SDL11/close_code.h -gui.o: /usr/local/include/SDL11/SDL_rwops.h -gui.o: /usr/local/include/SDL11/SDL_timer.h -gui.o: /usr/local/include/SDL11/SDL_audio.h -gui.o: /usr/local/include/SDL11/SDL_byteorder.h -gui.o: /usr/local/include/SDL11/SDL_cdrom.h -gui.o: /usr/local/include/SDL11/SDL_joystick.h -gui.o: /usr/local/include/SDL11/SDL_events.h -gui.o: /usr/local/include/SDL11/SDL_active.h -gui.o: /usr/local/include/SDL11/SDL_keyboard.h -gui.o: /usr/local/include/SDL11/SDL_keysym.h -gui.o: /usr/local/include/SDL11/SDL_mouse.h -gui.o: /usr/local/include/SDL11/SDL_video.h -gui.o: /usr/local/include/SDL11/SDL_mutex.h -gui.o: /usr/local/include/SDL11/SDL_quit.h -gui.o: /usr/local/include/SDL11/SDL_version.h gfx.h util.h exit.h -memmenu.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -memmenu.o: /usr/include/sys/_null.h /usr/include/sys/_types.h -memmenu.o: /usr/include/machine/_types.h /usr/include/stdio.h -memmenu.o: /usr/include/string.h /usr/include/strings.h /usr/include/ctype.h -memmenu.o: /usr/include/_ctype.h /usr/include/runetype.h memmenu.h z80.h -memmenu.o: z80_config.h zx81.h /usr/local/include/SDL11/SDL.h -memmenu.o: /usr/local/include/SDL11/SDL_main.h -memmenu.o: /usr/local/include/SDL11/SDL_types.h -memmenu.o: /usr/local/include/SDL11/SDL_getenv.h -memmenu.o: /usr/local/include/SDL11/SDL_error.h -memmenu.o: /usr/local/include/SDL11/begin_code.h -memmenu.o: /usr/local/include/SDL11/close_code.h -memmenu.o: /usr/local/include/SDL11/SDL_rwops.h -memmenu.o: /usr/local/include/SDL11/SDL_timer.h -memmenu.o: /usr/local/include/SDL11/SDL_audio.h -memmenu.o: /usr/local/include/SDL11/SDL_byteorder.h -memmenu.o: /usr/local/include/SDL11/SDL_cdrom.h -memmenu.o: /usr/local/include/SDL11/SDL_joystick.h -memmenu.o: /usr/local/include/SDL11/SDL_events.h -memmenu.o: /usr/local/include/SDL11/SDL_active.h -memmenu.o: /usr/local/include/SDL11/SDL_keyboard.h -memmenu.o: /usr/local/include/SDL11/SDL_keysym.h -memmenu.o: /usr/local/include/SDL11/SDL_mouse.h -memmenu.o: /usr/local/include/SDL11/SDL_video.h -memmenu.o: /usr/local/include/SDL11/SDL_mutex.h -memmenu.o: /usr/local/include/SDL11/SDL_quit.h -memmenu.o: /usr/local/include/SDL11/SDL_version.h gfx.h gui.h expr.h util.h -util.o: /usr/include/stdio.h /usr/include/sys/cdefs.h -util.o: /usr/include/sys/_null.h /usr/include/sys/_types.h -util.o: /usr/include/machine/_types.h /usr/include/string.h -util.o: /usr/include/strings.h /usr/include/stdarg.h util.h -util.o: /usr/include/stdlib.h exit.h -exit.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -exit.o: /usr/include/sys/_null.h /usr/include/sys/_types.h -exit.o: /usr/include/machine/_types.h /usr/include/stdarg.h exit.h -exit.o: /usr/local/include/SDL11/SDL.h /usr/local/include/SDL11/SDL_main.h -exit.o: /usr/local/include/SDL11/SDL_types.h -exit.o: /usr/local/include/SDL11/SDL_getenv.h -exit.o: /usr/local/include/SDL11/SDL_error.h -exit.o: /usr/local/include/SDL11/begin_code.h -exit.o: /usr/local/include/SDL11/close_code.h -exit.o: /usr/local/include/SDL11/SDL_rwops.h /usr/include/stdio.h -exit.o: /usr/local/include/SDL11/SDL_timer.h -exit.o: /usr/local/include/SDL11/SDL_audio.h -exit.o: /usr/local/include/SDL11/SDL_byteorder.h -exit.o: /usr/local/include/SDL11/SDL_cdrom.h -exit.o: /usr/local/include/SDL11/SDL_joystick.h -exit.o: /usr/local/include/SDL11/SDL_events.h -exit.o: /usr/local/include/SDL11/SDL_active.h -exit.o: /usr/local/include/SDL11/SDL_keyboard.h -exit.o: /usr/local/include/SDL11/SDL_keysym.h -exit.o: /usr/local/include/SDL11/SDL_mouse.h -exit.o: /usr/local/include/SDL11/SDL_video.h -exit.o: /usr/local/include/SDL11/SDL_mutex.h -exit.o: /usr/local/include/SDL11/SDL_quit.h -exit.o: /usr/local/include/SDL11/SDL_version.h -expr.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -expr.o: /usr/include/sys/_null.h /usr/include/sys/_types.h -expr.o: /usr/include/machine/_types.h /usr/include/stdio.h -expr.o: /usr/include/string.h /usr/include/strings.h /usr/include/ctype.h -expr.o: /usr/include/_ctype.h /usr/include/runetype.h -z80.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -z80.o: /usr/include/sys/_null.h /usr/include/sys/_types.h -z80.o: /usr/include/machine/_types.h /usr/include/string.h -z80.o: /usr/include/strings.h z80.h z80_config.h z80_private.h -z80_decode.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -z80_decode.o: /usr/include/sys/_null.h /usr/include/sys/_types.h -z80_decode.o: /usr/include/machine/_types.h /usr/include/limits.h -z80_decode.o: /usr/include/sys/limits.h /usr/include/machine/_limits.h -z80_decode.o: /usr/include/sys/syslimits.h z80.h z80_config.h z80_private.h -z80_dis.o: z80_config.h /usr/include/stdio.h /usr/include/sys/cdefs.h -z80_dis.o: /usr/include/sys/_null.h /usr/include/sys/_types.h -z80_dis.o: /usr/include/machine/_types.h /usr/include/string.h -z80_dis.o: /usr/include/strings.h /usr/include/stdarg.h z80.h z80_private.h diff --git a/src/gfx.c b/src/gfx.c index ab7768c..46abbb0 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -33,12 +33,10 @@ static const char ident[]="$Id$"; #include "gfx.h" #include "exit.h" #include "config.h" +#include "util.h" #include "font.h" -static const char ident_h[]=EZX81_GFX_H; -static const char ident_fh[]=EZX81_FONT_H; - /* ---------------------------------------- MACROS */ @@ -50,72 +48,45 @@ static const char ident_fh[]=EZX81_FONT_H; #define FALSE 0 #endif -#define LOCK do \ - { \ - if (SDL_MUSTLOCK(surface)) \ - if (SDL_LockSurface(surface)<0) \ - Exit("Failed to lock surface: %s\n", \ - SDL_GetError()); \ - } while(0) - -#define UNLOCK do \ - { \ - if (SDL_MUSTLOCK(surface)) \ - SDL_UnlockSurface(surface); \ - } while(0) - - /* ---------------------------------------- STATICS */ -static SDL_Surface *surface; +static SDL_Window *window; +static SDL_Renderer *renderer; +static SDL_Texture *texture; +static Uint32 *pixels; static Uint32 ticks; static Uint32 frame; static int scale; static void (*putpixel)(int x, int y, Uint32 col); +#define NO_BMPIX 10 -/* ---------------------------------------- PRIVATE FUNCTIONS -*/ - -/* Taken from SDL documentation -*/ -static void normal_putpixel(int x, int y, Uint32 pixel) +static struct { - int bpp; - Uint8 *p; - - bpp=surface->format->BytesPerPixel; - p=(Uint8 *)surface->pixels+y*surface->pitch+x*bpp; + Uint32 col; + int r,g,b; +} bmpix[NO_BMPIX]= +{ + {0, 0x00,0x00,0x00}, /* BLACK */ + {0, 0x00,0x00,0xff}, /* BLUE */ + {0, 0xff,0x00,0x00}, /* RED */ + {0, 0xff,0x00,0xff}, /* MAGENTA */ + {0, 0x00,0xff,0x00}, /* GREEN */ + {0, 0x00,0xff,0xff}, /* CYAN */ + {0, 0xff,0xff,0x00}, /* YELLOW */ + {0, 0xff,0xff,0xff}, /* WHITE */ + {0, 0x60,0x60,0x60}, /* GREY */ +}; - switch(bpp) - { - case 1: - *p=pixel; - break; - case 2: - *(Uint16 *)p=pixel; - break; - case 3: - if(SDL_BYTEORDER==SDL_BIG_ENDIAN) - { - p[0]=(pixel>>16)&0xff; - p[1]=(pixel>>8)&0xff; - p[2]=pixel&0xff; - } else - { - p[0]=pixel&0xff; - p[1]=(pixel>>8)&0xff; - p[2]=(pixel>>16)&0xff; - } - break; +/* ---------------------------------------- PRIVATE FUNCTIONS +*/ - case 4: - *(Uint32 *)p=pixel; - break; - } +static void normal_putpixel(int x, int y, Uint32 pixel) +{ + pixels[x + y * GFX_WIDTH] = pixel; } @@ -128,7 +99,7 @@ static void scale_putpixel(int x, int y, Uint32 pixel) for(sx=0;sxformat,r,g,b); + return 0xff << 24 | (Uint32)r << 16 | (Uint32)g << 8 | b; } void GFXClear(Uint32 col) { - SDL_FillRect(surface,NULL,col); + int f; + + for(f = 0; f < GFX_WIDTH * scale * GFX_HEIGHT * scale; f++) + { + pixels[f] = col; + } } @@ -210,7 +219,12 @@ void GFXStartFrame(void) void GFXEndFrame(int delay) { - SDL_UpdateRect(surface,0,0,0,0); + SDL_UpdateTexture(texture, NULL, + pixels, GFX_WIDTH * scale * sizeof(Uint32)); + + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, texture, NULL, NULL); + SDL_RenderPresent(renderer); if (delay) { @@ -224,16 +238,6 @@ void GFXEndFrame(int delay) } -void GFXKeyRepeat(int repeat) -{ - if (repeat) - SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, - SDL_DEFAULT_REPEAT_INTERVAL); - else - SDL_EnableKeyRepeat(0,0); -} - - SDL_Event *GFXGetKey(void) { static SDL_Event e; @@ -261,29 +265,7 @@ SDL_Event *GFXWaitKey(void) } -void GFXLock(void) -{ - LOCK; -} - - -void GFXUnlock(void) -{ - UNLOCK; -} - - void GFXPlot(int x, int y, Uint32 col) -{ - LOCK; - - putpixel(x,y,col); - - UNLOCK; -} - - -void GFXFastPlot(int x, int y, Uint32 col) { putpixel(x,y,col); } @@ -291,18 +273,13 @@ void GFXFastPlot(int x, int y, Uint32 col) void GFXRect(int x, int y, int w, int h, Uint32 col, int solid) { - LOCK; - if (solid) { - SDL_Rect r; - - r.x=x*scale; - r.y=y*scale; - r.w=w*scale; - r.h=h*scale; - - SDL_FillRect(surface,&r,col); + while(h--) + { + DoHLine(x,x+w-1,y,col); + y++; + } } else { @@ -311,24 +288,18 @@ void GFXRect(int x, int y, int w, int h, Uint32 col, int solid) DoVLine(x,y,y+h-1,col); DoVLine(x+w-1,y,y+h-1,col); } - - UNLOCK; } void GFXHLine(int x1, int x2, int y, Uint32 col) { - LOCK; DoHLine(x1,x2,y,col); - UNLOCK; } void GFXVLine(int x, int y1, int y2, Uint32 col) { - LOCK; DoVLine(x,y1,y2,col); - UNLOCK; } @@ -345,8 +316,6 @@ void GFXPrint(int x, int y, Uint32 col, const char *format, ...) p=buff; - LOCK; - while(*p) { for(sy=0;sy<8;sy++) @@ -364,8 +333,6 @@ void GFXPrint(int x, int y, Uint32 col, const char *format, ...) p++; x+=8; } - - UNLOCK; } @@ -383,8 +350,6 @@ void GFXPrintPaper(int x, int y, Uint32 col, Uint32 paper, p=buff; - LOCK; - while(*p) { for(sy=0;sy<8;sy++) @@ -404,8 +369,44 @@ void GFXPrintPaper(int x, int y, Uint32 col, Uint32 paper, p++; x+=8; } +} + + +void GFXBitmap(int x, int y, int w, int h, const unsigned char *data) +{ + int pix; + int px,py; + + pix=0; + px=0; + py=0; + + while(TRUE) + { + int i; + + i=*data++; + + if (i<0x80) + { + pix=i; + + BMPlot(x,y,&px,&py,w,h,pix); - UNLOCK; + if (py>=h) + break; + } + else + { + int f; + + for (f=0;f=h) + break; + } + } } diff --git a/src/gfx.h b/src/gfx.h index f700cb2..9c3d60b 100644 --- a/src/gfx.h +++ b/src/gfx.h @@ -97,27 +97,11 @@ SDL_Event *GFXGetKey(void); SDL_Event *GFXWaitKey(void); -/* Lock the screen for updates -*/ -void GFXLock(void); - - -/* Unlock the screen following updates -*/ -void GFXUnlock(void); - - /* Note that no bound checking (except for GFXPrint()) is done - it is the callers responsibility to plot onscreen. */ -/* Plot a point without locking. GFXLock() and GFXUnlock() MUST surround - calls to this -*/ -void GFXFastPlot(int x, int y, Uint32 col); - - /* Plot a point */ void GFXPlot(int x, int y, Uint32 col); diff --git a/src/gui.c b/src/gui.c index 19d6135..153081f 100644 --- a/src/gui.c +++ b/src/gui.c @@ -342,8 +342,6 @@ const char *GUIInputString(const char *prompt, const char *orig) strncat(buff,orig,40); len=strlen(buff); - SDL_EnableUNICODE(1); - while(!done) { GFXRect(0,y_pos,GFX_WIDTH,8,BLACK,TRUE); @@ -372,7 +370,7 @@ const char *GUIInputString(const char *prompt, const char *orig) break; default: - c=(unsigned char)e->key.keysym.unicode; + c=(unsigned char)e->key.keysym.sym; if (len<40 && isprint(c)) { @@ -383,8 +381,6 @@ const char *GUIInputString(const char *prompt, const char *orig) } } - SDL_EnableUNICODE(0); - return buff; } diff --git a/src/memmenu.c b/src/memmenu.c index e7909a9..609d8bc 100644 --- a/src/memmenu.c +++ b/src/memmenu.c @@ -1121,8 +1121,6 @@ int MemoryMenu(Z80 *z80) int quit=FALSE; int y; - GFXKeyRepeat(TRUE); - while(!done) { DisplayMenu(); @@ -1204,8 +1202,6 @@ int MemoryMenu(Z80 *z80) } } - GFXKeyRepeat(FALSE); - GFXClear(BLACK); return quit; } diff --git a/src/zx81.c b/src/zx81.c index 9fcc6e1..d6873b5 100644 --- a/src/zx81.c +++ b/src/zx81.c @@ -100,7 +100,7 @@ static Z80Byte matrix[8]; typedef struct { - SDLKey key; + SDL_Keycode key; int m1,b1,m2,b2; } MatrixMap; @@ -493,6 +493,11 @@ void ZX81KeyEvent(SDL_Event *e) { const MatrixMap *m; + if (e->key.repeat) + { + return; + } + m=keymap; while(m->key!=SDLK_UNKNOWN) -- cgit v1.2.3