home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 2
/
FreeSoftwareCollection2pd199x-jp.img
/
oricon
/
src
/
consol.c
< prev
next >
Wrap
Text File
|
1990-06-14
|
11KB
|
500 lines
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define TRUE 1
#define FALSE 0
#define ERR (-1)
#define UCHAR unsigned char
#define SHORT short int
#define UNSIG unsigned int
#define OFFSET(p,n) *((unsigned int *)(&(p)))=n
#define SEGSET(p,n) *((unsigned int *)(&(p))+1)=n
#define CVRAM 0xC800
#define KVRAM 0xCA00
#define SCR_X 80
#define MAX_X 80
#ifdef LINE40
#define MAX_Y 40
#else
#define MAX_Y 25
#endif
#define DMYKAN 0xFE
#define CRCHR 0x1F
#define TABCHR 0x09
#define NULCHR 0x20
#define TAB 8
#define CONTRL FALSE
#define DEFCOL COLOR
#define ESPSIZ 32
extern SHORT CUR_X,CUR_Y;
extern UCHAR CUR_DSP_FLG;
extern UCHAR Con_mode;
extern SHORT SCR_Y;
extern SHORT COLOR,BAKCOL;
static SHORT KANMOD=TRUE;
static UCHAR BAKCH1=0;
static UCHAR KANCOD=0;
static SHORT EXTFLG=FALSE;
static void (*EXTPRO)();
static SHORT ESCCNT=0;
static char ESCPRM[ESPSIZ];
static SHORT BAK_X,BAK_Y;
static void NextChr(sub)
void (*sub)();
{
EXTFLG = TRUE;
EXTPRO = sub;
}
static void Scrool()
{
vramcpy(0,(MAX_X * 2),(MAX_X * 2) * (SCR_Y - 1));
colset((MAX_X * 2) * (SCR_Y - 1),COLOR,(MAX_X * 2));
}
static void PutBS()
{
if ( --CUR_X < 0 ) {
CUR_X = SCR_X - 1;
if ( --CUR_Y < 0 )
CUR_Y = 0;
}
}
static void PutTAB()
{
int i;
extern void PutChr();
if ( (Con_mode & 0x02) == 0 )
i = 1;
else
i = ((CUR_X + TAB) / TAB) * TAB - CUR_X;
while ( i-- > 0 )
PutChr(COLOR|0xC0,NULCHR);
}
static void PutLF()
{
if ( ++CUR_Y >= SCR_Y ) {
CUR_Y = (SCR_Y - 1);
Scrool();
}
if ( (Con_mode & 0x01) != 0 )
CUR_X = 0;
}
static void PutHOME()
{
CUR_X = CUR_Y = 0;
}
static void PutCLS()
{
colset(0,COLOR,(MAX_X * 2) * SCR_Y);
CUR_X = CUR_Y = 0;
}
static void PutCR()
{
CUR_X = 0;
if ( (Con_mode & 0x01) != 0 )
PutLF();
}
static void CurRit()
{
if ( ++CUR_X >= SCR_X )
CUR_X = 0;
}
static void CurLft()
{
if ( --CUR_X < 0 )
CUR_X = SCR_X - 1;
}
static void CurUp()
{
if ( --CUR_Y < 0 )
CUR_Y = SCR_Y - 1;
}
static void CurDwn()
{
if ( ++CUR_Y >= SCR_Y )
CUR_Y = 0;
}
void SVidAt(ch)
int ch;
{
COLOR = ch & 0x3F;
}
void SetDC2_s(ch)
int ch;
{
CUR_X = BAKCH1;
CUR_Y = ch;
if ( CUR_X < 0 ) CUR_X = 0;
if ( CUR_X >= SCR_X ) CUR_X = SCR_X - 1;
if ( CUR_Y < 0 ) CUR_Y = 0;
if ( CUR_Y >= SCR_Y ) CUR_Y = SCR_Y - 1;
}
void SetDC2(ch)
int ch;
{
extern void SetDC2_s();
BAKCH1 = ch;
NextChr(SetDC2_s);
}
void SetDC3_s(ch)
int ch;
{
extern void PutChr();
while ( BAKCH1-- > 0 )
PutChr(0xC0|COLOR,ch);
}
void SetDC3(ch)
int ch;
{
extern void SetDC3_s();
BAKCH1 = ch;
NextChr(SetDC3_s);
}
static void EraLin()
{
colset((CUR_X * 2) + (MAX_X * 2) * CUR_Y,COLOR,(MAX_X - CUR_X) * 2);
}
static void EraScr()
{
colset((CUR_X * 2) + (MAX_X * 2) * CUR_Y,COLOR,
(MAX_X * 2) * SCR_Y - (CUR_X * 2) + (MAX_X * 2) * CUR_Y);
}
static void InsLin()
{
int i;
UNSIG p;
p = (MAX_X * 2) * (SCR_Y - 1);
for ( i = SCR_Y - 1 ; i > CUR_Y ; i-- ) {
vramcpy(p,p-(MAX_X * 2),(MAX_X * 2));
p -= (MAX_X * 2);
}
colset((MAX_X * 2) * CUR_Y,COLOR,MAX_X * 2);
}
static void DelLin()
{
int i;
UNSIG p;
p = (MAX_X * 2) * CUR_Y;
for ( i = CUR_Y ; i < (SCR_Y - 1) ; i ++ ) {
vramcpy(p,p+(MAX_X * 2),(MAX_X * 2));
p += (MAX_X * 2);
}
colset((MAX_X * 2) * (SCR_Y - 1),COLOR,MAX_X * 2);
}
void SCurPs_s(ch)
int ch;
{
CUR_Y = BAKCH1 - ' ';
CUR_X = ch - ' ';
if ( CUR_X < 0 ) CUR_X = 0;
if ( CUR_X >= SCR_X ) CUR_X = SCR_X - 1;
if ( CUR_Y < 0 ) CUR_Y = 0;
if ( CUR_Y >= SCR_Y ) CUR_Y = SCR_Y - 1;
}
void SCurPs(ch)
int ch;
{
extern void SCurPs_s();
BAKCH1 = ch;
NextChr(SCurPs_s);
}
void CurAtt_s()
{
}
void CurAtt(ch)
int ch;
{
extern void CurAtt_s();
NextChr(CurAtt_s);
}
static void AnsiH()
{
if ( ESCPRM[0] > 0 ) ESCPRM[0]--;
if ( ESCPRM[1] > 0 ) ESCPRM[1]--;
CUR_Y = ESCPRM[0];
CUR_X = ESCPRM[1];
if ( CUR_X < 0 ) CUR_X = 0;
if ( CUR_X >= SCR_X ) CUR_X = SCR_X - 1;
if ( CUR_Y < 0 ) CUR_Y = 0;
if ( CUR_Y >= SCR_Y ) CUR_Y = SCR_Y - 1;
}
static void AnsiA()
{
if ( (CUR_Y -= ESCPRM[0]) < 0 )
CUR_Y = 0;
}
static void AnsiB()
{
if ( (CUR_Y += ESCPRM[0]) >= SCR_Y )
CUR_Y = SCR_Y - 1;
}
static void AnsiC()
{
if ( (CUR_X += ESCPRM[0]) >= SCR_X )
CUR_X = SCR_X - 1;
}
static void AnsiD()
{
if ( (CUR_X -= ESCPRM[0]) < 0 )
CUR_X = 0;
}
static void Ansis()
{
BAK_X = CUR_X;
BAK_Y = CUR_Y;
}
static void Ansiu()
{
CUR_X = BAK_X;
CUR_Y = BAK_Y;
}
static void AnsiJ()
{
switch(ESCPRM[0]) {
case 0: EraScr(); break;
case 1: colset(0,COLOR,(CUR_X * 2) + (MAX_X * 2) * CUR_Y); break;
case 2: PutCLS(); break;
}
}
static void AnsiK()
{
switch(ESCPRM[0]) {
case 0: EraLin(); break;
case 1:
if ( CUR_X > 0 )
colset((MAX_X * 2) * CUR_Y,COLOR,CUR_X * 2);
break;
case 2: colset((MAX_X * 2) * CUR_Y,COLOR,MAX_X * 2); break;
}
}
static void AnsiM()
{
while ( ESCPRM[0]-- > 0 )
DelLin();
CUR_X = 0;
}
static void AnsiL()
{
while ( ESCPRM[0]-- > 0 )
InsLin();
CUR_X = 0;
}
static void Ansiv()
{
CUR_DSP_FLG = ESCPRM[0];
}
static void Ansim()
{
int c;
int i,n;
static char ansiatt[]={ 0x00,0x20,0x00,0x00,0x00,0x10,0x00,0x08,0x00 };
static char ansicol[]={ 0,2,4,6,1,3,5,7 };
for ( n = 0,c = 0x07 ; n < ESCCNT ; n++ ) {
if ( (i = ESCPRM[n]) > 0 && i <= 8 ) {
c |= ansiatt[i];
} else if ( i == 0 ) {
c &= 0x07;
} else if ( i >= 30 && i <= 38 ) {
c &= 0xF8;
c |= ansicol[i-30];
} else if ( i >= 40 && i <= 47 ) {
BAKCOL = ansicol[i-40]; /* 現在未サポ-ト */
}
}
COLOR = c;
}
static void AnsKeyAs()
{
int ch,i;
i = 0;
if ( (ch = (UCHAR)ESCPRM[i++]) == 0 )
ch = 0x8000 | (UCHAR)ESCPRM[i++];
if ( (ESCCNT - i) < 1 )
return;
AsinKey(ch,ESCCNT - i,&ESCPRM[i]); /* Compile to BIOS.ASM */
}
void AnsStr(ch)
int ch;
{
void AnsiCom();
if ( ch == '\"' )
NextChr(AnsiCom);
if ( ESCCNT < ESPSIZ )
ESCPRM[ESCCNT++] = ch;
NextChr(AnsStr);
}
void AnsiCom(ch)
int ch;
{
if ( ch == ';' && ESCCNT < ESPSIZ )
ESCCNT++;
else if ( ch >= '0' && ch <= '9' )
ESCPRM[ESCCNT] = ESCPRM[ESCCNT] * 10 + (ch - '0');
else if ( ch != ' ' ) {
ESCCNT++;
switch(ch) {
case 'H': AnsiH(); break;
case 'f': AnsiH(); break;
case 'A': AnsiA(); break;
case 'B': AnsiB(); break;
case 'C': AnsiC(); break;
case 'D': AnsiD(); break;
case 's': Ansis(); break;
case 'u': Ansiu(); break;
case 'J': AnsiJ(); break;
case 'K': AnsiK(); break;
case 'm': Ansim(); break;
case 'M': AnsiM(); break;
case 'L': AnsiL(); break;
case 'v': Ansiv(); break;
case 'p': AnsKeyAs(); break;
case '\"': NextChr(AnsStr); break;
}
return;
}
NextChr(AnsiCom);
}
static void AnsiESC()
{
extern void AnsiCom();
memset(ESCPRM,0,ESPSIZ);
ESCCNT = 0;
NextChr(AnsiCom);
}
void EscCom(ch)
int ch;
{
extern void SCurPs(),SVidAt(),CurAtt();
switch(ch) {
case '*': PutCLS(); break;
case 'T': EraLin(); break;
case 'Y': EraScr(); break;
case 'E': InsLin(); break;
case 'R': DelLin(); break;
case '=': NextChr(SCurPs); break;
case 'G': NextChr(SVidAt); break;
case 'K': KANMOD = TRUE; break;
case 'C': KANMOD = FALSE; break;
case '.': NextChr(CurAtt); break;
case '[': AnsiESC(); break;
case '1': case '2': case '3': break; /* TAB Set/UnSet */
default: PutChr(0xC0|COLOR,ch); break;
}
}
static void PutCnt(ch)
int ch;
{
extern void SVidAt(),SetDC2(),SetDC3(),EscCom();
switch(ch) {
case 0x00: break;
case 0x07: Beep(); break;
case 0x08: PutBS(); break;
case 0x09: PutTAB(); break;
case 0x0A: PutLF(); break;
case 0x0B: PutHOME(); break;
case 0x0C: PutCLS(); break;
case 0x0D: PutCR(); break;
case 0x12: NextChr(SetDC2); break;
case 0x13: NextChr(SetDC3); break;
case 0x15: PutCLS(); break;
case 0x16: PutCLS(); break;
case 0x1B: NextChr(EscCom); break;
case 0x1C: CurRit(); break;
case 0x1D: CurLft(); break;
case 0x1E: CurUp(); break;
case 0x1F: CurDwn(); break;
default: PutChr(0xC0|COLOR,ch); break;
}
}
void PutChr(att,ch)
int att,ch;
{
UCHAR far *p;
if ( (att & 0xC0) == 0xC0 )
att &= 0x3F;
else if ( ch < ' ' || ch == 0x7f ) {
if ( (att & 0x40) == 0 && (Con_mode & 0x80) != 0 ) {
PutCnt(ch);
return;
}
}
SEGSET(p,CVRAM);
OFFSET(p,(CUR_X * 2 + (MAX_X * 2) * CUR_Y));
*p = ch; *(p+1) = att;
if ( (att & 0x40) != 0 ) {
*p = DMYKAN;
SEGSET(p,KVRAM);
*p = ch >> 8;
*(p+1) = ch;
}
if ( ++CUR_X >= SCR_X ) {
CUR_X = 0;
if ( ++CUR_Y >= SCR_Y ) {
CUR_Y = SCR_Y - 1;
Scrool();
}
}
}
void Chr_out(ch)
int ch;
{
ch &= 0xff;
if ( EXTFLG != FALSE ) {
EXTFLG = FALSE;
(*EXTPRO)(ch);
return;
}
if ( KANMOD != FALSE ) {
if ( KANCOD != '\0' ) {
if ( iskanji2(ch) != FALSE ) {
if ( CUR_X == (SCR_X - 1) ) {
PutChr(COLOR,DMYKAN);
PutChr(COLOR,DMYKAN);
} else {
ch = sjisto((int)((KANCOD << 8) | ch));
PutChr(0x40|COLOR,ch);
PutChr(0xC0|COLOR,DMYKAN);
}
} else {
PutChr(COLOR,KANCOD);
PutChr(COLOR,ch);
}
KANCOD = '\0';
return;
} else if ( iskanji(ch) != FALSE ) {
KANCOD = ch;
return;
}
}
PutChr(COLOR,ch);
}