home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 2
/
FreeSoftwareCollection2pd199x-jp.img
/
oakfep
/
cons.c
next >
Wrap
Text File
|
1990-06-14
|
10KB
|
449 lines
/******************************
* Consol Low I/O *
******************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <ctype.h>
#include <egb.h>
#include <fmc.h>
#include "oaklib.h"
extern char work[];
#define PIX_BYTE 1 /* 画面モ-ドにより変化 16色=1 256色=1 32K色=2 */
#define TOP_X wp->top_x
#define TOP_Y wp->top_y
#define BTM_X wp->btm_x
#define BTM_Y wp->btm_y
#define SIZ_X wp->siz_x
#define SIZ_Y wp->siz_y
#define CUR_X wp->cur_x
#define CUR_Y wp->cur_y
#define CHR_COL wp->chr_col
#define CHR_BAK wp->chr_bak
#define CUR_COL wp->cur_col
#define BAK_COL wp->bak_col
#define FNT_X wp->fnt_x
#define FNT_Y wp->fnt_y
#define FNT_STL wp->fnt_stl
#define KAN_COD wp->kan_cod
#define DSP_X wp->dsp.x
#define DSP_Y wp->dsp.y
#define DSP_LEN wp->dsp.len
#define DSP_BUF wp->dsp.buf
typedef struct _WP {
struct _WP *next;
short top_x,top_y;
short btm_x,btm_y;
short siz_x,siz_y;
short cur_x,cur_y;
int chr_col,chr_bak;
int cur_col,bak_col;
short fnt_x,fnt_y,fnt_stl;
short kan_cod;
struct {
short x,y;
short len;
char buf[256];
} dsp;
} WIND;
WIND *act_wind=NULL;
static int bch=0;
static unsigned bec=0;
int kbhit(void)
{
if ( bch != 0xFFFF ||
(bch = KAN_read(1,&bec)) != 0xFFFF )
return 1;
else
return 0;
}
int getch(void)
{
int ch;
while ( kbhit() == 0 );
ch = bch; bch = 0xFFFF;
return ch;
}
void cur_dsp(sw)
int sw;
{
register WIND *wp=act_wind;
char para[8];
EGB_paintMode(work,0x02);
EGB_color(work,0,sw == 0 ? CUR_COL:CHR_BAK);
WORD(para+0) = DSP_X;
WORD(para+2) = DSP_Y + 1;
WORD(para+4) = DSP_X + FNT_X - 1;
WORD(para+6) = DSP_Y + 1;
EGB_rectangle(work,para);
}
void chr_bak(void)
{
register WIND *wp=act_wind;
char para[8];
if ( DSP_LEN <= 0 )
return;
EGB_paintMode(work,0x22);
EGB_color(work,0,CHR_BAK);
EGB_color(work,2,CHR_BAK);
WORD(para+0) = DSP_X;
WORD(para+2) = DSP_Y;
WORD(para+4) = DSP_X + FNT_X * DSP_LEN + ((FNT_STL & 2) ? 2:-1);
WORD(para+6) = DSP_Y - (FNT_Y - 2);
EGB_rectangle(work,para);
}
void cflush(void)
{
register WIND *wp=act_wind;
cur_dsp(1);
chr_bak();
EGB_color(work,0,CHR_COL);
EGB_textSpace(work,FNT_X - 8);
EGB_fontStyle(work,FNT_STL);
EGB_sjisString(work,(char *)&(wp->dsp));
DSP_X = CUR_X * FNT_X + TOP_X;
DSP_Y = CUR_Y * FNT_Y + TOP_Y + (FNT_Y - 2);
DSP_LEN = 0;
cur_dsp(0);
}
WIND *wind(int x1,int y1,int x2,int y2,
int col,int bak,int cur,
int fx,int fy,int stl)
{
register WIND *wp;
char para[8];
if ( (wp = (WIND *)malloc(sizeof(WIND))) == NULL )
return NULL;
wp->next = act_wind;
act_wind = wp;
EGB_paintMode(work,0x22);
EGB_color(work,0,col);
EGB_color(work,2,bak);
WORD(para+0) = x1;
WORD(para+2) = y1;
WORD(para+4) = x2;
WORD(para+6) = y2;
EGB_rectangle(work,para);
x1 += 2; y1 += 2; x2 -= 2; y2 -= 2;
TOP_X = x1;
TOP_Y = y1;
BTM_X = x2;
BTM_Y = y2;
FNT_X = fx;
FNT_Y = fy;
FNT_STL = stl;
SIZ_X = (x2 - x1 + ((stl & 2) ? -2:1)) / FNT_X;
SIZ_Y = (y2 - y1 + 1) / FNT_Y;
CUR_X = 0; CUR_Y = 0;
CHR_COL = col;
CHR_BAK = BAK_COL = bak;
CUR_COL = cur;
KAN_COD = 0;
DSP_X = TOP_X;
DSP_Y = TOP_Y + (FNT_Y - 2);
DSP_LEN = 0;
cur_dsp(0);
return wp;
}
void locate(int x,int y)
{
register WIND *wp=act_wind;
if ( (CUR_X = x) >= SIZ_X )
CUR_X = SIZ_X - 1;
if ( (CUR_Y = y) >= SIZ_Y )
CUR_Y = SIZ_Y - 1;
cflush();
}
void color(int col)
{
register WIND *wp=act_wind;
CHR_COL = col;
}
void rollup()
{
register WIND *wp=act_wind;
cur_dsp(1);
chr_bak();
EGB_color(work,0,CHR_COL);
EGB_textSpace(work,FNT_X - 8);
EGB_fontStyle(work,FNT_STL);
EGB_sjisString(work,(char *)&(wp->dsp));
DSP_X = CUR_X * FNT_X + TOP_X;
DSP_Y = CUR_Y * FNT_Y + TOP_Y + (FNT_Y - 2);
DSP_LEN = 0;
EGB_color(work,1,BAK_COL);
EGB_partScroll(work,1,0,-FNT_Y,(char *)&(TOP_X));
cur_dsp(0);
}
void chr_out(unsigned char ch)
{
register WIND *wp=act_wind;
DSP_BUF[DSP_LEN++] = ch;
if ( ++CUR_X >= SIZ_X ) {
CUR_X = 0;
if ( ++CUR_Y >= SIZ_Y ) {
CUR_Y = SIZ_Y - 1;
rollup();
} else
cflush();
}
}
void put_put(unsigned char ch)
{
register WIND *wp=act_wind;
if ( KAN_COD != 0 ) {
if ( iskanji2(ch) ) {
if ( CUR_X == (SIZ_X - 1) )
chr_out(' ');
chr_out(KAN_COD);
chr_out(ch);
KAN_COD = 0;
return;
}
KAN_COD = 0;
}
if ( iskanji(ch) ) {
KAN_COD = ch;
return;
}
if ( ch >= ' ' ) {
chr_out(ch);
return;
}
switch(ch) {
case 0x08:
if ( --CUR_X < 0 ) {
CUR_X = SIZ_X - 1;
if ( --CUR_Y < 0 )
CUR_Y = 0;
}
cflush();
break;
case 0x0D:
CUR_X = 0;
cflush();
break;
case 0x0A:
if ( ++CUR_Y >= SIZ_Y ) {
CUR_Y = SIZ_Y - 1;
rollup();
} else
cflush();
break;
}
}
void putch(unsigned char ch)
{
if ( ch == 0x0A )
put_put(0x0D);
put_put(ch);
if ( ch == 0x0D )
put_put(0x0A);
}
void cputs(char *str)
{
while ( *str != '\0' )
putch((unsigned char )*(str++));
}
void cprintf(char *form,...)
{
va_list arg;
char tmp[256];
va_start(arg,form);
vsprintf(tmp,form,arg);
cputs(tmp);
va_end(arg);
}
/*********** 32K
static unsigned int dmy_pal[]={
0x00007FFF,0x000c7FFF,0x01807FFF,0x018c7FFF,
0x30007FFF,0x300c7FFF,0x31807FFF,0x318c7FFF,
0x42107FFF,0x00187FFF,0x03007FFF,0x03187FFF,
0x60007FFF,0x60187FFF,0x63007FFF,0x63187FFF };
************/
static unsigned int dmy_pal[]={
0x0000000F,0x0001000F,0x0002000F,0x0003000F,
0x0004000F,0x0005000F,0x0006000F,0x0007000F,
0x0008000F,0x0009000F,0x000A000F,0x000B000F,
0x000C000F,0x000D000F,0x000E000F,0x000F000F };
void putstr(int pos,int len,char *str,char *att)
{
static int bak_len=0;
static char *bak_buf[128];
register WIND *wp=act_wind;
int i,x,y,n,m;
char *p;
char para[16];
for ( i = 0 ; i < bak_len ; i++ ) {
EGB_putBlock(work,0,bak_buf[i]);
free(bak_buf[i]);
}
cflush();
bak_len = 0;
x = CUR_X; y = CUR_Y;
if ( (m = len) > 0 && len == pos )
m++;
for ( i = 0 ; i < m ; i += n ) {
n = ((i < len && iskanji((unsigned char)*str)) ? 2:1);
if ( (x + n) > SIZ_X ) {
x = 0;
y++;
}
if ( (p = (char *)malloc(FNT_X * FNT_Y * n * PIX_BYTE + 14)) == NULL )
break;
DWORD(p+0) = (unsigned int)(p+14);
WORD(p+4) = 0x014; /* Data Selecter */
WORD(p+6) = TOP_X + x * FNT_X;
WORD(p+8) = TOP_Y + y * FNT_Y;
WORD(p+10) = WORD(p+6) + n * FNT_X - 1;
WORD(p+12) = WORD(p+8) + FNT_Y - 1;
EGB_getBlock(work,p);
bak_buf[bak_len++] = p;
if ( i < len ) {
EGB_paintMode(work,0x22);
EGB_color(work,0,dmy_pal[*att]>>16);
EGB_color(work,2,dmy_pal[*att]>>16);
WORD(para+0) = WORD(p+6);
WORD(para+2) = WORD(p+8);
WORD(para+4) = WORD(p+10);
WORD(para+6) = WORD(p+12);
EGB_rectangle(work,para);
EGB_color(work,0,dmy_pal[*att]&0xFFFF);
EGB_textSpace(work,FNT_X - 8);
EGB_fontStyle(work,FNT_STL);
WORD(para+0) = WORD(p+6);
WORD(para+2) = WORD(p+8) + (FNT_Y - 2);
WORD(para+4) = n;
*(para+6) = *str;
*(para+7) = *(str+1);
EGB_sjisString(work,para);
str += n;
att += n;
}
if ( i == pos ) {
EGB_color(work,0,CUR_COL);
WORD(para+0) = WORD(p+6);
WORD(para+2) = WORD(p+12);
WORD(para+4) = WORD(p+10);
WORD(para+6) = WORD(p+12);
EGB_rectangle(work,para);
}
if ( (x += n) >= SIZ_X ) {
x = 0;
y++;
}
}
}
void putsys(int len,char *str,char *att)
{
static int bak_len=0;
static char *bak_buf;
register WIND *wp=act_wind;
int i,x,y,n;
char *p;
char para[16];
if ( bak_len > 0 ) {
EGB_putBlock(work,0,bak_buf);
free(bak_buf);
}
bak_len = 0;
if ( len == 0 )
return;
if ( (p = bak_buf =
(char *)malloc(FNT_X * FNT_Y * len * PIX_BYTE + 14)) == NULL )
return;
DWORD(p+0) = (unsigned int)(p+14);
WORD(p+4) = 0x014; /* Data Selecter */
WORD(p+6) = x = TOP_X;
WORD(p+8) = y = BTM_Y + 8;
WORD(p+10) = x + len * FNT_X - 1;
WORD(p+12) = y + FNT_Y - 1;
EGB_getBlock(work,p);
bak_len = len;
for ( i = 0 ; i < len ; i += n ) {
n = (iskanji((unsigned char)*str) ? 2:1);
EGB_paintMode(work,0x22);
EGB_color(work,0,dmy_pal[*att]>>16);
EGB_color(work,2,dmy_pal[*att]>>16);
WORD(para+0) = x;
WORD(para+2) = y;
WORD(para+4) = x + n * FNT_X - 1;
WORD(para+6) = y + FNT_Y - 1;
EGB_rectangle(work,para);
EGB_color(work,0,dmy_pal[*att]&0xFFFF);
EGB_textSpace(work,FNT_X - 8);
EGB_fontStyle(work,FNT_STL);
WORD(para+0) = x;
WORD(para+2) = y + (FNT_Y - 2);
WORD(para+4) = n;
*(para+6) = *str;
*(para+7) = *(str+1);
EGB_sjisString(work,para);
str += n;
att += n;
x += (FNT_X * n);
}
}
void putmode(int md,int sf,char *str)
{
register WIND *wp=act_wind;
char para[40];
EGB_paintMode(work,0x22);
EGB_color(work,0,CHR_COL);
EGB_color(work,2,BAK_COL);
WORD(para+0) = BTM_X - 74;
WORD(para+2) = BTM_Y + 8;
WORD(para+4) = BTM_X + 1;
WORD(para+6) = BTM_Y + 8 + 19;
EGB_rectangle(work,para);
strcpy(para+6,str);
EGB_color(work,0,CHR_COL);
EGB_textSpace(work,0);
EGB_fontStyle(work,0);
WORD(para+0) = BTM_X - 72;
WORD(para+2) = BTM_Y + 8 + 17;
WORD(para+4) = 9;
EGB_sjisString(work,para);
}