Set FP_OFF (), FP_SEG() for the callback function at interrupt setting in WonderWitch
Adjust appropriately according to the setting method. (Fit to wwterm)
UNIXTimer.c: UNIXTimer_Unpause()
((unix_timer -> pause == 1) && (unix_timer -> interrupt_in_pause == 0))
Fixed a bug that was not unix_timer-> pause--; when it was.
(It was not unposted when interrupt was not applied during pause)
Serial receive interrupt, keyboard interrupt added. (corresponding to wwterm, operation confirmed)
Added UNIXSerialPort class.
With this, at WonderWitch,
com_intvector.callback = (void (near *) ()) FP_OFF (com_handler);
com_intvector.cs = _ asm_inline ("\tmov \tax, cs");
com_intvector.ds = _ asm_inline ("\tmov \tax, ds");
sys_interrupt_set_hook (SYS_INT_RECEIVEREADY,
& com_intvector, & com_last_intvector);
Interrupt setting like that shown in Fig.
For warning, add WonX_Warning ().
Move WonX_Error () to WonX.c.
comm_send_string (), text_put_string (), text_put_substring () When executed
Fix output message.
Implement cursor display function. (Add WWCursor class) (Do not blink. Display only)
When displaying the cursor, text information inside WWDisplay_DrawLCDPanel ()
Since we need to be able to read it, we will discontinue the WonXText class and add the WWText class
I moved to a member of the WWDisplay class.
In palette_get_color (), transparent color is displayed when executing WWPalette_GetMappedColors ()
Since it was not considered to be returned as -1, palette_get_color ()
Fixed a bug where return value was wrong value.
Character color palette, LCD color palette initial value, with WonderWitch
It was made to coincide with the initial value.
As a sample, add wwterm - b 05. (Add wwterm target to Makefile)
Version 1.1 - from wonx-1.1.tar.gz
273 lines
9.2 KiB
C
273 lines
9.2 KiB
C
/*****************************************************************************/
|
||
/* ここから */
|
||
/*****************************************************************************/
|
||
|
||
#include "WWScreenP.h"
|
||
#include "WonX.h"
|
||
|
||
/*****************************************************************************/
|
||
/* メンバ関数の定義 */
|
||
/*****************************************************************************/
|
||
|
||
/*===========================================================================*/
|
||
/* プライベートなもの */
|
||
/*===========================================================================*/
|
||
|
||
static int WWScreenCharacter_GetHorizontal(WWScreenCharacter sc)
|
||
{ return (sc->horizontal); }
|
||
static int WWScreenCharacter_GetVertical(WWScreenCharacter sc)
|
||
{ return (sc->vertical); }
|
||
static WWPalette WWScreenCharacter_GetPalette(WWScreenCharacter sc)
|
||
{ return (sc->palette); }
|
||
static WWCharacter WWScreenCharacter_GetCharacter(WWScreenCharacter sc)
|
||
{ return (sc->character); }
|
||
|
||
static int WWScreenCharacter_SetHorizontal(WWScreenCharacter sc, int f)
|
||
{ return (sc->horizontal = f); }
|
||
static int WWScreenCharacter_SetVertical(WWScreenCharacter sc, int f)
|
||
{ return (sc->vertical = f); }
|
||
static WWPalette WWScreenCharacter_SetPalette(WWScreenCharacter sc,
|
||
WWPalette palette)
|
||
{ return (sc->palette = palette); }
|
||
static WWCharacter WWScreenCharacter_SetCharacter(WWScreenCharacter sc,
|
||
WWCharacter c)
|
||
{ return (sc->character = c); }
|
||
|
||
static WWScreenCharacter WWScreenCharacter_Create(int horizontal, int vertical,
|
||
WWPalette palette,
|
||
WWCharacter character)
|
||
{
|
||
WWScreenCharacter screen_character;
|
||
|
||
screen_character = (WWScreenCharacter)malloc(sizeof(_WWScreenCharacter));
|
||
if (screen_character == NULL)
|
||
WonX_Error("WWScreenCharacter", "Cannot allocate memory.");
|
||
|
||
WWScreenCharacter_SetHorizontal(screen_character, horizontal);
|
||
WWScreenCharacter_SetVertical(screen_character, vertical);
|
||
WWScreenCharacter_SetPalette(screen_character, palette);
|
||
WWScreenCharacter_SetCharacter(screen_character, character);
|
||
|
||
return (screen_character);
|
||
}
|
||
|
||
static WWScreenCharacter WWScreenCharacter_Destroy(WWScreenCharacter
|
||
screen_character)
|
||
{
|
||
if (screen_character == NULL) return (NULL);
|
||
free(screen_character);
|
||
return (NULL);
|
||
}
|
||
|
||
static WWScreenCharacter WWScreen_GetScreenCharacter(WWScreen s, int x, int y)
|
||
{
|
||
return (s->screen_characters[y * WWScreen_GetWidth(s) + x]);
|
||
}
|
||
|
||
static WWScreenCharacter WWScreen_SetScreenCharacter(WWScreen s, int x, int y,
|
||
WWScreenCharacter sc)
|
||
{
|
||
return (s->screen_characters[y * WWScreen_GetWidth(s) + x] = sc);
|
||
}
|
||
|
||
/*===========================================================================*/
|
||
/* パブリックなもの */
|
||
/*===========================================================================*/
|
||
|
||
int WWScreen_GetHorizontal(WWScreen s, int x, int y)
|
||
{
|
||
WWScreenCharacter sc;
|
||
sc = WWScreen_GetScreenCharacter(s, x, y);
|
||
return (WWScreenCharacter_GetHorizontal(sc));
|
||
}
|
||
|
||
int WWScreen_GetVertical(WWScreen s, int x, int y)
|
||
{
|
||
WWScreenCharacter sc;
|
||
sc = WWScreen_GetScreenCharacter(s, x, y);
|
||
return (WWScreenCharacter_GetVertical(sc));
|
||
}
|
||
|
||
WWPalette WWScreen_GetPalette(WWScreen s, int x, int y)
|
||
{
|
||
WWScreenCharacter sc;
|
||
sc = WWScreen_GetScreenCharacter(s, x, y);
|
||
return (WWScreenCharacter_GetPalette(sc));
|
||
}
|
||
|
||
WWCharacter WWScreen_GetCharacter(WWScreen s, int x, int y)
|
||
{
|
||
WWScreenCharacter sc;
|
||
sc = WWScreen_GetScreenCharacter(s, x, y);
|
||
return (WWScreenCharacter_GetCharacter(sc));
|
||
}
|
||
|
||
int WWScreen_SetHorizontal(WWScreen s, int x, int y, int f)
|
||
{
|
||
WWScreenCharacter sc;
|
||
sc = WWScreen_GetScreenCharacter(s, x, y);
|
||
return (WWScreenCharacter_SetHorizontal(sc, f));
|
||
}
|
||
|
||
int WWScreen_SetVertical(WWScreen s, int x, int y, int f)
|
||
{
|
||
WWScreenCharacter sc;
|
||
sc = WWScreen_GetScreenCharacter(s, x, y);
|
||
return (WWScreenCharacter_SetVertical(sc, f));
|
||
}
|
||
|
||
WWPalette WWScreen_SetPalette(WWScreen s, int x, int y, WWPalette palette)
|
||
{
|
||
WWScreenCharacter sc;
|
||
sc = WWScreen_GetScreenCharacter(s, x, y);
|
||
return (WWScreenCharacter_SetPalette(sc, palette));
|
||
}
|
||
|
||
WWCharacter WWScreen_SetCharacter(WWScreen s, int x, int y, WWCharacter c)
|
||
{
|
||
WWScreenCharacter sc;
|
||
sc = WWScreen_GetScreenCharacter(s, x, y);
|
||
return (WWScreenCharacter_SetCharacter(sc, 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, WWCursor cursor)
|
||
{
|
||
int cx, cy, px, py;
|
||
int pixel;
|
||
WWCharacter character;
|
||
WWPalette palette;
|
||
|
||
/* x,y 座標が範囲外のときは,ロールオーバーする */
|
||
/* (スクリーンの端と端は,つながっている) */
|
||
while (x < 0) x += WWScreen_GetWidth( screen) * 8;
|
||
while (y < 0) y += WWScreen_GetHeight(screen) * 8;
|
||
x = x % (WWScreen_GetWidth( screen) * 8);
|
||
y = y % (WWScreen_GetHeight(screen) * 8);
|
||
|
||
cx = x / 8; cy = y / 8;
|
||
px = x % 8; py = y % 8;
|
||
|
||
if (WWScreen_GetHorizontal(screen, cx, cy)) px = 7 - px;
|
||
if (WWScreen_GetVertical( screen, cx, cy)) py = 7 - py;
|
||
|
||
character = WWScreen_GetCharacter(screen, cx, cy);
|
||
|
||
/* カーソル表示の処理 */
|
||
palette = WWScreen_GetPalette(screen, cx, cy);
|
||
if (cursor != NULL) {
|
||
if ( WWCursor_IsON(cursor) &&
|
||
(cx >= WWCursor_GetX(cursor)) &&
|
||
(cx <= WWCursor_GetX(cursor) + WWCursor_GetWidth( cursor) - 1) &&
|
||
(cy >= WWCursor_GetY(cursor)) &&
|
||
(cy <= WWCursor_GetY(cursor) + WWCursor_GetHeight(cursor) - 1) ) {
|
||
palette = WWCursor_GetPalette(cursor);
|
||
}
|
||
}
|
||
|
||
pixel = WWCharacter_GetPixel(character, px, py);
|
||
pixel = WWPalette_GetMappedColor(palette, pixel); /*透明色は-1が返ってくる*/
|
||
|
||
return (pixel);
|
||
}
|
||
|
||
WWScreen WWScreen_Create(int number,
|
||
int width, int height,
|
||
WWPalette initial_palette,
|
||
WWCharacter initial_character,
|
||
int draw_x, int draw_y,
|
||
int draw_width, int draw_height)
|
||
{
|
||
WWScreen screen;
|
||
WWScreenCharacter sc;
|
||
int x, y;
|
||
|
||
screen = (WWScreen)malloc(sizeof(_WWScreen));
|
||
if (screen == NULL)
|
||
WonX_Error("WWScreen_Create", "Cannot allocate memory.");
|
||
|
||
WWScreen_SetNumber(screen, number);
|
||
WWScreen_SetWidth( screen, width);
|
||
WWScreen_SetHeight(screen, height);
|
||
WWScreen_SetRollX( screen, 0);
|
||
WWScreen_SetRollY( screen, 0);
|
||
|
||
WWScreen_SetEnable(screen, 1);
|
||
WWScreen_SetMode( screen, WW_SCREEN_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);
|
||
|
||
for (y = 0; y < screen->height; y++) {
|
||
for (x = 0; x < screen->width; x++) {
|
||
sc = WWScreenCharacter_Create(0, 0, initial_palette, initial_character);
|
||
WWScreen_SetScreenCharacter(screen, x, y, sc);
|
||
}
|
||
}
|
||
|
||
return (screen);
|
||
}
|
||
|
||
WWScreen WWScreen_Destroy(WWScreen screen)
|
||
{
|
||
int x, y;
|
||
WWScreenCharacter sc;
|
||
|
||
if (screen == NULL) return (NULL);
|
||
|
||
for (y = 0; y < screen->height; y++) {
|
||
for (x = 0; x < screen->width; x++) {
|
||
sc = WWScreen_GetScreenCharacter(screen, x, y);
|
||
WWScreen_SetScreenCharacter(screen, x, y, WWScreenCharacter_Destroy(sc));
|
||
}
|
||
}
|
||
|
||
if (screen->screen_characters) free(screen->screen_characters);
|
||
|
||
free(screen);
|
||
|
||
return (NULL);
|
||
}
|
||
|
||
/*****************************************************************************/
|
||
/* ここまで */
|
||
/*****************************************************************************/
|
||
|
||
/*****************************************************************************/
|
||
/* End of File. */
|
||
/*****************************************************************************/
|