tanamの日記

2018-01-11

GAMELIB16 その4

09:30

ぴゅう太で16bit Cを使うためにTMS9900 GCC+libti99を利用しています。

https://github.com/tursilion

libti99はTI-99/4A用のライブラリですが、vdp.hを書き換えることでぴゅう太でも利用できます。

http://www43.tok2.com/home/cmpslv/Sg1000/9918m0.htm

//*********************
// VDP access ports
//*********************

// Read Data
#define VDPRD   *((volatile unsigned char*)0xE000)
// Read Status
#define VDPST   *((volatile unsigned char*)0xE002)
// Write Address/Register
#define VDPWA   *((volatile unsigned char*)0xE002)
// Write Data
#define VDPWD   *((volatile unsigned char*)0xE000)

しかしすこしむずかしいので(笑)共通APIでラップしました。ここではTMS9918グラフィック1をどのように使うか説明します。

http://www.geocities.jp/parallel_computer_inc/gamelib16.zip

+-------------+SPRITE ATTR TABLE
|             |0300-037F
+-------------+
+-------------+BG & SPRITE PATTERN
|ASCII   COLOR|0800-08FF
|           15|0900-09FF
|             |0A00-0AFF
|CHAR    COLOR|0B00-0BFF
|   0  1, 2, 3|0C00-0CFF
|   4, 5, 6, 7|0D00-0DFF
|   8, 9,10,11|0E00-0EFF
|  12,13,14,15|0F00-0FFF
+-------------+
+-------------+BG NAME TABLE
|             |1400-14FF
|             |1500-15FF
|             |1600-16FF
+-------------+
+-------------+COLOR TABLE
|             |3FC0-3FDF
+-------------+
void wwc_set_color_mode(int mode);
void wwc_font_set_colordata(u16 tilestart, u16 noftiles, u16 *data);
void wwc_palette_set_color(u8 palettenumber, u8 colornumber, u16 color);
void screen_set_char(u8 layer, u8 xts, u8 yts, u8 xte, u8 yte, u16 *map);
void screen_set_scroll(u8 layer, u8 x, u8 y);
void display_control(u8 mode);
void wwc_set_color_mode(int x)
{
	x = set_graphics_raw(VDP_SPR_8x8 ); // SPRITE 8x8
	VDP_SET_REGISTER(VDP_REG_MODE1, x); // MODE 0 GRAPHIC1
	VDP_SET_REGISTER(VDP_REG_COL,0xF0); // BACKDROP COLOR 0
	VDP_SET_REGISTER(VDP_REG_SAL,   6); // 0300-037F
	VDP_SET_REGISTER(VDP_REG_SDT,   1); // 0800-0FFF
	VDP_SET_REGISTER(VDP_REG_PDT,   1); // 0800-0FFF
	VDP_SET_REGISTER(VDP_REG_SIT,   5); // 1400-16FF
	VDP_SET_REGISTER(VDP_REG_CT, 0xFF); // 3FC0-3FDF
	return;
}
void wwc_font_set_colordata(u16 tilestart, u16 noftiles, u16 *data)
{
	u8 c, *gfx;
	gfx = (u8 *)data;
	int i, j, k, l;
	for(i=0; i<256; i++) {
		l = i * 32;
		for (j=0; j<8; j++) {
			c=0x00;
			for (k=0; k<4; k++) {
				c <<= 2;
				if (gfx[l + j * 4 + k] & 0xF0) c |= 0x02;
				if (gfx[l + j * 4 + k] & 0x0F) c |= 0x01;
			}
			gfx[i * 8 + j] = c;
		}
	}
	vdpmemcpy(0x0800, data, 0x0800);
	return;
}
void wwc_palette_set_color(u8 palettenumber, u8 colornumber, u16 color)
{
	u8 c=0xF0;
	vdpmemcpy(0x3FC0+colornumber, &c, 1);
	c=(colornumber << 4);
	vdpmemcpy(0x3FD0+colornumber, &c, 1);
	return;
}
void screen_set_char(u8 layer, u8 xts, u8 yts, u8 xte, u8 yte, u16 *map)
{
	int x, y;
	u8 xy;
	for (y = yts; y < SCREEN_HEIGHT; y++) {
		for (x = xts; x < SCREEN_WIDTH; x++) {
			xy = map[y*SCREEN_WIDTH+x];
			if (xy < 16) xy = xy * 8 + 128;
			vdpmemcpy(0x1400 + (x + (y * 32)), &xy, 1);
		}
	}
	return;
}

以下の共通APIはTMS9918では何もしません。

void screen_set_scroll(u8 layer, u8 x, u8 y) {return;}
void display_control(u8 mode) {return;}
トラックバック - http://d.hatena.ne.jp/tanam/20180111/1515630601