// Who When What
// --- ---------- -----------------------------------------------------------
// JLH 03/12/2003 Ported this steaming pile of crap from VESA to SDL
+// JLH 04/04/2014 Ported to SDL 2. Much less crappy.
//
#include "screen.h"
uint8_t hScrollOffset; // Horizontal scroll offset
uint8_t vScrollOffset; // Vertical scroll offset
uint8_t spr_color_index; // Sprite color index
-uint32_t hoffsets[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };// Scroll offsets...
+//uint32_t hoffsets[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };// Scroll offsets...
//uint32_t voffsets[8] = { 0, 320, 640, 960, 1280, 1600, 1920, 2240 };
uint32_t voffsets[8] = { 288*0, 288*1, 288*2, 288*3, 288*4, 288*5, 288*6, 288*7 };
-//n.b.: 320 = $140
-// $000, $140, $280, $3C0, $500, $640, $780, $8C0
extern bool show_text; // Whether or not to show text
extern bool show_scr; // Whether or not to show screen
if (ShowGUI())
DrawGUI();
-#if 0
- if (SDL_LockSurface(scr) < 0)
- {
-// fprintf(stderr, "Couldn't lock the display surface: %s\n", SDL_GetError());
-// exit(2);
- }
-#endif
-
// Rolling Thunder screen size is 288 x 224. Virtual is this, real may not be...
- uint32_t src = 0;//(uint32_t)(hoffsets[hScrollOffset] + voffsets[vScrollOffset]);
-// uint32_t srcAdd = 320 - VIRTUAL_SCREEN_WIDTH;
+ uint32_t src = 0;
for(int i=0; i<VIRTUAL_SCREEN_HEIGHT; i++)
- {
for (int j=0; j<VIRTUAL_SCREEN_WIDTH; j++)
- {
- scrBuffer[(i * VIRTUAL_SCREEN_WIDTH) + j] = palette[my_scr[src++]];
- }
-
-// src += srcAdd;
- }
+// scrBuffer[(i * VIRTUAL_SCREEN_WIDTH) + j] = palette[my_scr[src++]];
+ scrBuffer[src] = palette[my_scr[src++]];
RenderScreenBuffer();
}
static inline void DrawSpriteBlock(uint32_t & sprnum, uint16_t x, uint16_t y, uint16_t xStart, uint16_t xEnd, int16_t xInc)
{
extern uint8_t spr_rom[];
-// uint32_t sc_addr;
for(uint16_t sy=0; sy<16; sy++)
{
-// for(uint16_t sx=0; sx<16; sx+=2)
for(uint16_t sx=xStart; sx<xEnd; sx+=xInc)
{
uint8_t b1 = spr_rom[sprnum] >> 4, b2 = spr_rom[sprnum++] & 0x0F;
static inline void DrawSpriteBlock2(uint32_t & sprnum, uint16_t x, uint16_t y, uint16_t xStart, uint16_t xEnd, int16_t xInc)
{
extern uint8_t spr_rom[];
-// uint32_t sc_addr;
for(uint16_t sy=0; sy<16; sy++)
{
-// for(uint16_t sx=0; sx<16; sx+=2)
for(uint16_t sx=xStart; sx!=xEnd; sx+=xInc)
{
uint8_t b1 = spr_rom[sprnum] >> 4, b2 = spr_rom[sprnum++] & 0x0F;
void Sprite(uint32_t sprnum, uint16_t x, uint16_t y, uint8_t flip,
uint8_t horiz_bl, uint8_t vert_bl)
{
- extern uint8_t spr_rom[];
- uint32_t sc_addr;
- sprnum <<= 7; // 128 bytes per sprite
+ // 128 bytes per sprite (16 x 16 chunks, 4 bits per pixel)
+ sprnum <<= 7;
if (!vert_bl)
y += 16;
if (!flip)
{
-#if 0
- for(uint16_t sy=0; sy<16; sy++)
- {
- for(uint16_t sx=0; sx<16; sx+=2)
- {
- uint8_t b1 = spr_rom[sprnum] >> 4, b2 = spr_rom[sprnum++] & 0x0F;
- uint16_t spy = y + sy, spx = x + sx; // Need to optimize this clipping!
-
- // This handles negative values, by casting as unsigned
-#if 0
-// if (spy > 223 || spx > 299)
- if (spy >= 224 || spx >= 288)
- sc_addr = 0x13FFE;
- else
-// sc_addr = spx + spy * 320;
- sc_addr = spx + (spy * 288);
-#else
- sc_addr = ((spy >= 224) || (spx >= 288) ? 0x13FFE : spx + (spy * 288));
-#endif
- if (b1 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b1]; // Store it
-
- sc_addr++;
-
- if (b2 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b2]; // Store it
- }
- }
-#else
DrawSpriteBlock(sprnum, x, y, 0, 16, 2);
-#endif
if (horiz_bl)
- {
-#if 0
- for(uint16_t sy=0; sy<16; sy++)
- {
- for(uint16_t sx=16; sx<32; sx+=2)
- {
- uint8_t b1 = spr_rom[sprnum] >> 4, b2 = spr_rom[sprnum++] & 0x0F;
- uint16_t spy = y + sy, spx = x + sx;
-
-// if (spy > 223 || spx > 299)
- if (spy > 223 || spx > 287)
- sc_addr = 0x13FFE;
- else
-// sc_addr = spx + spy * 320;
- sc_addr = spx + (spy * 288);
-
- if (b1 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b1]; // Store it
-
- sc_addr++;
-
- if (b2 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b2]; // Store it
- }
- }
-#else
DrawSpriteBlock(sprnum, x, y, 16, 32, 2);
-#endif
- }
else
sprnum += 128; // Advance to next...
{
y += 16; // Do next row...
-#if 0
- for(uint16_t sy=0; sy<16; sy++)
- {
- for(uint16_t sx=0; sx<16; sx+=2)
- {
- uint8_t b1 = spr_rom[sprnum] >> 4, b2 = spr_rom[sprnum++] & 0x0F;
- uint16_t spy = y + sy, spx = x + sx;
-
-// if (spy > 223 || spx > 299)
- if (spy > 223 || spx > 287)
- sc_addr = 0x13FFE;
- else
-// sc_addr = spx + spy * 320;
- sc_addr = spx + (spy * 288);
-
- if (b1 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b1]; // Store it
-
- sc_addr++;
-
- if (b2 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b2]; // Store it
- }
- }
-#else
DrawSpriteBlock(sprnum, x, y, 0, 16, 2);
-#endif
if (horiz_bl)
- {
-#if 0
- for(uint16_t sy=0; sy<16; sy++)
- {
- for(uint16_t sx=16; sx<32; sx+=2)
- {
- uint8_t b1 = spr_rom[sprnum] >> 4, b2 = spr_rom[sprnum++] & 0x0F;
- uint16_t spy = y + sy, spx = x + sx;
-
-// if (spy > 223 || spx > 299)
- if (spy > 223 || spx > 287)
- sc_addr = 0x13FFE;
- else
-// sc_addr = spx + spy * 320;
- sc_addr = spx + (spy * 288);
-
- if (b1 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b1]; // Store it
-
- sc_addr++;
-
- if (b2 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b2]; // Store it
- }
- }
-#else
DrawSpriteBlock(sprnum, x, y, 16, 32, 2);
-#endif
- }
}
}
else // Flip
{
if (horiz_bl)
- {
-#if 0
- for(uint16_t sy=0; sy<16; sy++)
- {
- for(uint16_t sx=30; sx!=14; sx-=2)
- {
- uint8_t b1 = spr_rom[sprnum] >> 4, b2 = spr_rom[sprnum++] & 0x0F;
- uint16_t spy = y + sy, spx = x + sx;
-
-// if ((spy > 223) || (spx > 299))
- if ((spy > 223) || (spx > 287))
- sc_addr = 0x13FFE;
- else
-// sc_addr = spx + spy * 320;
- sc_addr = spx + (spy * 288);
-
- if (b2 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b2]; // Store it
-
- sc_addr++;
-
- if (b1 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b1]; // Store it
- }
- }
-#else
DrawSpriteBlock2(sprnum, x, y, 30, 14, -2);
-#endif
- }
-
-#if 0
- for(uint16_t sy=0; sy<16; sy++)
- {
- for(uint16_t sx=14; sx!=0xFFFE; sx-=2)
- {
- uint8_t b1 = spr_rom[sprnum] >> 4, b2 = spr_rom[sprnum++] & 0x0F;
- uint16_t spy = y + sy, spx = x + sx;
-
-// if ((spy > 223) || (spx > 299))
- if ((spy > 223) || (spx > 287))
- sc_addr = 0x13FFE;
- else
-// sc_addr = spx + spy * 320;
- sc_addr = spx + (spy * 288);
- if (b2 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b2]; // Store it
-
- sc_addr++;
-
- if (b1 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b1]; // Store it
- }
- }
-#else
DrawSpriteBlock2(sprnum, x, y, 14, 0xFFFE, -2);
-#endif
if (!horiz_bl)
sprnum += 128; // If single, skip sprite...
y += 16; // Adjust Y coord...
if (horiz_bl)
- {
-#if 0
- for(uint16_t sy=0; sy<16; sy++)
- {
- for(uint16_t sx=30; sx!=14; sx-=2)
- {
- uint8_t b1 = spr_rom[sprnum] >> 4, b2 = spr_rom[sprnum++] & 0x0F;
- uint16_t spy = y + sy, spx = x + sx;
-
-// if ((spy > 223) || (spx > 299))
- if ((spy > 223) || (spx > 287))
- sc_addr = 0x13FFE;
- else
-// sc_addr = spx + spy * 320;
- sc_addr = spx + (spy * 288);
-
- if (b2 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b2]; // Store it
-
- sc_addr++;
-
- if (b1 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b1]; // Store it
- }
- }
-#else
DrawSpriteBlock2(sprnum, x, y, 30, 14, -2);
-#endif
- }
-#if 0
- for(uint16_t sy=0; sy<16; sy++)
- {
- for(uint16_t sx=14; sx!=0xFFFE; sx-=2)
- {
- uint8_t b1 = spr_rom[sprnum] >> 4, b2 = spr_rom[sprnum++] & 0x0F;
- uint16_t spy = y + sy, spx = x + sx;
-
-// if ((spy > 223) || (spx > 299))
- if ((spy > 223) || (spx > 287))
- sc_addr = 0x13FFE;
- else
-// sc_addr = spx + spy * 320;
- sc_addr = spx + (spy * 288);
-
- if (b2 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b2]; // Store it
-
- sc_addr++;
-
- if (b1 != 15)
- my_scr[sc_addr] = scolor[spr_color_index][b1]; // Store it
- }
- }
-#else
DrawSpriteBlock2(sprnum, x, y, 14, 0xFFFE, -2);
-#endif
}
}
}