#include "tools.h"
#include "vga.h"
#include "vram.h"
+#include "sprite.h"
static struct rgb15 *disp_data;
void *vga_shm_get(void);
void vga_xfer(void);
void dump_vram(int type, int bank, unsigned short addr, int size);
void set_bgtile(int tile_id);
+void set_sprite(int x, int y, int tile_id, struct sprite_attr sa);
struct timespec sleep_inteval = {0, 1000000 / VGA_REFRESH_RATE};
spr_palette_tbl_set(i, plt[i + 16]);
for (i = 0; i < 960; i++)
- name_tbl_set(0, i, 2);
+ name_tbl_set(0, i, 0);
for (i = 0; i < 64; i++)
attr_tbl_set(0, i, 0);
//name_tbl_set(0, 205, 2);
- name_tbl_set(0, 300, 1);
name_tbl_set(0, 205, 'D');
name_tbl_set(0, 206, 'e');
name_tbl_set(0, 207, 'e');
name_tbl_set(0, 209, '!');
//205 = palette gp2 01100101b
//205 = 11
- attr_tbl_set(0, 0, 0x65);
attr_tbl_set(0, 11, 0x65);
+ //other test.
+ name_tbl_set(0, 300, 1);
+ attr_tbl_set(0, 0, 0x65);
+
for (i = 0; i < 960; i++)
set_bgtile(i);
+ //sprite test
+ struct sprite_attr sa;
+ sa.palette = 2;
+ sa.priority = 1;
+ sa.flip_h = 0;
+ sa.flip_v = 0;
+ set_sprite(30, 100, 'd', sa);
+ sa.flip_h = 1;
+ set_sprite(50, 100, 'd', sa);
+ sa.flip_v = 1;
+ set_sprite(70, 105, 'd', sa);
+
vga_xfer();
//void dump_vram(int type, int bank, unsigned short addr, int size);
#include "vga.h"
#include "ppucore.h"
#include "vram.h"
+#include "sprite.h"
void load_attribute(unsigned char bank, int tile_index, struct palette *plt);
void load_pattern(unsigned char bank, unsigned char ptn_index, struct tile_2* pattern);
+void load_spr_attribute(struct sprite_attr sa, struct palette *plt);
struct tile_rgb15_line {
struct rgb15 d[8];
static struct tile_rgb15 *vscreen;
+void vscreenn_dot_get(int x, int y, struct rgb15 *col) {
+ int tile_id, tile_id_x, tile_id_y;
+ int inner_x, inner_y;
+ struct tile_rgb15* tile;
+
+ tile_id_x = x / TILE_DOT_SIZE;
+ tile_id_y = y / TILE_DOT_SIZE;
+ tile_id = tile_id_x + tile_id_y * H_SCREEN_TILE_SIZE;
+ tile = vscreen + tile_id;
+
+ inner_x = x % TILE_DOT_SIZE;
+ inner_y = y % TILE_DOT_SIZE;
+ *col = tile->l[inner_y].d[inner_x];
+}
+
+void vscreenn_dot_set(int x, int y, struct rgb15 *col) {
+ int tile_id, tile_id_x, tile_id_y;
+ int inner_x, inner_y;
+ struct tile_rgb15* tile;
+
+ tile_id_x = x / TILE_DOT_SIZE;
+ tile_id_y = y / TILE_DOT_SIZE;
+ tile_id = tile_id_x + tile_id_y * H_SCREEN_TILE_SIZE;
+ tile = vscreen + tile_id;
+
+ inner_x = x % TILE_DOT_SIZE;
+ inner_y = y % TILE_DOT_SIZE;
+ tile->l[inner_y].d[inner_x] = *col;
+}
+
void set_bgtile(int tile_id) {
struct palette plt;
set_data = vscreen + tile_id;
for (i = 0; i < TILE_DOT_SIZE; i++) {
- set_data->l[i].d[0] = plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot0];
- set_data->l[i].d[1] = plt.col[ptn.b0.l[i].dot1 + ptn.b1.l[i].dot1];
- set_data->l[i].d[2] = plt.col[ptn.b0.l[i].dot2 + ptn.b1.l[i].dot2];
- set_data->l[i].d[3] = plt.col[ptn.b0.l[i].dot3 + ptn.b1.l[i].dot3];
- set_data->l[i].d[4] = plt.col[ptn.b0.l[i].dot4 + ptn.b1.l[i].dot4];
- set_data->l[i].d[5] = plt.col[ptn.b0.l[i].dot5 + ptn.b1.l[i].dot5];
- set_data->l[i].d[6] = plt.col[ptn.b0.l[i].dot6 + ptn.b1.l[i].dot6];
- set_data->l[i].d[7] = plt.col[ptn.b0.l[i].dot7 + ptn.b1.l[i].dot7];
+ //display shows left to right with high bit to low bit
+ set_data->l[i].d[7] = plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot0];
+ set_data->l[i].d[6] = plt.col[ptn.b0.l[i].dot1 + ptn.b1.l[i].dot1];
+ set_data->l[i].d[5] = plt.col[ptn.b0.l[i].dot2 + ptn.b1.l[i].dot2];
+ set_data->l[i].d[4] = plt.col[ptn.b0.l[i].dot3 + ptn.b1.l[i].dot3];
+ set_data->l[i].d[3] = plt.col[ptn.b0.l[i].dot4 + ptn.b1.l[i].dot4];
+ set_data->l[i].d[2] = plt.col[ptn.b0.l[i].dot5 + ptn.b1.l[i].dot5];
+ set_data->l[i].d[1] = plt.col[ptn.b0.l[i].dot6 + ptn.b1.l[i].dot6];
+ set_data->l[i].d[0] = plt.col[ptn.b0.l[i].dot7 + ptn.b1.l[i].dot7];
}
}
-void set_bg(void) {
-/*
+void set_sprite(int x, int y, int tile_id, struct sprite_attr sa) {
+ struct palette plt;
+ struct tile_2 ptn;
int i;
- //struct tile_rgb15* set_data = vscreen + tile_id;
- unsigned char data;
- unsigned char *p;
- struct tile_2 pattern;
- unsigned short addr;
- //load name tbl
- //name_tbl_get();
-
- //load character pattern
- p = (unsigned char*)&pattern;
- addr = tile_id * sizeof(struct tile_2);
- for (i = 0; i < sizeof(struct tile_2); i++) {
- data = pattern_tbl_get(bg_bank, addr);
- *p = data;
- p++;
- }
- //load attribute.
-*/
-}
+ load_spr_attribute(sa, &plt);
-void vscreenn_dot_get(int x, int y, struct rgb15 *col) {
- int tile_id, tile_id_x, tile_id_y;
- int inner_x, inner_y;
- struct tile_rgb15* tile;
-
- tile_id_x = x / TILE_DOT_SIZE;
- tile_id_y = y / TILE_DOT_SIZE;
- tile_id = tile_id_x + tile_id_y * H_SCREEN_TILE_SIZE;
- tile = vscreen + tile_id;
-
- inner_x = x % TILE_DOT_SIZE;
- inner_y = y % TILE_DOT_SIZE;
- *col = tile->l[inner_y].d[inner_x];
+ load_pattern(0, tile_id, &ptn);
+ //display shows left to right with high bit to low bit
+ for (i = 0; i < TILE_DOT_SIZE; i++) {
+ if (sa.flip_h) {
+ if (sa.flip_v) {
+ vscreenn_dot_set(x + 0, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot0]);
+ vscreenn_dot_set(x + 1, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot1]);
+ vscreenn_dot_set(x + 2, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot2]);
+ vscreenn_dot_set(x + 3, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot3]);
+ vscreenn_dot_set(x + 4, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot4]);
+ vscreenn_dot_set(x + 5, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot5]);
+ vscreenn_dot_set(x + 6, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot6]);
+ vscreenn_dot_set(x + 7, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot7]);
+ }
+ else {
+ vscreenn_dot_set(x + 0, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot0]);
+ vscreenn_dot_set(x + 1, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot1]);
+ vscreenn_dot_set(x + 2, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot2]);
+ vscreenn_dot_set(x + 3, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot3]);
+ vscreenn_dot_set(x + 4, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot4]);
+ vscreenn_dot_set(x + 5, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot5]);
+ vscreenn_dot_set(x + 6, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot6]);
+ vscreenn_dot_set(x + 7, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot7]);
+ }
+ }
+ else {
+ if (sa.flip_v) {
+ vscreenn_dot_set(x + 7, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot0]);
+ vscreenn_dot_set(x + 6, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot1]);
+ vscreenn_dot_set(x + 5, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot2]);
+ vscreenn_dot_set(x + 4, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot3]);
+ vscreenn_dot_set(x + 3, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot4]);
+ vscreenn_dot_set(x + 2, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot5]);
+ vscreenn_dot_set(x + 1, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot6]);
+ vscreenn_dot_set(x + 0, y + 7 - i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot7]);
+ }
+ else {
+ vscreenn_dot_set(x + 7, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot0]);
+ vscreenn_dot_set(x + 6, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot1]);
+ vscreenn_dot_set(x + 5, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot2]);
+ vscreenn_dot_set(x + 4, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot3]);
+ vscreenn_dot_set(x + 3, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot4]);
+ vscreenn_dot_set(x + 2, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot5]);
+ vscreenn_dot_set(x + 1, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot6]);
+ vscreenn_dot_set(x + 0, y + i, &plt.col[ptn.b0.l[i].dot0 + ptn.b1.l[i].dot7]);
+ }
+ }
+ }
}
int vscreen_init(void) {