ぴゅう太で16bit Cを使うためにTMS9900 GCC+libti99を利用しています。
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;}