sharksym's MSX World

sharksym.egloos.com

포토로그


구글 애드센스 (블로그 기본)


그래픽 라이브러리 제작 중 #2 by sharksym

주말을 맞아 작업이 좀더 진행이 됐습니다.
 
스프라이트 기본기능과 VDP 커맨드를 이용한 메모리 copy 정도를 넣어봤습니다.
 
아래는 현재 작업 상황입니다.
 
1. VDP I/O
   - VDP control 레지스터 쓰기, status 레지스터 읽기
   - VRAM 읽기/쓰기
   - VRAM 페이지(16KB 단위) clear
   - 디스크, VRAM 간의 Load/Save
 
2. 비트맵 모드 (스크린 5,6,7,8)
   - 페이징
   - VRAM R/W 이용한 픽셀 그리기
   - HW 수직 스크롤(V9938)
   - HW 수평 스크롤(V9958, 1페이지, 2페이지 모드)
   - VDP 커맨드 (일부 구현)
   - 폰트
   - Circle
   - 인터레이스 모드 DRAW: Line, Box
 
3. 스프라이트
   - 스프라이트 모드2
   - 스프라이트 모드1
   - 패턴 애니메이션
 
4. 패턴맵 모드 (스크린 2,4)
   - 페이징
   - 패턴 애니메이션
   - Line, Box, Circle
   - SW 스크롤
 
5. 팔레트
   - 팔레트 애니메이션
 
6. 텍스트 패턴맵 모드 (스크린 0,1)
   - 페이징
   - 폰트
   - Line, Box (특수 문자)
 
7. 비트맵 모드 (스크린 10,11,12)
   - 2번에서 중복 기능 외...
 
 
 
아래는 라이브러리 테스트용 프로그램이 동작하는 모습인데요, 잠시 구경해보세요~ ㅎ



아래는 라이브러리 테스트 프로그램의 소스입니다.
어떤식으로 사용하는지 참고하실수가 있겠네요. (에디터에서 붙여넣기 했는데 가독성이 안좋군요. 흐흠..ㅋ)
라이브러리는 좀 더 완성되어야 공개가 가능할 것 같네요.
 

/-
 * BLGRP Test program
 *-

#include <stdio.h>
#include <string.h>
#include <sys.h>
#include <msxio.h>
#include <msxbdos.h>
#include <keyio.h>
#include <bltype.h>
#include <blstdlib.h>

#include <blgrp.h>

uint8_t spr_test[] = {
 0xFF,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0xFF
};
uint8_t spr_color[] = {
 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F
};
uint8_t spr_test2[] = {
 0xFF,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0xFF,
 0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,
 0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,
 0xFF,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0xFF
};
uint8_t spr_color2[] = {
 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x0F
};

void test_setup_spr1(void)
{
 bl_grp_clear_sprite();

 bl_grp_set_sprite_mode(GRP_SPR_8);
 bl_grp_set_sprite_pattern_8x8(0, spr_test);
 bl_grp_set_sprite_color(0, spr_color);
 bl_grp_set_sprite_color(1, spr_color);
 bl_grp_set_sprite_color(2, spr_color);
 bl_grp_set_sprite_color(3, spr_color);
}

void test_setup_spr2(void)
{
 bl_grp_clear_sprite();

 bl_grp_set_sprite_mode(GRP_SPR_16EX);
 bl_grp_set_sprite_pattern_16x16(0, spr_test2);
 bl_grp_set_sprite_color(0, spr_color2);
}

void test_paging(void)
{
 uint16_t x, y;
 uint8_t c;

 bl_grp_set_active_page(0);
 bl_grp_set_view_page(0);
 for (c = 0, y = 0; y < 8; y++) {
  for (x = 0; x < 256; x++) {
   bl_grp_put_pixel(x, y, c);
   c++;
  }
 }
 for (y = 8; y < 212; y += 8) {
  bl_grp_hcopy_vram_to_vram(0, 0, 256, 8, 0, y);
 }

 bl_grp_set_active_page(1);
 bl_grp_set_view_page(1);
 for (c = 0, y = 0; y < 16; y++, c++) {
  for (x = 0; x < 256; x++) {
   bl_grp_put_pixel(x, y, c);
  }
 }
 for (y = 16; y < 256; y += 16) {
  bl_grp_hcopy_vram_to_vram(0, 256, 256, 16, 0, (uint16_t)256 + y);
 }

 c = 0;
 bl_set_frame_rate(20);
 while (!key_clicked(KEY_ESC)) {
  bl_grp_set_view_page(c);
  c++;
  c &= 0x01;
  bl_wait_frame_rate();
 }
}

void test_scroll_v(void)
{
 uint8_t c;
 uint8_t spr_x = 100;
 uint8_t spr_y = 100;

 bl_grp_set_active_page(1);
 bl_grp_set_view_page(1);
 c = 0;
 bl_grp_set_scroll_ver(c);
 bl_set_frame_rate(1);

 while (!key_clicked(KEY_ESC)) {
  if (key_pressed(KEY_LEFT))
   spr_x -= 2;
  if (key_pressed(KEY_RIGHT))
   spr_x += 2;
  if (key_pressed(KEY_UP))
   spr_y -= 2;
  if (key_pressed(KEY_DOWN))
   spr_y += 2;

  bl_wait_frame_rate();
  bl_grp_set_scroll_ver(c);
  bl_grp_put_sprite(0, spr_x, spr_y, 0, 0);
  bl_grp_put_sprite(1, spr_x + 8, spr_y, 0, 0);
  bl_grp_put_sprite(2, spr_x + 16, spr_y, 0, 0);
  bl_grp_put_sprite(3, spr_x + 24, spr_y, 0, 0);
  bl_grp_hcopy_vram_to_vram(0, 0, 32, 8, spr_x, (uint16_t)256 + (uint8_t)(spr_y + c));
  c++;
 }

 bl_grp_set_scroll_ver(0);
}

void test_scroll_h_1page(void)
{
 uint16_t x;
 uint8_t spr_x = 100;
 uint8_t spr_y = 100;

 /- 1page scroll *-
 bl_grp_set_view_page(0);
 bl_grp_set_scroll_mode(GRP_SCROLL_P1M);
 x = 0;
 bl_set_frame_rate(1);
 while (!key_clicked(KEY_ESC)) {
  if (key_pressed(KEY_LEFT))
   spr_x--;
  if (key_pressed(KEY_RIGHT))
   spr_x++;
  if (key_pressed(KEY_UP))
   spr_y--;
  if (key_pressed(KEY_DOWN))
   spr_y++;

  bl_wait_frame_rate();
  bl_grp_set_scroll_hor(x);
  bl_grp_put_sprite(0, spr_x, spr_y, 0, 0);
  x++;
  x &= 0xFF;
 }
}

void test_scroll_h_2page(void)
{
 uint16_t x;
 uint8_t spr_x = 100;
 uint8_t spr_y = 100;

 /- 2page scroll *-
 bl_grp_set_view_page(1);
 bl_grp_set_scroll_mode(GRP_SCROLL_P2M);
 x = 0;
 bl_set_frame_rate(1);
 while (!key_clicked(KEY_ESC)) {
  if (key_pressed(KEY_LEFT))
   spr_x--;
  if (key_pressed(KEY_RIGHT))
   spr_x++;
  if (key_pressed(KEY_UP))
   spr_y--;
  if (key_pressed(KEY_DOWN))
   spr_y++;

  bl_wait_frame_rate();
  bl_grp_set_scroll_hor(x);
  bl_grp_put_sprite(0, spr_x, spr_y, 0, 0);
  x++;
  x &= 0x1FF;
 }

 bl_grp_set_scroll_mode(GRP_SCROLL_P1);
}

int main(int argc, char* argv[])
{
 bl_disable_bios_timi();

 if (bl_grp_init() < 0) {
  printf("grp init error!\n");
  return 0;
 }

 bl_grp_set_display_on(0); /- display off *-

 bl_grp_set_screen_mode(GRP_SCR_G4);
/- bl_grp_set_screen_mode(GRP_SCR_G5);*-
/- bl_grp_set_screen_mode(GRP_SCR_G6);*-
/- bl_grp_set_screen_mode(GRP_SCR_G7);*-

 bl_grp_set_display_mode(GRP_DISP_240P);

 bl_grp_set_display_on(1); /- display on *-
 bl_grp_set_sprite_on(1); /- sprite on *-

 test_paging();

 test_setup_spr1();
 test_scroll_v();

 test_setup_spr2();
 test_scroll_h_1page();
 test_scroll_h_2page();

 bl_enable_bios_timi();

 bl_grp_deinit();

 return 0;
}

 






Title MSXrating email rss

CCL

크리에이티브 커먼즈 라이선스
Yeongman Seo에 의해 작성된 저작물은, 별도의 라이선스 조건이 없는 경우 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

ClusterMaps

구글 애드센스 (세로 큰직사각형)

통계 위젯 (화이트)

1643
172
167116

이 이글루를 링크한 사람 (화이트)

28