Modularized joey.c to make adding new platforms easier and to clean up code sharing.

This commit is contained in:
Scott Duensing 2021-03-05 18:39:56 -06:00
parent f37e8d831f
commit b8643d14d3
7 changed files with 738 additions and 212 deletions

View file

@ -28,7 +28,9 @@ QMAKE_CFLAGS += \
$$JOEY_FLAGS $$JOEY_FLAGS
INCLUDEPATH += \ INCLUDEPATH += \
$$JOEY_INCLUDES $$JOEY_INCLUDES \
/home/scott/source/lzsa/src \
/home/scott/source/lzsa/src/libdivsufsort/include
HEADERS += \ HEADERS += \
$$JOEY_HEADERS $$JOEY_HEADERS
@ -38,4 +40,7 @@ SOURCES += \
LIBS += \ LIBS += \
$$JOEY_LIBS \ $$JOEY_LIBS \
$$SDL_IMAGE_LIBS $$SDL_IMAGE_LIBS \
-llz4 \
-L/home/scott/source/lzsa \
-llzsa

View file

@ -4,7 +4,9 @@
#include <limits.h> #include <limits.h>
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include <SDL2/SDL_image.h> #include <SDL2/SDL_image.h>
#include <lz4.h>
#include "lib.h"
#include "joey.h" #include "joey.h"
@ -24,6 +26,11 @@ void convertColor(char *filename, char *basename, bool showIt) {
if (image == NULL) return; if (image == NULL) return;
if (!image->format->palette) {
fprintf(stderr, "Not a palettized image.\n");
return;
}
colors = image->format->palette->ncolors; colors = image->format->palette->ncolors;
c = image->format->palette->colors; c = image->format->palette->colors;
@ -56,9 +63,57 @@ void convertColor(char *filename, char *basename, bool showIt) {
} }
} }
SDL_FreeSurface(image);
jlImgSave(img, basename); jlImgSave(img, basename);
SDL_FreeSurface(image); // Experimental LZ4 compression
const size_t srcSize = (sizeof(jlColorT) * 16) + (sizeof(jlPixelPairT) * 32000);
const int maxSize = LZ4_compressBound(srcSize);
char *compressedData = malloc((size_t)maxSize);
if (!compressedData) {
fprintf(stderr, "Unable to allocate space for compressed data.\n");
return;
}
const int compressedDataSize = LZ4_compress_default((char *)img->palette, compressedData, srcSize, maxSize);
if (compressedDataSize <= 0) {
fprintf(stderr, "Unable to compress data.\n");
return;
}
char name[2048];
FILE *out;
snprintf(name, 2048, "%s.imgz", basename);
out = fopen(name, "wb");
if (!out) {
fprintf(stderr, "Unable to save compressed file: %s\n", name);
return;
}
fwrite(img, 4, 1, out);
fwrite(compressedData, compressedDataSize, 1, out);
fclose(out);
// Experimental LZSA compression
const size_t srcSize2 = (sizeof(jlColorT) * 16) + (sizeof(jlPixelPairT) * 32000);
const int maxSize2 = lzsa_get_max_compressed_size_inmem(srcSize2);
unsigned char *compressedData2 = malloc((size_t)maxSize2);
if (!compressedData2) {
fprintf(stderr, "Unable to allocate space for compressed data.\n");
return;
}
const int compressedDataSize2 = lzsa_compress_inmem((unsigned char *)img->palette, compressedData2, srcSize2, maxSize2, LZSA_FLAG_FAVOR_RATIO, 3, 1);
if (compressedDataSize2 <= 0) {
fprintf(stderr, "Unable to compress data.\n");
return;
}
snprintf(name, 2048, "%s.imgz2", basename);
out = fopen(name, "wb");
if (!out) {
fprintf(stderr, "Unable to save compressed file: %s\n", name);
return;
}
fwrite(img, 4, 1, out);
fwrite(compressedData2, compressedDataSize2, 1, out);
fclose(out);
if (showIt) { if (showIt) {
jlImgDisplay(img); jlImgDisplay(img);

View file

@ -232,50 +232,6 @@ void jlPaletteSetFromImg(jlImgT *img) {
} }
void jlSoundFree(jlSoundT *sound) {
//***TODO***
}
bool jlSoundIsPlaying(jlSoundT *sound) {
//***TODO***
return false;
}
bool _jlSoundLoad(jlSoundT **sound, char *filename) {
//***TODO***
return false;
}
void jlSoundMidiContinue(void) {
//***TODO***
}
bool jlSoundMidiIsPlaying(void) {
//***TODO***
return false;
}
void jlSoundMidiPause(void) {
//***TODO***
}
void jlSoundMidiPlay(char *name) {
(void)name;
//***TODO***
}
void jlSoundMidiStop(void) {
//***TODO***
}
void jlSoundModContinue(void) { void jlSoundModContinue(void) {
NTPContinueMusic(); NTPContinueMusic();
} }
@ -311,21 +267,6 @@ void jlSoundModStop(void) {
} }
void jlSoundPlay(jlSoundT *sound) {
//***TODO***
}
void jlUtilIdle(void) {
// No need to pump the message loop on the IIgs
}
bool jlUtilMustExit(void) {
return false;
}
void jlUtilShutdown(void) { void jlUtilShutdown(void) {
// Clear the display. // Clear the display.
jlDrawColorSet(0); jlDrawColorSet(0);

View file

@ -244,100 +244,12 @@ void jlDrawBlit8x8a(jlSurfaceT source, jlStnT *stencil, jint16 sx, jint16 sy, ji
} }
//***FIX*** This no longer does what we want since blitting source addresses are now in pixels. Fix!
void jlDrawBlitMap(jint16 startX, jint16 startY, jint16 width, jint16 height, byte *mapData, juint16 stride, jlSurfaceT source) {
// startX = start tile for drawing - in pixels
// startY = start tile for drawing - in pixels
// width = tiles to draw horizontally - in tiles
// height = tiles to draw vertically - in tiles
// mapData = pointer to tile x/y pairs to draw
// stride = number of tile bytes to skip in the mapData for every horizontal line
// tiles = surface to fetch tile data from
jint16 x;
jint16 y;
byte tileX;
byte tileY;
juint16 offset = 0;
jint16 endX = width * 8 + startX;
jint16 endY = height * 8 + startY;
for (y=startY; y<endY; y+=8) {
for (x=startX; x<endX; x+=8) {
tileX = mapData[offset++];
tileY = mapData[offset++];
jlDrawBlit8x8(source, tileX, tileY, x, y);
}
offset += stride;
}
}
void jlDrawClear(void) { void jlDrawClear(void) {
jlPixelPairT *target = (jlPixelPairT *)_jlDrawTargetActual; jlPixelPairT *target = (jlPixelPairT *)_jlDrawTargetActual;
memset(target, _jlDrawColorNibbles, 32000); memset(target, _jlDrawColorNibbles, 32000);
} }
void jlDrawLine(jint16 x1, jint16 y1, jint16 x2, jint16 y2) {
jint16 x;
jint16 y;
jint16 dx;
jint16 dy;
jint16 incX;
jint16 incY;
jint16 balance;
if (x2 >= x1) {
dx = x2 - x1;
incX = 1;
} else {
dx = x1 - x2;
incX = -1;
}
if (y2 >= y1) {
dy = y2 - y1;
incY = 1;
} else {
dy = y1 - y2;
incY = -1;
}
x = x1;
y = y1;
if (dx >= dy) {
dy <<= 1;
balance = dy - dx;
dx <<= 1;
while (x != x2) {
jlDrawPixelSet(x, y);
if (balance >= 0) {
y += incY;
balance -= dx;
}
balance += dy;
x += incX;
}
jlDrawPixelSet(x, y);
} else {
dx <<= 1;
balance = dx - dy;
dy <<= 1;
while (y != y2) {
jlDrawPixelSet(x, y);
if (balance >= 0) {
x += incX;
balance -= dy;
}
balance += dx;
y += incY;
}
jlDrawPixelSet(x, y);
}
}
byte jlDrawPixelGet(jint16 x, jint16 y) { byte jlDrawPixelGet(jint16 x, jint16 y) {
jlPixelPairT *target = (jlPixelPairT *)_jlDrawTargetActual; jlPixelPairT *target = (jlPixelPairT *)_jlDrawTargetActual;
int p = x / 2 + y * 160; int p = x / 2 + y * 160;
@ -513,34 +425,6 @@ bool _jlSoundLoad(jlSoundT **sound, char *filename) {
} }
void jlSoundMidiContinue(void) {
//***TODO***
}
bool jlSoundMidiIsPlaying(void) {
//***TODO***
return false;
}
void jlSoundMidiPause(void) {
//***TODO***
}
void jlSoundMidiPlay(char *name) {
(void)name;
//***TODO***
}
void jlSoundMidiStop(void) {
//***TODO***
}
void jlSoundModContinue(void) { void jlSoundModContinue(void) {
Mix_ResumeMusic(); Mix_ResumeMusic();
} }
@ -677,17 +561,6 @@ bool jlUtilMustExit(void) {
} }
void jlUtilNibbleSwap(byte *mem, jint16 count, byte old, byte new) {
int x;
jlPixelPairT *b;
for (x=0; x<count; x++) {
b = (jlPixelPairT *)&mem[x];
if (b->l == old) b->l = new;
if (b->r == old) b->r = new;
}
}
void jlUtilShutdown(void) { void jlUtilShutdown(void) {
int x; int x;

View file

@ -179,27 +179,94 @@ void *_jlRealloc(void *pointer, size_t size) {
#endif #endif
#ifndef JL_HAS_DISPLAYBORDER
void jlDisplayBorder(jlBorderColorsE color) { void jlDisplayBorder(jlBorderColorsE color) {
_jlBorderColor = (byte)color; _jlBorderColor = (byte)color;
} }
#endif
#ifndef JL_HAS_DISPLAYPRESENT
void jlDisplayPresent(void) {
}
#endif
#ifndef JL_HAS_DRAWBLIT8X8
void jlDrawBlit8x8(jlSurfaceT source, jint16 sx, jint16 sy, jint16 tx, jint16 ty) {
(void)source;
(void)sx;
(void)sy;
(void)tx;
(void)ty;
}
#endif
#ifndef JL_HAS_DRAWBLIT8X8A
void jlDrawBlit8x8a(jlSurfaceT source, jlStnT *stencil, jint16 sx, jint16 sy, jint16 tx, jint16 ty) {
(void)source;
(void)stencil;
(void)sx;
(void)sy;
(void)tx;
(void)ty;
}
#endif
#ifndef JL_HAS_DRAWBLITMAP
//***FIX*** This no longer does what we want since blitting source addresses are now in pixels. Fix!
void jlDrawBlitMap(jint16 startX, jint16 startY, jint16 width, jint16 height, byte *mapData, juint16 stride, jlSurfaceT source) {
// startX = start tile for drawing - in pixels
// startY = start tile for drawing - in pixels
// width = tiles to draw horizontally - in tiles
// height = tiles to draw vertically - in tiles
// mapData = pointer to tile x/y pairs to draw
// stride = number of tile bytes to skip in the mapData for every horizontal line
// tiles = surface to fetch tile data from
jint16 x;
jint16 y;
byte tileX;
byte tileY;
juint16 offset = 0;
jint16 endX = width * 8 + startX;
jint16 endY = height * 8 + startY;
for (y=startY; y<endY; y+=8) {
for (x=startX; x<endX; x+=8) {
tileX = mapData[offset++];
tileY = mapData[offset++];
jlDrawBlit8x8(source, tileX, tileY, x, y);
}
offset += stride;
}
}
#endif
#ifndef JL_HAS_DRAWBOX
void jlDrawBox(jint16 x1, jint16 y1, jint16 x2, jint16 y2) { void jlDrawBox(jint16 x1, jint16 y1, jint16 x2, jint16 y2) {
jlDrawLine(x1, y1, x2, y1); jlDrawLine(x1, y1, x2, y1);
jlDrawLine(x2, y1, x2, y2); jlDrawLine(x2, y1, x2, y2);
jlDrawLine(x2, y2, x1, y2); jlDrawLine(x2, y2, x1, y2);
jlDrawLine(x1, y2, x1, y1); jlDrawLine(x1, y2, x1, y1);
} }
#endif
#ifndef JL_HAS_DRAWBOXFILLED
void jlDrawBoxFilled(jint16 x1, jint16 y1, jint16 x2, jint16 y2) { void jlDrawBoxFilled(jint16 x1, jint16 y1, jint16 x2, jint16 y2) {
jint16 y; jint16 y;
for (y=y1; y<=y2; y++) { for (y=y1; y<=y2; y++) {
jlDrawLine(x1, y, x2, y); jlDrawLine(x1, y, x2, y);
} }
} }
#endif
#ifndef JL_HAS_DRAWCIRCLE
void _jlDrawCircleClipped(jint16 x0, jint16 y0, jint16 radius) { void _jlDrawCircleClipped(jint16 x0, jint16 y0, jint16 radius) {
jint16 x = radius-1; jint16 x = radius-1;
jint16 y = 0; jint16 y = 0;
@ -267,19 +334,32 @@ void jlDrawCircle(jint16 x0, jint16 y0, jint16 radius) {
} }
} }
} }
#endif
#ifndef JL_HAS_DRAWCLEAR
void jlDrawClear(void) {
}
#endif
#ifndef JL_HAS_DRAWCOLORGET
byte jlDrawColorGet(void) { byte jlDrawColorGet(void) {
return _jlDrawColor; return _jlDrawColor;
} }
#endif
#ifndef JL_HAS_DRAWCOLORSET
void jlDrawColorSet(byte index) { void jlDrawColorSet(byte index) {
_jlDrawColor = index; _jlDrawColor = index;
_jlDrawColorNibbles = (byte)((index << 4) + index); _jlDrawColorNibbles = (byte)((index << 4) + index);
} }
#endif
#ifndef JL_HAS_DRAWELLIPSE
// http://members.chello.at/~easyfilter/bresenham.html // http://members.chello.at/~easyfilter/bresenham.html
void jlDrawEllipse(jint16 x0, jint16 y0, jint16 x1, jint16 y1) { void jlDrawEllipse(jint16 x0, jint16 y0, jint16 x1, jint16 y1) {
jint16 a = (jint16)abs(x1-x0), b = (jint16)abs(y1-y0), b1 = b&1; /* values of diameter */ jint16 a = (jint16)abs(x1-x0), b = (jint16)abs(y1-y0), b1 = b&1; /* values of diameter */
@ -308,8 +388,10 @@ void jlDrawEllipse(jint16 x0, jint16 y0, jint16 x1, jint16 y1) {
jlDrawPixelSet(x1+1, y1--); jlDrawPixelSet(x1+1, y1--);
} }
} }
#endif
#if !defined(JL_HAS_DRAWFILL) && !defined(JL_HASDRAWFILLTO)
_jlScanDataT *_jlDrawFillNewSegment(jint16 startX, jint16 endX, jint16 y, signed char dir, bool scanLeft, bool scanRight) { _jlScanDataT *_jlDrawFillNewSegment(jint16 startX, jint16 endX, jint16 y, signed char dir, bool scanLeft, bool scanRight) {
_jlScanDataT *s = (_jlScanDataT *)jlMalloc(sizeof(_jlScanDataT)); _jlScanDataT *s = (_jlScanDataT *)jlMalloc(sizeof(_jlScanDataT));
s->StartX = startX; s->StartX = startX;
@ -392,20 +474,136 @@ void _jlDrawFill(jint16 x, jint16 y, bool how) {
jlFree(r); jlFree(r);
} }
} }
#endif
#ifndef JL_HAS_DRAWFILL
void jlDrawFill(jint16 x, jint16 y) { void jlDrawFill(jint16 x, jint16 y) {
_jlDrawFillColor = jlDrawPixelGet(x, y); _jlDrawFillColor = jlDrawPixelGet(x, y);
_jlDrawFill(x, y, true); _jlDrawFill(x, y, true);
} }
#endif
#ifndef JL_HAS_DRAWFILLTO
void jlDrawFillTo(jint16 x, jint16 y, byte color) { void jlDrawFillTo(jint16 x, jint16 y, byte color) {
_jlDrawFillColor = color; _jlDrawFillColor = color;
_jlDrawFill(x, y, false); _jlDrawFill(x, y, false);
} }
#endif
#ifndef JL_HAS_DRAWLINE
void jlDrawLine(jint16 x1, jint16 y1, jint16 x2, jint16 y2) {
jint16 x;
jint16 y;
jint16 dx;
jint16 dy;
jint16 incX;
jint16 incY;
jint16 balance;
if (x2 >= x1) {
dx = x2 - x1;
incX = 1;
} else {
dx = x1 - x2;
incX = -1;
}
if (y2 >= y1) {
dy = y2 - y1;
incY = 1;
} else {
dy = y1 - y2;
incY = -1;
}
x = x1;
y = y1;
if (dx >= dy) {
dy <<= 1;
balance = dy - dx;
dx <<= 1;
while (x != x2) {
jlDrawPixelSet(x, y);
if (balance >= 0) {
y += incY;
balance -= dx;
}
balance += dy;
x += incX;
}
jlDrawPixelSet(x, y);
} else {
dx <<= 1;
balance = dx - dy;
dy <<= 1;
while (y != y2) {
jlDrawPixelSet(x, y);
if (balance >= 0) {
x += incX;
balance -= dy;
}
balance += dx;
y += incY;
}
jlDrawPixelSet(x, y);
}
}
#endif
#ifndef JL_HAS_DRAWPIXELGIT
byte jlDrawPixelGet(jint16 x, jint16 y) {
(void)x;
(void)y;
return 0;
}
#endif
#ifndef JL_HAS_DRAWPIXELSET
void jlDrawPixelSet(jint16 x, jint16 y) {
(void)x;
(void)y;
}
#endif
#ifndef JL_HAS_DRAWSURFACEGET
jlSurfaceT jlDrawSurfaceGet(void) {
return NULL;
}
#endif
#ifndef JL_HAS_DRAWSURFACESET
void jlDrawSurfaceSet(jlSurfaceT target) {
(void)target;
}
#endif
#ifndef JL_HAS_GETGAMEAXIS
jint16 jlGameGetAxis(byte which) {
(void)which;
return 0;
}
#endif
#ifndef JL_HAS_GETGAMEBUTTON
bool jlGameGetButton(byte which) {
(void)which;
return false;
}
#endif
#ifndef JL_HAS_IMGCOPY
bool _jlImgCopy(jlImgT *source, jlImgT **target) { bool _jlImgCopy(jlImgT *source, jlImgT **target) {
jlImgT *t = NULL; jlImgT *t = NULL;
// Are we copying into a new image? // Are we copying into a new image?
@ -420,15 +618,34 @@ bool _jlImgCopy(jlImgT *source, jlImgT **target) {
memcpy(*target, source, sizeof(jlImgT)); memcpy(*target, source, sizeof(jlImgT));
return true; return true;
} }
#endif
#ifndef JL_HAS_IMGCREATE
bool _jlImgCreate(jlImgT **img) {
(void)img;
return false;
}
#endif
#ifndef JL_HAS_IMGDISPLAY
void jlImgDisplay(jlImgT *img) {
(void)img;
}
#endif
#ifndef JL_HAS_IMGFREE
void jlImgFree(jlImgT *img) { void jlImgFree(jlImgT *img) {
if (img != NULL) { if (img != NULL) {
jlFree(img); jlFree(img);
} }
} }
#endif
#ifndef JL_HAS_IMGLOAD
bool _jlImgLoad(jlImgT **img, char *filename) { bool _jlImgLoad(jlImgT **img, char *filename) {
bool result = false; bool result = false;
jlImgT *s = NULL; jlImgT *s = NULL;
@ -456,8 +673,10 @@ bool _jlImgLoad(jlImgT **img, char *filename) {
} }
return result; return result;
} }
#endif
#ifndef JL_HAS_IMGSAVE
bool jlImgSave(jlImgT *img, char *filename) { bool jlImgSave(jlImgT *img, char *filename) {
bool result = false; bool result = false;
FILE *f; FILE *f;
@ -470,16 +689,34 @@ bool jlImgSave(jlImgT *img, char *filename) {
} }
return result; return result;
} }
#endif
#ifndef JL_HAS_KEYPRESSED
bool jlKeyPressed(void) {
return false;
}
#endif
#ifndef JL_HAS_KEYREAD
char jlKeyRead(void) {
return 0;
}
#endif
#ifndef JL_HAS_KEYWAITFORANY
void jlKeyWaitForAny(void) { void jlKeyWaitForAny(void) {
//***TODO*** I don't think this does what we think it does. //***TODO*** I don't think this does what we think it does.
while (!jlKeyPressed() && !jlUtilMustExit()) ; while (!jlKeyPressed() && !jlUtilMustExit()) ;
jlKeyRead(); jlKeyRead();
while (jlKeyPressed() && !jlUtilMustExit()) ; while (jlKeyPressed() && !jlUtilMustExit()) ;
} }
#endif
#ifndef JL_HAS_PALETTEDEFAULT
void jlPaletteDefault(void) { void jlPaletteDefault(void) {
byte i; byte i;
// Set palette. // Set palette.
@ -503,8 +740,138 @@ void jlPaletteDefault(void) {
jlPaletteSet(i, _jlDefaultPalette[i].r, _jlDefaultPalette[i].g, _jlDefaultPalette[i].b); jlPaletteSet(i, _jlDefaultPalette[i].r, _jlDefaultPalette[i].g, _jlDefaultPalette[i].b);
} }
} }
#endif
#ifndef JL_HAS_PALETTESET
void jlPaletteSet(byte index, byte r, byte g, byte b) {
(void)index;
(void)r;
(void)g;
(void)b;
//***TODO*** Really need a matching "get"
}
#endif
#ifndef JL_HAS_PALETTESETFROMIMG
void jlPaletteSetFromImg(jlImgT *img) {
(void)img;
}
#endif
#ifndef JL_HAS_SOUNDFREE
void jlSoundFree(jlSoundT *sound) {
(void)sound;
}
#endif
#ifndef JL_HAS_SOUNDISPLAYING
bool jlSoundIsPlaying(jlSoundT *sound) {
(void)sound;
return false;
}
#endif
#ifndef JL_HAS_SOUNDLOAD
bool _jlSoundLoad(jlSoundT **sound, char *filename) {
(void)sound;
(void)filename;
return false;
}
#endif
#ifndef JL_HAS_SOUNDMIDICONTINUE
void jlSoundMidiContinue(void) {
}
#endif
#ifndef JL_HAS_SOUNDMIDIISPLAYING
bool jlSoundMidiIsPlaying(void) {
return false;
}
#endif
#ifndef JL_HAS_SOUNDMIDIPAUSE
void jlSoundMidiPause(void) {
}
#endif
#ifndef JL_HAS_SOUNDMIDIPLAY
void jlSoundMidiPlay(char *name) {
(void)name;
}
#endif
#ifndef JL_HAS_SOUNDMIDISTOP
void jlSoundMidiStop(void) {
}
#endif
#ifndef JL_HAS_SOUNDMODCONTINUE
void jlSoundModContinue(void) {
}
#endif
#ifndef JL_HAS_SOUNDMODISPLAYING
bool jlSoundModIsPlaying(void) {
return false;
}
#endif
#ifndef JL_HAS_SOUNDMODPAUSE
void jlSoundModPause(void) {
}
#endif
#ifndef JL_HAS_SOUNDMODPLAY
void jlSoundModPlay(char *name) {
(void)name;
}
#endif
#ifndef JL_HAS_SOUNDMODSTOP
void jlSoundModStop(void) {
}
#endif
#ifndef JL_HAS_SOUNDPLAY
void jlSoundPlay(jlSoundT *sound) {
(void)sound;
}
#endif
#ifndef JL_HAS_STNFREE
void jlStnFree(jlStnT *stn) {
if (stn != NULL) {
jlFree(stn);
}
}
#endif
#ifndef JL_HAS_STNLOAD
bool _jlStnLoad(jlStnT **stn, char *filename) { bool _jlStnLoad(jlStnT **stn, char *filename) {
bool result = false; bool result = false;
jlStnT *s = NULL; jlStnT *s = NULL;
@ -532,14 +899,10 @@ bool _jlStnLoad(jlStnT **stn, char *filename) {
} }
return result; return result;
} }
#endif
void jlStnFree(jlStnT *stn) { #ifndef JL_HAS_UTILDIE
if (stn != NULL) {
jlFree(stn);
}
}
__attribute__((__format__ (__printf__, 1, 0))) __attribute__((__format__ (__printf__, 1, 0)))
void jlUtilDie(const char *why, ...) { void jlUtilDie(const char *why, ...) {
#ifdef JOEY_DEBUG #ifdef JOEY_DEBUG
@ -575,8 +938,105 @@ void jlUtilDie(const char *why, ...) {
#endif #endif
exit(0); exit(0);
} }
#endif
#ifndef JL_HAS_UTILIDLE
void jlUtilIdle(void) {
}
#endif
#ifndef JL_HAS_UTILINPUTREAD
bool jlUtilInputRead(byte *key) {
static bool debounceController = false;
*key = 0;
// Keyboard
if (jlKeyPressed()) {
while (jlKeyPressed()) {
*key = jlKeyRead();
}
switch (*key) {
// Up
case 'I':
case 'i':
case 'W':
case 'w':
case '8':
*key = JOEY_INPUT_UP;
break;
// Left
case 'J':
case 'j':
case 'A':
case 'a':
case '4':
*key = JOEY_INPUT_LEFT;
break;
// Right
case 'K':
case 'k':
case 'D':
case 'd':
case '6':
*key = JOEY_INPUT_RIGHT;
break;
// Down
case 'M':
case 'm':
case 'S':
case 's':
case '2':
*key = JOEY_INPUT_DOWN;
break;
// Primary
case 13:
*key = JOEY_INPUT_PRIMARY;
break;
// Secondary
case 27:
*key = JOEY_INPUT_SECONDARY;
break;
}
return true;
}
// Joystick
if (jlGameGetAxis(0) < -50) *key = JOEY_INPUT_LEFT;
if (jlGameGetAxis(0) > 50) *key = JOEY_INPUT_RIGHT;
if (jlGameGetAxis(1) < -50) *key = JOEY_INPUT_UP;
if (jlGameGetAxis(1) > 50) *key = JOEY_INPUT_DOWN;
if (jlGameGetButton(0)) *key = JOEY_INPUT_PRIMARY;
if (jlGameGetButton(1)) *key = JOEY_INPUT_SECONDARY;
// Debounce Joystick Input
if (debounceController) {
*key = 0;
return false;
} else {
if (*key != 0) {
debounceController = true;
return true;
}
}
debounceController = false;
return false;
}
#endif
#ifndef JL_HAS_UTILMAKEPATHNAME
char *jlUtilMakePathname(char *filename, char *extension) { char *jlUtilMakePathname(char *filename, char *extension) {
char temp[2]; char temp[2];
@ -594,24 +1054,60 @@ char *jlUtilMakePathname(char *filename, char *extension) {
return _jlTempString; return _jlTempString;
} }
#endif
#ifndef JL_HAS_UTILMUSTEXIT
bool jlUtilMustExit(void) {
return false;
}
#endif
#ifndef JL_HAS_UTILNIBBLESWAP
void jlUtilNibbleSwap(byte *mem, jint16 count, byte old, byte new) {
int x;
jlPixelPairT *b;
for (x=0; x<count; x++) {
b = (jlPixelPairT *)&mem[x];
if (b->l == old) b->l = new;
if (b->r == old) b->r = new;
}
}
#endif
#ifndef JL_HAS_UTILRANDOM
juint16 jlUtilRandom(void) { juint16 jlUtilRandom(void) {
_jlSeed = _jlSeed * 1103515245 + 12345; _jlSeed = _jlSeed * 1103515245 + 12345;
return _jlSeed / 65536; return _jlSeed / 65536;
} }
#endif
#ifndef JL_HAS_UTILRANDOMSEEDGET
juint32 jlUtilRandomSeedGet(void) { juint32 jlUtilRandomSeedGet(void) {
return _jlSeed; return _jlSeed;
} }
#endif
#ifndef JL_HAS_UTILRANDOMSEEDSET
void jlUtilRandomSeedSet(juint32 seed) { void jlUtilRandomSeedSet(juint32 seed) {
_jlSeed = seed; _jlSeed = seed;
} }
#endif
#ifndef JL_HAS_UTILSHUTDOWN
__attribute__((noreturn))
void jlUtilShutdown(void) {
exit(0);
}
#endif
#ifndef JL_HAS_UTILSLEEP
void jlUtilSleep(juint16 sixtieths) { void jlUtilSleep(juint16 sixtieths) {
juint16 t = jlUtilTimer(); juint16 t = jlUtilTimer();
juint16 d = 0; juint16 d = 0;
@ -620,8 +1116,10 @@ void jlUtilSleep(juint16 sixtieths) {
d = jlUtilTimeSpan(t, jlUtilTimer()); d = jlUtilTimeSpan(t, jlUtilTimer());
} }
} }
#endif
#ifndef JL_HAS_UTILSTACKPOP
void *_jlUtilStackPop(jlStackT **stack) { void *_jlUtilStackPop(jlStackT **stack) {
void *d = NULL; void *d = NULL;
jlStackT *s; jlStackT *s;
@ -633,8 +1131,10 @@ void *_jlUtilStackPop(jlStackT **stack) {
} }
return d; return d;
} }
#endif
#ifndef JL_HAS_UTILSTACKPUSH
void _jlUtilStackPush(jlStackT **stack, void *data) { void _jlUtilStackPush(jlStackT **stack, void *data) {
jlStackT *s = NULL; jlStackT *s = NULL;
s = (jlStackT *)jlMalloc(sizeof(jlStackT)); s = (jlStackT *)jlMalloc(sizeof(jlStackT));
@ -642,8 +1142,24 @@ void _jlUtilStackPush(jlStackT **stack, void *data) {
s->data = data; s->data = data;
*stack = s; *stack = s;
} }
#endif
#ifndef JL_HAS_UTILSTARTUP
void jlUtilStartup(char *appTitle) {
(void)appTitle;
}
#endif
#ifndef JL_HAS_UTILTIMER
juint16 jlUtilTimer(void) {
return 0;
}
#endif
#ifndef JL_HAS_UTILTIMESPAN
juint16 jlUtilTimeSpan(juint16 past, juint16 current) { juint16 jlUtilTimeSpan(juint16 past, juint16 current) {
jint32 temp = current - past; jint32 temp = current - past;
if (temp < 0) { if (temp < 0) {
@ -651,8 +1167,10 @@ juint16 jlUtilTimeSpan(juint16 past, juint16 current) {
} }
return (juint16)temp; return (juint16)temp;
} }
#endif
#ifndef JL_HAS_VECDISPLAY
void jlVecDisplay(jlVecT *vec, jint16 ox, jint16 oy) { void jlVecDisplay(jlVecT *vec, jint16 ox, jint16 oy) {
jint16 command; jint16 command;
jint16 count; jint16 count;
@ -767,16 +1285,20 @@ void jlVecDisplay(jlVecT *vec, jint16 ox, jint16 oy) {
} // switch } // switch
} // while } // while
} }
#endif
#ifndef JL_HAS_VECFREE
void jlVecFree(jlVecT *vec) { void jlVecFree(jlVecT *vec) {
if (vec != NULL) { if (vec != NULL) {
jlFree(vec->data); jlFree(vec->data);
jlFree(vec); jlFree(vec);
} }
} }
#endif
#ifndef JL_HAS_VECLOAD
bool _jlVecLoad(jlVecT **vec, char *filename) { bool _jlVecLoad(jlVecT **vec, char *filename) {
bool result = false; bool result = false;
jlVecT *v = NULL; jlVecT *v = NULL;
@ -818,3 +1340,4 @@ bool _jlVecLoad(jlVecT **vec, char *filename) {
} }
return result; return result;
} }
#endif

View file

@ -51,6 +51,14 @@ typedef unsigned char byte;
#define JOEY_DISPLAY (byte *)NULL #define JOEY_DISPLAY (byte *)NULL
#define JOEY_INPUT_NONE 0
#define JOEY_INPUT_UP 1
#define JOEY_INPUT_DOWN 2
#define JOEY_INPUT_LEFT 3
#define JOEY_INPUT_RIGHT 4
#define JOEY_INPUT_PRIMARY 5
#define JOEY_INPUT_SECONDARY 6
// Determine platform and settings // Determine platform and settings
#ifdef __linux__ #ifdef __linux__
@ -67,6 +75,37 @@ typedef unsigned short juint16;
typedef int jint32; typedef int jint32;
typedef unsigned int juint32; typedef unsigned int juint32;
#define JL_HAS_DISPLAYPRESENT
#define JL_HAS_DRAWBLIT8X8
#define JL_HAS_DRAWBLIT8X8A
#define JL_HAS_DRAWCLEAR
#define JL_HAS_DRAWPIXELGET
#define JL_HAS_DRAWPIXELSET
#define JL_HAS_DRAWSURFACEGET
#define JL_HAS_DRAWSURFACESET
#define JL_HAS_GAMEGETAXIS
#define JL_HAS_GAMEGETBUTTON
#define JL_HAS_IMGCREATE
#define JL_HAS_IMGDISPLAY
#define JL_HAS_KEYPRESSED
#define JL_HAS_KEYREAD
#define JL_HAS_PALETTESET
#define JL_HAS_PALETTESETFROMIMG
#define JL_HAS_SOUNDFREE
#define JL_HAS_SOUNDISPLAYING
#define JL_HAS_SOUNDLOAD
#define JL_HAS_SOUNDMODCONTINUE
#define JL_HAS_SOUNDMODISPLAYING
#define JL_HAS_SOUNDMODPAUSE
#define JL_HAS_SOUNDMODPLAY
#define JL_HAS_SOUNDMODSTOP
#define JL_HAS_SOUNDPLAY
#define JL_HAS_UTILIDLE
#define JL_HAS_UTILMUSTEXIT
#define JL_HAS_UTILSHUTDOWN
#define JL_HAS_UTILSTARTUP
#define JL_HAS_UTILTIMER
#elif _WIN32 #elif _WIN32
#define JOEY_WINDOWS #define JOEY_WINDOWS
@ -78,6 +117,37 @@ typedef unsigned short juint16;
typedef int jint32; typedef int jint32;
typedef unsigned int juint32; typedef unsigned int juint32;
#define JL_HAS_DISPLAYPRESENT
#define JL_HAS_DRAWBLIT8X8
#define JL_HAS_DRAWBLIT8X8A
#define JL_HAS_DRAWCLEAR
#define JL_HAS_DRAWPIXELGET
#define JL_HAS_DRAWPIXELSET
#define JL_HAS_DRAWSURFACEGET
#define JL_HAS_DRAWSURFACESET
#define JL_HAS_GAMEGETAXIS
#define JL_HAS_GAMEGETBUTTON
#define JL_HAS_IMGCREATE
#define JL_HAS_IMGDISPLAY
#define JL_HAS_KEYPRESSED
#define JL_HAS_KEYREAD
#define JL_HAS_PALETTESET
#define JL_HAS_PALETTESETFROMIMG
#define JL_HAS_SOUNDFREE
#define JL_HAS_SOUNDISPLAYING
#define JL_HAS_SOUNDLOAD
#define JL_HAS_SOUNDMODCONTINUE
#define JL_HAS_SOUNDMODISPLAYING
#define JL_HAS_SOUNDMODPAUSE
#define JL_HAS_SOUNDMODPLAY
#define JL_HAS_SOUNDMODSTOP
#define JL_HAS_SOUNDPLAY
#define JL_HAS_UTILIDLE
#define JL_HAS_UTILMUSTEXIT
#define JL_HAS_UTILSHUTDOWN
#define JL_HAS_UTILSTARTUP
#define JL_HAS_UTILTIMER
#elif __APPLE__ #elif __APPLE__
#define JOEY_MACOS #define JOEY_MACOS
@ -89,6 +159,37 @@ typedef unsigned short juint16;
typedef int jint32; typedef int jint32;
typedef unsigned int juint32; typedef unsigned int juint32;
#define JL_HAS_DISPLAYPRESENT
#define JL_HAS_DRAWBLIT8X8
#define JL_HAS_DRAWBLIT8X8A
#define JL_HAS_DRAWCLEAR
#define JL_HAS_DRAWPIXELGET
#define JL_HAS_DRAWPIXELSET
#define JL_HAS_DRAWSURFACEGET
#define JL_HAS_DRAWSURFACESET
#define JL_HAS_GAMEGETAXIS
#define JL_HAS_GAMEGETBUTTON
#define JL_HAS_IMGCREATE
#define JL_HAS_IMGDISPLAY
#define JL_HAS_KEYPRESSED
#define JL_HAS_KEYREAD
#define JL_HAS_PALETTESET
#define JL_HAS_PALETTESETFROMIMG
#define JL_HAS_SOUNDFREE
#define JL_HAS_SOUNDISPLAYING
#define JL_HAS_SOUNDLOAD
#define JL_HAS_SOUNDMODCONTINUE
#define JL_HAS_SOUNDMODISPLAYING
#define JL_HAS_SOUNDMODPAUSE
#define JL_HAS_SOUNDMODPLAY
#define JL_HAS_SOUNDMODSTOP
#define JL_HAS_SOUNDPLAY
#define JL_HAS_UTILIDLE
#define JL_HAS_UTILMUSTEXIT
#define JL_HAS_UTILSHUTDOWN
#define JL_HAS_UTILSTARTUP
#define JL_HAS_UTILTIMER
#elif __ORCAC__ #elif __ORCAC__
#define JOEY_IIGS #define JOEY_IIGS
@ -107,6 +208,35 @@ typedef unsigned long juint32;
#pragma lint -1 #pragma lint -1
#pragma debug 0 #pragma debug 0
#define JL_HAS_DISPLAYBORDER
#define JL_HAS_DISPLAYPRESENT
#define JL_HAS_DRAWBLIT8X8
#define JL_HAS_DRAWBLIT8X8A
#define JL_HAS_DRAWBLITMAP
#define JL_HAS_DRAWPIXELGET
#define JL_HAS_DRAWPIXELSET
#define JL_HAS_DRAWLINE
#define JL_HAS_DRAWCLEAR
#define JL_HAS_DRAWSURFACEGET
#define JL_HAS_DRAWSURFACESET
#define JL_HAS_GAMEGETAXIS
#define JL_HAS_GAMEGETBUTTON
#define JL_HAS_IMGCREATE
#define JL_HAS_IMGDISPLAY
#define JL_HAS_KEYPRESSED
#define JL_HAS_KEYREAD
#define JL_HAS_PALETTESET
#define JL_HAS_PALETTESETFROMIMG
#define JL_HAS_SOUNDMODCONTINUE
#define JL_HAS_SOUNDMODISPLAYING
#define JL_HAS_SOUNDMODPAUSE
#define JL_HAS_SOUNDMODPLAY
#define JL_HAS_SOUNDMODSTOP
#define JL_HAS_UTILNIBBLESWAP
#define JL_HAS_UTILSHUTDOWN
#define JL_HAS_UTILSTARTUP
#define JL_HAS_UTILTIMER
#elif AMIGA #elif AMIGA
#define JOEY_AMIGA #define JOEY_AMIGA
@ -302,6 +432,7 @@ bool _jlStnLoad(jlStnT **stn, char *filename);
#define jlUtilByteSwap(twoBytes) ((juint16)((twoBytes) & 0xff) >> 8) | (juint16)((twoBytes) << 8) #define jlUtilByteSwap(twoBytes) ((juint16)((twoBytes) & 0xff) >> 8) | (juint16)((twoBytes) << 8)
void jlUtilDie(const char *why, ...) __attribute__((noreturn)); void jlUtilDie(const char *why, ...) __attribute__((noreturn));
void jlUtilIdle(void); void jlUtilIdle(void);
bool jlUtilInputRead(byte *key);
#define jlUtilIsOdd(x) (((x & 1) == 1) ? true : false) #define jlUtilIsOdd(x) (((x & 1) == 1) ? true : false)
char *jlUtilMakePathname(char *filename, char *extension); char *jlUtilMakePathname(char *filename, char *extension);
bool jlUtilMustExit(void); bool jlUtilMustExit(void);

View file

@ -319,13 +319,14 @@ void musicTest(void) {
void showStencil(void) { void showStencil(void) {
jlStnT *stencil = NULL; jlStnT *stencil = NULL;
jint16 y; juint16 y;
jint16 x; juint16 x;
juint16 temp;
jint16 count; jint16 count;
juint16 index; jint16 index;
byte bit; byte bit;
if (!jlStnLoad(stencil, "font")) jlUtilDie("Unable to load font.stn!"); if (!jlStnLoad(stencil, "biff")) jlUtilDie("Unable to load biff.stn!");
jlDrawColorSet(0); jlDrawColorSet(0);
jlDrawClear(); jlDrawClear();
@ -354,12 +355,12 @@ void showStencil(void) {
jlDrawClear(); jlDrawClear();
jlDrawColorSet(15); jlDrawColorSet(15);
// Draw stencil by pixel location - this fails on the IIgs // Draw stencil by pixel location
for (y=0; y<200; y++) { for (y=0; y<200; y++) {
for (x=0; x<320; x++) { for (x=0; x<320; x++) {
index = (y * 320 + x); temp = (y * 320 + x);
count = 7 - (index % 8); count = 7 - (temp % 8);
index /= 8; index = temp / 8;
bit = stencil->pixels[index]; bit = stencil->pixels[index];
if (bit & (1 << count)) { if (bit & (1 << count)) {
jlDrawPixelSet(x, y); jlDrawPixelSet(x, y);
@ -382,8 +383,8 @@ void stencilTest(void) {
jint16 j; jint16 j;
if (!jlImgLoad(kangaI, "kanga")) jlUtilDie("Unable to load kanga.img!"); if (!jlImgLoad(kangaI, "kanga")) jlUtilDie("Unable to load kanga.img!");
if (!jlImgLoad(biffI, "biff")) jlUtilDie("Unable to load biff.img!"); if (!jlImgLoad(biffI, "biff")) jlUtilDie("Unable to load biff.img!");
if (!jlStnLoad(biffS, "biff")) jlUtilDie("Unable to load biff.stn!"); if (!jlStnLoad(biffS, "biff")) jlUtilDie("Unable to load biff.stn!");
jlImgDisplay(kangaI); jlImgDisplay(kangaI);
@ -391,12 +392,9 @@ void stencilTest(void) {
while (!jlKeyPressed()) { while (!jlKeyPressed()) {
// Draw Biff & grab background // Draw Biff & grab background
for (x=0; x<319-32; x++) { for (x=0; x<319-32; x+=2) {
for (i=0; i<3; i++) { for (i=0; i<3; i++) {
for (j=0; j<4; j++) { for (j=0; j<4; j++) {
jlDrawSurfaceSet(jlImgSurfaceGet(biffI));
jlDrawBlit8x8(JOEY_DISPLAY, x + (j * 8), y + (i * 8), j * 8 + 32, i * 8 + 32);
jlDrawSurfaceSet(JOEY_DISPLAY);
jlDrawBlit8x8a(jlImgSurfaceGet(biffI), biffS, j * 8, i * 8, x + (j * 8), y + (i * 8)); jlDrawBlit8x8a(jlImgSurfaceGet(biffI), biffS, j * 8, i * 8, x + (j * 8), y + (i * 8));
} }
} }
@ -404,7 +402,7 @@ void stencilTest(void) {
// Erase Biff // Erase Biff
for (i=0; i<3; i++) { for (i=0; i<3; i++) {
for (j=0; j<4; j++) { for (j=0; j<4; j++) {
jlDrawBlit8x8(jlImgSurfaceGet(biffI), j * 8 + 32, i * 8 + 32, x + (j * 8), y + (i * 8)); jlDrawBlit8x8(jlImgSurfaceGet(kangaI), x + (j * 8), y + (i * 8), x + (j * 8), y + (i * 8));
} }
} }
// Check for early quit // Check for early quit
@ -447,8 +445,8 @@ int main(void) {
//grid(); //grid();
//lineTest(); //lineTest();
//musicTest(); //musicTest();
//showStencil(); showStencil();
stencilTest(); //stencilTest();
//timerTest(); //timerTest();
jlUtilShutdown(); jlUtilShutdown();