Browse Source

When executing a function related to text display, (although characters are not displayed as usual)
At the very least I output the character string to the terminal.

We implemented the window function of screen 2.

Version 0.0.2 alpha - from wonx-a02.tar.gz

Hiroaki Sakai 23 years ago
parent
commit
1d5ebf4867
9 changed files with 186 additions and 57 deletions
  1. 16 0
      HISTORY
  2. 2 2
      Makefile
  3. 34 12
      WWDisplay.c
  4. 0 4
      WWDisplay.h
  5. 0 5
      WWDisplayP.h
  6. 31 4
      WWScreen.c
  7. 31 4
      WWScreen.h
  8. 12 0
      WWScreenP.h
  9. 60 26
      disp.c

+ 16 - 0
HISTORY

@@ -0,0 +1,16 @@
+2000/9/27(水)
+
+Wonx-a02 公開
+
+テキスト表示関連の関数を実行したときに,(あいかわらず文字は表示されないが)
+せめてターミナルに文字列を出力するようにした.
+
+スクリーン2のウインドウ機能を実装した.
+
+
+
+
+2000/9/26(火)
+
+Wonx-a01 公開
+

+ 2 - 2
Makefile

@@ -2,8 +2,8 @@ XINCLUDEDIR = /usr/X11R6/include
 INCLUDEDIR = .
 XLIBDIR = /usr/X11R6/lib
 
-VERSION = Wonx-a01
-PKGNAME = wonx-a01
+VERSION = Wonx-a02
+PKGNAME = wonx-a02
 
 OBJS = WWCharacter.o WWColorMap.o WWDisplay.o WWLCDPanel.o WWPalette.o WWScreen.o WWSprite.o WonxDisplay.o XDisplay.o bank.o comm.o disp.o text.o key.o sound.o system.o timer.o etc.o wonx.o
 

+ 34 - 12
WWDisplay.c

@@ -20,14 +20,10 @@ WWSprite WWDisplay_GetSprite(WWDisplay d, int n) { return (d->sprite[n]); }
 WWScreen WWDisplay_GetScreen(WWDisplay d, int n) { return (d->screen[n]); }
 WWLCDPanel WWDisplay_GetLCDPanel(WWDisplay d) { return (d->lcd_panel); }
 
-int WWDisplay_GetScreenEnable(WWDisplay d, int n)
-{ return (d->screen_enable[n]); }
 int WWDisplay_GetSpriteEnable(WWDisplay d) { return (d->sprite_enable); }
 int WWDisplay_GetSpriteWindowEnable(WWDisplay d)
 { return (d->sprite_window_enable); }
 
-int WWDisplay_GetScreen2WindowMode(WWDisplay d)
-{ return (d->screen2_window_mode); }
 int WWDisplay_GetBorder(WWDisplay d) { return (d->border); }
 
 int WWDisplay_GetForegroundColor(WWDisplay d) { return (d->foreground_color); }
@@ -53,15 +49,11 @@ WWScreen WWDisplay_SetScreen(WWDisplay d, int n, WWScreen s)
 WWLCDPanel WWDisplay_SetLCDPanel(WWDisplay d, WWLCDPanel p)
 { return (d->lcd_panel = p); }
 
-int WWDisplay_SetScreenEnable(WWDisplay d, int n, int f)
-{ return (d->screen_enable[n] = f); }
 int WWDisplay_SetSpriteEnable(WWDisplay d, int f)
 { return (d->sprite_enable = f); }
 int WWDisplay_SetSpriteWindowEnable(WWDisplay d, int f)
 { return (d->sprite_window_enable = f); }
 
-int WWDisplay_SetScreen2WindowMode(WWDisplay d, int mode)
-{ return (d->screen2_window_mode = mode); }
 int WWDisplay_SetBorder(WWDisplay d, int b) { return (d->border = b); }
 
 int WWDisplay_SetForegroundColor(WWDisplay d, int c)
@@ -109,18 +101,17 @@ WWDisplay WWDisplay_Create(int lcd_panel_width, int lcd_panel_height,
     WWDisplay_SetScreen(display, i,
 			WWScreen_Create(i, screen_width, screen_height,
 					WWDisplay_GetPalette(display, 0),
-					WWDisplay_GetCharacter(display, 0)));
+					WWDisplay_GetCharacter(display, 0),
+					0, 0,
+					lcd_panel_width, lcd_panel_height));
   }
 
   WWDisplay_SetLCDPanel(display, WWLCDPanel_Create(lcd_panel_width,
 						   lcd_panel_height));
 
-  WWDisplay_SetScreenEnable(display, 0, 0);
-  WWDisplay_SetScreenEnable(display, 1, 0);
   WWDisplay_SetSpriteEnable(display, 0);
   WWDisplay_SetSpriteWindowEnable(display, 0);
 
-  WWDisplay_SetScreen2WindowMode(display, 0);
   WWDisplay_SetBorder(display, 0);
 
   WWDisplay_SetForegroundColor(display, 3);
@@ -189,16 +180,47 @@ static int WWDisplay_DrawScreen(WWDisplay display, WWScreen screen)
 
   int pixel;
   int x, y, px, py;
+  int sx, sy, ex, ey;
+  int mode;
+
+  if (!WWScreen_GetEnable(screen)) return (0);
 
   lcd_panel = WWDisplay_GetLCDPanel(display);
   lcd_panel_width  = WWLCDPanel_GetWidth( lcd_panel);
   lcd_panel_height = WWLCDPanel_GetHeight(lcd_panel);
 
+  if ( (WWScreen_GetMode(screen) == WWSCREEN_INSIDE_ONLY) ||
+       (WWScreen_GetMode(screen) == WWSCREEN_OUTSIDE_ONLY) ) {
+    sx = WWScreen_GetDrawX(screen);
+    sy = WWScreen_GetDrawX(screen);
+    ex = sx + WWScreen_GetDrawWidth( screen) - 1;
+    ey = sy + WWScreen_GetDrawHeight(screen) - 1;
+  }
+
+  mode = WWScreen_GetMode(screen);
+
+  /* 以下はホットスポットになるので,そのうちループアンローリング */
+  /* したほうがいいかも                                           */
+
   for (y = 0; y < lcd_panel_height; y++) {
     for (x = 0; x < lcd_panel_width; x++) {
       px = x + WWScreen_GetRollX(screen);
       py = y + WWScreen_GetRollY(screen);
 
+      if (mode == WWSCREEN_INSIDE_ONLY) {
+	if (y > ey) {
+	  x = lcd_panel_width - 1; y = lcd_panel_height - 1; continue;
+	}
+	if (y < sy) { x = lcd_panel_width - 1; y = sy - 1; continue; }
+	if (x > ex) { x = lcd_panel_width - 1; continue; }
+	if (x < sx) { x = sx - 1; continue; }
+      } else if (mode == WWSCREEN_OUTSIDE_ONLY) {
+	if ( (x >= sx) && (x <= ex) && (y >= sy) && (y <= ey) ) {
+	  x = ex;
+	  continue;
+	}
+      }
+
       pixel = WWScreen_GetPixel(screen, px, py);
 
       /* 透明色の場合 */

+ 0 - 4
WWDisplay.h

@@ -32,11 +32,9 @@ WWCharacter WWDisplay_GetCharacter(WWDisplay d, int n);
 WWSprite WWDisplay_GetSprite(WWDisplay d, int n);
 WWScreen WWDisplay_GetScreen(WWDisplay d, int n);
 WWLCDPanel WWDisplay_GetLCDPanel(WWDisplay d);
-int WWDisplay_GetScreenEnable(WWDisplay d, int n);
 int WWDisplay_GetSpriteEnable(WWDisplay d);
 int WWDisplay_GetSpriteWindowEnable(WWDisplay d);
 
-int WWDisplay_GetScreen2WindowMode(WWDisplay d);
 int WWDisplay_GetBorder(WWDisplay d);
 
 int WWDisplay_GetForegroundColor(WWDisplay d);
@@ -56,11 +54,9 @@ WWSprite WWDisplay_SetSprite(WWDisplay d, int n, WWSprite s);
 WWScreen WWDisplay_SetScreen(WWDisplay d, int n, WWScreen s);
 WWLCDPanel WWDisplay_SetLCDPanel(WWDisplay d, WWLCDPanel p);
 
-int WWDisplay_SetScreenEnable(WWDisplay d, int n, int f);
 int WWDisplay_SetSpriteEnable(WWDisplay d, int f);
 int WWDisplay_SetSpriteWindowEnable(WWDisplay d, int f);
 
-int WWDisplay_SetScreen2WindowMode(WWDisplay d, int mode);
 int WWDisplay_SetBorder(WWDisplay d, int b);
 
 int WWDisplay_SetForegroundColor(WWDisplay d, int c);

+ 0 - 5
WWDisplayP.h

@@ -21,14 +21,9 @@ typedef struct _WWDisplay {
   WWLCDPanel lcd_panel;
 
   /* ディスプレイの属性情報 */
-  int screen_enable[2]; /* スクリーン表示イネーブルフラグ */
   int sprite_enable;  /* スプライト表示イネーブルフラグ */
   int sprite_window_enable;  /* スプライトウインドウ機能イネーブルフラグ */
 
-  /* スクリーン2ウインドウモード */
-  /* 0,1... 無効 2...ウインドウの内側を表示 3...ウインドウの外側を表示 */
-  int screen2_window_mode;
-
   int border; /* ボーダーカラー.0~7のカラーマップ番号 */
 
   int foreground_color; /* モノクロフォント展開時の色 */

+ 31 - 4
WWScreen.c

@@ -73,7 +73,6 @@ static WWScreenCharacter WWScreen_SetScreenCharacter(WWScreen s, int x, int y,
 /* パブリックなもの                                                          */
 /*===========================================================================*/
 
-int WWScreen_GetNumber(WWScreen s) { return (s->number); }
 int WWScreen_GetHorizontal(WWScreen s, int x, int y)
 { return (WWScreen_GetScreenCharacter(s, x, y)->horizontal); }
 int WWScreen_GetVertical(WWScreen s, int x, int y)
@@ -83,7 +82,6 @@ WWPalette WWScreen_GetPalette(WWScreen s, int x, int y)
 WWCharacter WWScreen_GetCharacter(WWScreen s, int x, int y)
 { return (WWScreen_GetScreenCharacter(s, x, y)->character); }
 
-int WWScreen_SetNumber(WWScreen s, int n) { return (s->number = n); }
 int WWScreen_SetHorizontal(WWScreen s, int x, int y, int f)
 { return (WWScreen_GetScreenCharacter(s, x, y)->horizontal = f); }
 int WWScreen_SetVertical(WWScreen s, int x, int y, int f)
@@ -93,16 +91,34 @@ WWPalette WWScreen_SetPalette(WWScreen s, int x, int y, WWPalette palette)
 WWCharacter WWScreen_SetCharacter(WWScreen s, int x, int y, WWCharacter c)
 { return (WWScreen_GetScreenCharacter(s, x, y)->character = c); }
 
+int WWScreen_GetNumber(WWScreen s) { return (s->number); }
 int WWScreen_GetWidth( WWScreen s) { return (s->width ); }
 int WWScreen_GetHeight(WWScreen s) { return (s->height); }
 int WWScreen_GetRollX( WWScreen s) { return (s->roll_x); }
 int WWScreen_GetRollY( WWScreen s) { return (s->roll_y); }
 
+int WWScreen_GetEnable(WWScreen s) { return (s->enable); }
+int WWScreen_GetMode(  WWScreen s) { return (s->mode  ); }
+
+int WWScreen_GetDrawX(     WWScreen s) { return (s->draw_x     ); }
+int WWScreen_GetDrawY(     WWScreen s) { return (s->draw_y     ); }
+int WWScreen_GetDrawWidth( WWScreen s) { return (s->draw_width ); }
+int WWScreen_GetDrawHeight(WWScreen s) { return (s->draw_height); }
+
+int WWScreen_SetNumber(WWScreen s, int n) { return (s->number = n); }
 int WWScreen_SetWidth( WWScreen s, int n) { return (s->width  = n); }
 int WWScreen_SetHeight(WWScreen s, int n) { return (s->height = n); }
 int WWScreen_SetRollX( WWScreen s, int r) { return (s->roll_x = r); }
 int WWScreen_SetRollY( WWScreen s, int r) { return (s->roll_y = r); }
 
+int WWScreen_SetEnable(WWScreen s, int n) { return (s->enable = n); }
+int WWScreen_SetMode(  WWScreen s, int n) { return (s->mode   = n); }
+
+int WWScreen_SetDrawX(     WWScreen s, int n) { return (s->draw_x      = n); }
+int WWScreen_SetDrawY(     WWScreen s, int n) { return (s->draw_y      = n); }
+int WWScreen_SetDrawWidth( WWScreen s, int n) { return (s->draw_width  = n); }
+int WWScreen_SetDrawHeight(WWScreen s, int n) { return (s->draw_height = n); }
+
 /* カラーマップの色(0~7)を返す(透明色は-1を返す) */
 int WWScreen_GetPixel(WWScreen screen, int x, int y)
 {
@@ -133,9 +149,12 @@ int WWScreen_GetPixel(WWScreen screen, int x, int y)
   return (pixel);
 }
 
-WWScreen WWScreen_Create(int number, int width, int height,
+WWScreen WWScreen_Create(int number,
+			 int width, int height,
 			 WWPalette initial_palette,
-			 WWCharacter initial_character)
+			 WWCharacter initial_character,
+			 int draw_x, int draw_y,
+			 int draw_width, int draw_height)
 {
   WWScreen screen;
   WWScreenCharacter sc;
@@ -150,6 +169,14 @@ WWScreen WWScreen_Create(int number, int width, int height,
   WWScreen_SetRollX( screen, 0);
   WWScreen_SetRollY( screen, 0);
 
+  WWScreen_SetEnable(screen, 1);
+  WWScreen_SetMode(  screen, WWSCREEN_DRAW_ALL);
+
+  WWScreen_SetDrawX( screen, draw_x);
+  WWScreen_SetDrawY( screen, draw_y);
+  WWScreen_SetDrawWidth( screen, draw_width);
+  WWScreen_SetDrawHeight(screen, draw_height);
+
   screen->screen_characters =
     (WWScreenCharacter *)malloc(sizeof(WWScreenCharacter) *
 				screen->width * screen->height);

+ 31 - 4
WWScreen.h

@@ -16,37 +16,64 @@
 
 typedef struct _WWScreen * WWScreen;
 
+/*****************************************************************************/
+/* 定数の定義                                                                */
+/*****************************************************************************/
+
+#define WWSCREEN_DRAW_ALL     0
+#define WWSCREEN_INSIDE_ONLY  1
+#define WWSCREEN_OUTSIDE_ONLY 2
+
 /*****************************************************************************/
 /* メンバ関数の宣言                                                          */
 /*****************************************************************************/
 
-int WWScreen_GetNumber(WWScreen s);
 int WWScreen_GetHorizontal(WWScreen s, int x, int y);
 int WWScreen_GetVertical(WWScreen s, int x, int y);
 WWPalette WWScreen_GetPalette(WWScreen s, int x, int y);
 WWCharacter WWScreen_GetCharacter(WWScreen s, int x, int y);
 
-int WWScreen_SetNumber(WWScreen s, int n);
 int WWScreen_SetHorizontal(WWScreen s, int x, int y, int f);
 int WWScreen_SetVertical(WWScreen s, int x, int y, int f);
 WWPalette WWScreen_SetPalette(WWScreen s, int x, int y, WWPalette palette);
 WWCharacter WWScreen_SetCharacter(WWScreen s, int x, int y, WWCharacter c);
 
+int WWScreen_GetNumber(WWScreen s);
 int WWScreen_GetWidth( WWScreen s);
 int WWScreen_GetHeight(WWScreen s);
 int WWScreen_GetRollX( WWScreen s);
 int WWScreen_GetRollY( WWScreen s);
 
+int WWScreen_GetEnable(WWScreen s);
+int WWScreen_GetMode(  WWScreen s);
+
+int WWScreen_GetDrawX(     WWScreen s);
+int WWScreen_GetDrawY(     WWScreen s);
+int WWScreen_GetDrawWidth( WWScreen s);
+int WWScreen_GetDrawHeight(WWScreen s);
+
+int WWScreen_SetNumber(WWScreen s, int n);
 int WWScreen_SetWidth( WWScreen s, int n);
 int WWScreen_SetHeight(WWScreen s, int n);
 int WWScreen_SetRollX( WWScreen s, int r);
 int WWScreen_SetRollY( WWScreen s, int r);
 
+int WWScreen_SetEnable(WWScreen s, int n);
+int WWScreen_SetMode(  WWScreen s, int n);
+
+int WWScreen_SetDrawX(     WWScreen s, int n);
+int WWScreen_SetDrawY(     WWScreen s, int n);
+int WWScreen_SetDrawWidth( WWScreen s, int n);
+int WWScreen_SetDrawHeight(WWScreen s, int n);
+
 int WWScreen_GetPixel(WWScreen screen, int x, int y);
 
-WWScreen WWScreen_Create(int number, int width, int height,
+WWScreen WWScreen_Create(int number,
+			 int width, int height,
 			 WWPalette initial_palette,
-			 WWCharacter initial_character);
+			 WWCharacter initial_character,
+			 int draw_x, int draw_y,
+			 int draw_width, int draw_height);
 WWScreen WWScreen_Destroy(WWScreen screen);
 
 /*****************************************************************************/

+ 12 - 0
WWScreenP.h

@@ -27,7 +27,19 @@ typedef struct _WWScreen {
   int height;
   int roll_x;
   int roll_y;
+
   WWScreenCharacter * screen_characters;
+
+  int enable; /* 表示/非表示のフラグ */
+
+  int mode; /* 表示モード */
+  /* WWSCREEN_DRAW_ALL, WWSCREEN_INSIDE_ONLY, WWSCREEN_OUTSIDE_ONLY の */
+  /* いずれかの値を取る                                                */
+
+  /* 表示領域(スクリーン2のウインドウ機能用.スクリーン1では未使用) */
+  int draw_x, draw_y;
+  int draw_width, draw_height;
+
 } _WWScreen;
 
 /*****************************************************************************/

+ 60 - 26
disp.c

@@ -17,31 +17,32 @@
 
 void display_control(unsigned int flags)
 {
+  WWDisplay ww_display;
+
   printf("display_control(): flags = %ud, ", flags); fflush(stdout);
 
   if (wonx_display == NULL) Wonx_Create();
 
-  WWDisplay_SetScreenEnable(WonxDisplay_GetWWDisplay(wonx_display),
-			    SCREEN1,
-			    (flags & DCM_SCR1) ? 1 : 0);
+  ww_display = WonxDisplay_GetWWDisplay(wonx_display);
+
+  WWScreen_SetEnable(WWDisplay_GetScreen(ww_display, SCREEN1),
+		     (flags & DCM_SCR1) ? 1 : 0);
 
-  WWDisplay_SetScreenEnable(WonxDisplay_GetWWDisplay(wonx_display),
-			    SCREEN2,
-			    (flags & DCM_SCR2) ? 1 : 0);
+  WWScreen_SetEnable(WWDisplay_GetScreen(ww_display, SCREEN2),
+		     (flags & DCM_SCR2) ? 1 : 0);
 
-  WWDisplay_SetSpriteEnable(WonxDisplay_GetWWDisplay(wonx_display),
-			    (flags & DCM_SPR) ? 1 : 0);
+  WWDisplay_SetSpriteEnable(ww_display, (flags & DCM_SPR) ? 1 : 0);
 
-  WWDisplay_SetSpriteWindowEnable(WonxDisplay_GetWWDisplay(wonx_display),
-				  (flags & DCM_SPR_WIN) ? 1 : 0);
+  WWDisplay_SetSpriteWindowEnable(ww_display, (flags & DCM_SPR_WIN) ? 1 : 0);
 
   if      ((flags & 0x0030) == DCM_SCR2_WIN_INSIDE)
-    WWDisplay_SetScreen2WindowMode(WonxDisplay_GetWWDisplay(wonx_display), 2);
+    WWScreen_SetMode(WWDisplay_GetScreen(ww_display, SCREEN2),
+		     WWSCREEN_INSIDE_ONLY);
   else if ((flags & 0x0030) == DCM_SCR2_WIN_OUTSIDE)
-    WWDisplay_SetScreen2WindowMode(WonxDisplay_GetWWDisplay(wonx_display), 3);
+    WWScreen_SetMode(WWDisplay_GetScreen(ww_display, SCREEN2),
+		     WWSCREEN_OUTSIDE_ONLY);
 
-  WWDisplay_SetBorder(WonxDisplay_GetWWDisplay(wonx_display),
-		      (flags & DCM_BORDER_COLOR) >> 7);
+  WWDisplay_SetBorder(ww_display, (flags & DCM_BORDER_COLOR) >> 7);
 
   WonxDisplay_Flush(wonx_display);
 
@@ -52,20 +53,21 @@ void display_control(unsigned int flags)
 
 unsigned int display_status()
 {
+  WWDisplay ww_display;
   unsigned short int ret;
 
   printf("display_status(): "); fflush(stdout);
 
   if (wonx_display == NULL) Wonx_Create();
 
+  ww_display = WonxDisplay_GetWWDisplay(wonx_display);
+
   ret = 0;
 
-  if (WWDisplay_GetScreenEnable(WonxDisplay_GetWWDisplay(wonx_display),
-				SCREEN1))
+  if (WWScreen_GetEnable(WWDisplay_GetScreen(ww_display, SCREEN1)))
     ret |= DCM_SCR1;
 
-  if (WWDisplay_GetScreenEnable(WonxDisplay_GetWWDisplay(wonx_display),
-				SCREEN2))
+  if (WWScreen_GetEnable(WWDisplay_GetScreen(ww_display, SCREEN2)))
     ret |= DCM_SCR2;
 
   if (WWDisplay_GetSpriteEnable(WonxDisplay_GetWWDisplay(wonx_display)))
@@ -74,12 +76,11 @@ unsigned int display_status()
   if (WWDisplay_GetSpriteWindowEnable(WonxDisplay_GetWWDisplay(wonx_display)))
     ret |= DCM_SPR_WIN;
 
-  switch
-    (WWDisplay_GetScreen2WindowMode(WonxDisplay_GetWWDisplay(wonx_display))) {
-    case 2:
+  switch (WWScreen_GetMode(WWDisplay_GetScreen(ww_display, SCREEN2))) {
+    case WWSCREEN_INSIDE_ONLY:
       ret |= DCM_SCR2_WIN_INSIDE;
       break;
-    case 3:
+    case WWSCREEN_OUTSIDE_ONLY:
       ret |= DCM_SCR2_WIN_OUTSIDE;
       break;
     default:
@@ -94,8 +95,7 @@ unsigned int display_status()
   return (ret);
 }
 
-void font_set_monodata(unsigned int number,
-		       unsigned int count, void * data)
+void font_set_monodata(unsigned int number, unsigned int count, void * data)
 {
   WWCharacter c;
   int i, x, y, n, p;
@@ -669,18 +669,52 @@ unsigned int screen_get_scroll(int screen)
 
 void screen2_set_window(int x, int y, int w, int h)
 {
+  WWScreen s;
+
+  printf("screen2_set_window(): x = %d, y = %d, width = %d, height = %d, ",
+	 x, y, w, h); fflush(stdout);
+
   if (wonx_display == NULL) Wonx_Create();
-  /* あとで書くこと */
+
+  s = WWDisplay_GetScreen(WonxDisplay_GetWWDisplay(wonx_display), SCREEN2);
+  WWScreen_SetDrawX(s, x);
+  WWScreen_SetDrawY(s, y);
+  WWScreen_SetDrawWidth( s, w);
+  WWScreen_SetDrawHeight(s, h);
 
   WonxDisplay_Flush(wonx_display);
+
+  printf("return value = none\n"); fflush(stdout);
+
+  return;
 }
 
 unsigned long int screen2_get_window(void)
 {
+  WWScreen s;
+  unsigned short int xy;
+  unsigned short int wh;
+  unsigned long int ret;
+
   if (wonx_display == NULL) Wonx_Create();
-  /* あとで書くこと */
+
+  printf("screen2_get_window(): "); fflush(stdout);
+
+  s = WWDisplay_GetScreen(WonxDisplay_GetWWDisplay(wonx_display), SCREEN2);
+  
+  xy =
+    ((WWScreen_GetDrawY(s) << 8) & 0xff00) |
+    (WWScreen_GetDrawX(s) & 0x00ff);
+  wh =
+    ((WWScreen_GetDrawHeight(s) << 8) & 0xff00) |
+    (WWScreen_GetDrawWidth(s) & 0x00ff);
+  ret = ((unsigned long int)wh) << 16 | xy;
 
   WonxDisplay_Flush(wonx_display);
+
+  printf("return value = %ul\n", ret); fflush(stdout);
+
+  return (ret);
 }
 
 void sprite_set_window(int x, int y, int w, int h)