X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=plzpart-gl%2Fvga.c;fp=plzpart-gl%2Fvga.c;h=f817e25448e0d516cd3346198edc9cffe23e6e95;hb=76f1de9c221ab0399316bdd84f2d29bdc0605195;hp=0000000000000000000000000000000000000000;hpb=21358d1282235770140bc4e2941609122472108d;p=plz.git diff --git a/plzpart-gl/vga.c b/plzpart-gl/vga.c new file mode 100755 index 0000000..f817e25 --- /dev/null +++ b/plzpart-gl/vga.c @@ -0,0 +1,126 @@ +/* + * Written by Nick Kovac with minor changes by Claudio Matsuoka + */ + +#include +#include "common.h" + +static int plane_select[4] = { 0, 0, 0, 0 }; +static int line_compare = 0; +static int hscroll_offset = 0; +static uint8_t palette[256 * 3]; + +#define SCREEN_WIDTH 320 +#define SCREEN_HEIGHT 400 +#define FRAME_BUFFER_WIDTH 384 +#define FRAME_BUFFER_HEIGHT 400 + +uint8_t fb[FRAME_BUFFER_WIDTH * FRAME_BUFFER_HEIGHT]; + + +void vga_select_bitplanes_02() +{ + plane_select[0] = 1; + plane_select[1] = 0; + plane_select[2] = 1; + plane_select[3] = 0; +} + +void vga_select_bitplanes_13() +{ + plane_select[0] = 0; + plane_select[1] = 1; + plane_select[2] = 0; + plane_select[3] = 1; +} + +void vga_select_bitplanes_0123() +{ + plane_select[0] = 1; + plane_select[1] = 1; + plane_select[2] = 1; + plane_select[3] = 1; +} + +void vga_write32(int offset, int val) +{ + int i, j; + + // For each selected plane, calculate 4 pixel offsets and write 4 bytes. + // offset = 0, 4, 8, etc + + for (i = 0; i < 4; i++) { + if (plane_select[i]) { + for (j = 0; j < 4; j++) { + // Get byte to write. + uint8_t b = (val >> (j * 8)); + + // Calculate offset. + int fb_offs = i + (offset + j) * 4; + + // Write pixel. + fb[fb_offs] = b; + } + } + } +} + +void vga_set_line_compare(int y) +{ + line_compare = y; +} + +void vga_set_palette_entry(int index, int r, int g, int b) +{ + index *= 3; + palette[index++] = r; + palette[index++] = g; + palette[index] = b; +} + +extern unsigned char *image; // The OpenGL background image texture + +void vga_show_framebuffer() +{ + int x, y; + + int nFirstLineIndex = line_compare + 1; + + // Plot the palettised frame buffer. + unsigned int *ptr = fb; + + // Clear the screen. + memset(image, 0, FRAME_BUFFER_WIDTH * FRAME_BUFFER_HEIGHT * 3); + + copper1(); + copper2(); + + for (y = nFirstLineIndex; y < SCREEN_HEIGHT; y++) { + for (x = 0; x < SCREEN_WIDTH; x++) { + //ASSERT(x + hscroll_offset < FRAME_BUFFER_WIDTH); + uint8_t r, g, b; + int idx = ptr[x + hscroll_offset] * 3; + + r = palette[idx++]; + g = palette[idx++]; + b = palette[idx]; + + int ofs = (y * 320 + x) * 3; + image[ofs++] = r << 2; + image[ofs++] = g << 2; + image[ofs] = b << 2; + } + + ptr += FRAME_BUFFER_WIDTH; + } +} + +void vga_set_hscroll_offset(int offset) +{ + hscroll_offset = offset; +} + +void vga_upload_palette(uint8_t *pal) +{ + memcpy(palette, pal, 256 * 3); +}