home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Kyūkyoku!! X68000 Emulator
/
X68000Book.dat
/
mac
/
OLS
/
X68000
/
Ko-Window
/
kow142s.lzh
/
wsrv
/
screen.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-12-01
|
11KB
|
377 lines
/*#include <GIOCSLIB.H>
#include <GIOCSCALL.H>*/
#include <sys_doslib.h>
#include <stdio.h>
#include "clip.h"
#include "window.h"
#include "manager.h"
#include "mouselib.h"
#include "screen.h"
#define AUTOGPOS 1
#define WIDE256 0
static unsigned short Palet16[] =
{
0x0000, 0x5294, 0x0020, 0x003E, 0x0400, 0x07C0, 0x0420, 0x07FE,
0x8000, 0xF800, 0x8020, 0xF83E, 0x8400, 0xFFC0, 0xAD6A, 0xFFFE,
};
static unsigned short Palet256[] =
{
0x0000, 0x0008, 0x0012, 0x001A, 0x0024, 0x002C, 0x0036, 0x003E,
0x0100, 0x0108, 0x0112, 0x011A, 0x0124, 0x012C, 0x0136, 0x013E,
0x0240, 0x0248, 0x0252, 0x025A, 0x0264, 0x026C, 0x0276, 0x027E,
0x0340, 0x0348, 0x0352, 0x035A, 0x0364, 0x036C, 0x0376, 0x037E,
0x0480, 0x0488, 0x0492, 0x049A, 0x04A4, 0x04AC, 0x04B6, 0x04BE,
0x0580, 0x0588, 0x0592, 0x059A, 0x05A4, 0x05AC, 0x05B6, 0x05BE,
0x06C0, 0x06C8, 0x06D2, 0x06DA, 0x06E4, 0x06EC, 0x06F6, 0x06FE,
0x07C0, 0x07C8, 0x07D2, 0x07DA, 0x07E4, 0x07EC, 0x07F6, 0x07FE,
0x5000, 0x5008, 0x5012, 0x501A, 0x5024, 0x502C, 0x5036, 0x503E,
0x5100, 0x5108, 0x5112, 0x511A, 0x5124, 0x512C, 0x5136, 0x513E,
0x5240, 0x5248, 0x5252, 0x525A, 0x5264, 0x526C, 0x5276, 0x527E,
0x5340, 0x5348, 0x5352, 0x535A, 0x5364, 0x536C, 0x5376, 0x537E,
0x5480, 0x5488, 0x5492, 0x549A, 0x54A4, 0x54AC, 0x54B6, 0x54BE,
0x5580, 0x5588, 0x5592, 0x559A, 0x55A4, 0x55AC, 0x55B6, 0x55BE,
0x56C0, 0x56C8, 0x56D2, 0x56DA, 0x56E4, 0x56EC, 0x56F6, 0x56FE,
0x57C0, 0x57C8, 0x57D2, 0x57DA, 0x57E4, 0x57EC, 0x57F6, 0x57FE,
0xA800, 0xA808, 0xA812, 0xA81A, 0xA824, 0xA82C, 0xA836, 0xA83E,
0xA900, 0xA908, 0xA912, 0xA91A, 0xA924, 0xA92C, 0xA936, 0xA93E,
0xAA40, 0xAA48, 0xAA52, 0xAA5A, 0xAA64, 0xAA6C, 0xAA76, 0xAA7E,
0xAB40, 0xAB48, 0xAB52, 0xAB5A, 0xAB64, 0xAB6C, 0xAB76, 0xAB7E,
0xAC80, 0xAC88, 0xAC92, 0xAC9A, 0xACA4, 0xACAC, 0xACB6, 0xACBE,
0xAD80, 0xAD88, 0xAD92, 0xAD9A, 0xADA4, 0xADAC, 0xADB6, 0xADBE,
0xAEC0, 0xAEC8, 0xAED2, 0xAEDA, 0xAEE4, 0xAEEC, 0xAEF6, 0xAEFE,
0xAFC0, 0xAFC8, 0xAFD2, 0xAFDA, 0xAFE4, 0xAFEC, 0xAFF6, 0xAFFE,
0xF800, 0xF808, 0xF812, 0xF81A, 0xF824, 0xF82C, 0xF836, 0xF83E,
0xF900, 0xF908, 0xF912, 0xF91A, 0xF924, 0xF92C, 0xF936, 0xF93E,
0xFA40, 0xFA48, 0xFA52, 0xFA5A, 0xFA64, 0xFA6C, 0xFA76, 0xFA7E,
0xFB40, 0xFB48, 0xFB52, 0xFB5A, 0xFB64, 0xFB6C, 0xFB76, 0xFB7E,
0xFC80, 0xFC88, 0xFC92, 0xFC9A, 0xFCA4, 0xFCAC, 0xFCB6, 0xFCBE,
0xFD80, 0xFD88, 0xFD92, 0xFD9A, 0xFDA4, 0xFDAC, 0xFDB6, 0xFDBE,
0xFEC0, 0xFEC8, 0xFED2, 0xFEDA, 0xFEE4, 0xFEEC, 0xFEF6, 0xFEFE,
0xFFC0, 0xFFC8, 0xFFD2, 0xFFDA, 0xFFE4, 0xFFEC, 0xFFF6, 0xFFFE,
};
extern int HomeX, HomeY ; /* 1991 COR. */
extern int GraphicMode;
extern int ScreenH, ScreenV;
extern int ScreenMode; /* v2.24+7 */
extern void setpalet65536( void );
extern int GraphicHomeX, GraphicHomeY; /* 1995 COR. */
static int GraphicOldHomeX, GraphicOldHomeY, GraphicHoldLevel;
typedef struct {
unsigned short
Xsize,Ysize,R00,R01,R02,R03,R04,R05,R06,R07,R08,R20;
unsigned char
HRL,BG,Htotal,Hdisp,Vdisp,SPres;
unsigned short
Reserved00;
} ScreenModeTbl;
/*
+$00 DC.W Xsize ò\Īëµû╩é╠æσé½é│
+$02 DC.W Ysize
+$04 DC.W R00 Éàò╜âgü[â^âï
+$06 DC.W R01 Éàò╜ô»è·ÅIù╣ê╩Æu
+$08 DC.W R02 Éàò╜ò\ĪèJÄnê╩Æu
+$0A DC.W R03 Éàò╜ò\ĪÅIù╣ê╩Æu
+$0C DC.W R04 ÉéÆ╝âgü[â^âï
+$0E DC.W R05 ÉéÆ╝ô»è·ÅIù╣ê╩Æu
+$10 DC.W R06 ÉéÆ╝ò\ĪèJÄnê╩Æu
+$12 DC.W R07 ÉéÆ╝ò\ĪÅIù╣ê╩Æu
+$14 DC.W R08 èOòöô»è·Éàò╜âAâWâââXâg
+$16 DC.W R20 VRAMì\ɼ(ë║ê╩8ârâbâgé╠é▌ùLî°)
+$18 DC.B HRL âhâbâgâNâìâbâN(0:HRL=0 / 1:HRL=1)
+$19 DC.B BG BGÄgùpë┬ö\ûçÉö(0:BGÄgùpòsë┬)
+$1A DC.B Htotal âXâvâëâCâgÉàò╜âgü[â^âï(0:âXâvâëâCâgÄgùpòsë┬)
+$1B DC.B Hdisp âXâvâëâCâgÉàò╜ò\ĪèJÄnê╩Æu
+$1C DC.B Vdisp âXâvâëâCâgÉéÆ╝ò\ĪèJÄnê╩Æu
+$1D DC.B SPres âXâvâëâCâgë≡æ£ôx
+$1E DC.W Rsv00 ù\û±
*/
static ScreenModeTbl screentbl[]= {
{ 256,256, 0x2D,0x4,0x06,0x26,0x237,5,0x28,0x228,0x1B,0x10, 0,2,255,0x0A,0x28,0x10, 0 },
{ 384,256, 0x45,0x5,0x0A,0x3A,0x237,5,0x28,0x228,0x1B,0x11, 1,2,255,0x0E,0x29,0x11, 0 },
/*{ 384,276, 0x45,0x5,0x0A,0x3A,0x244,5,0x1c,0x244,0x1B,0x11, 1,2,255,0x0E,0x29,0x11, 0 },*/
{ 512,512, 0x5B,0x9,0x11,0x51,0x237,5,0x28,0x228,0x1B,0x15, 0,1,255,0x15,0x28,0x15, 0 },
{ 768,512, 0x89,0xE,0x1C,0x7C,0x237,5,0x28,0x228,0x1B,0x16, 0,0, 0, 0, 0, 0, 0 },
{ 704,424, 0x75,0xC,0x12,0x6A,0x1D0,7,0x20,0x1C8,0x1B,0x15, 0,0, 0, 0, 0, 0, 0 },
{1024,424, 0xAF,0xF,0x1F,0x9F,0x1D0,7,0x20,0x1C8,0x1B,0x16, 0,0, 0, 0, 0, 0, 0 },
{1024,848, 0xAF,0xF,0x1F,0x9F,0x1D0,7,0x20,0x1C8,0x1B,0x1A, 0,0, 0, 0, 0, 0, 0 },
{ 800,526, 0x89,0xE,0x1C,0x80,0x237,5,0x28,0x236,0x1B,0x16, 0,0, 0, 0, 0, 0, 0 },
/*{ 800, 512, {0x89,0xe,0x1c,0x80,0x237,5,0x28,0x228,0x1b}, 0x16 },*/
/*{ 640, 480, {0x63,0xb,0x0d,0x5d,0x20c,1,0x21,0x201,0x1b},*/
/*{ 800, 512, {0x8b,0xe,0x1a,0x7e,0x22c,5,0x28,0x228,0x1b}, 0x16 },*/
};
typedef struct {
unsigned short V01,V03,page,mask,size;
} ScreenColorTbl;
static ScreenColorTbl screencolortbl[]= {
{ 0x400,0x30, 1,0xf ,2048 }, /* 4 16ÉFâéü[âh */
{ 0x100,0x23, 2,0xff ,1024 }, /* 8 256ÉFâéü[âh */
{ 0x300,0x2f, 1,0xffff,1024 }, /*12 65536ÉFâéü[âh */
{ 0x100,0x2f, 2,0xff ,1024 }, /*16 256ÉFx2âéü[âh */
{ 0x000,0x2f, 4,0xf ,1024 }, /*20 16ÉFx4âéü[âh */
};
WindowSetScreenMode( mode )
int mode;
{
if( mode < 8 ){
int oldmode= ScreenMode;
if( mode != -1 )
ScreenMode= mode;
if( GraphicMode == 0 )
GraphicMode= WindowAttrGraphic16;
SetGraphicMode( -1 );
return oldmode;
}else
return (int)(&screentbl[mode&7]);
}
WindowGetScreenSize( xp, yp )
int *xp, *yp;
{
*xp= ScreenH;
*yp= ScreenV;
return ScreenMode;
}
/* âOâëâtâBâbâNâéü[âh */
void
SetGraphicMode( mode ) /* 1991 by H.Ogasawara(COR.) */
int mode;
{
int h, v;
int mx, my;
if( GraphicMode == mode )
return;
if( mode != -1 )
GraphicMode= mode;
if( !(GraphicMode & 12) )
return;
/* 4 8 12 16 */
MouseGetPosition( &mx, &my );
{ /* 19940422 Copel */
register ScreenModeTbl *_A0 asm("a0")=&screentbl[ScreenMode];
register ScreenColorTbl *_A3 asm("a3")=&screencolortbl[(GraphicMode>>2)-1];
asm("
CRTC_R00 EQU $E80000
VCTRL_R01 EQU $E82400
VCTRL_R03 EQU $E82600
GPIPD EQU $E88001
SYS_R04 EQU $E8E007
BG_CTRL EQU $EB0808
SP_HDISP EQU $EB080C
MOVE.W (A0)+,_ScreenH+2 é╖é┼é╔Åπê╩âÅü[âhé═0î┼ÆΦé╔é╚é┴é─éóéΘ
MOVE.W (A0)+,_ScreenV+2
CLR.L -(SP)
DC.W $FF20 *DOS _SUPER
MOVE.L D0,(SP)
LEA GPIPD,A1
MOVEQ #4,D0
WAITVD BTST.B D0,(A1) Éàò╜ò\Īè·è╘æ╥é┐
BEQ WAITVD
WAITVE BTST.B D0,(A1) Éàò╜ïAÉⁿè·è╘æ╥é┐
BNE WAITVE
LEA VCTRL_R03+1,A2
CLR.B (A2) æSò\ĪOFF
LEA CRTC_R00,A1
MOVE.W (A3),D0 V01é╠Åπê╩8ârâbâg
MOVE.B $13(A0),D0 VRAMì\ɼë║ê╩8ârâbâg
MOVE.W D0,D2 D2.W:R20é╔âZâbâgé╖éΘâfü[â^
MOVE.W $28(A1),D1 î╗ì▌é╠R20
ROR.B #4,D0
ROR.B #4,D1
CMP.B D1,D0 æOë±é╞ìíë±é╠ò\Īûºôxé≡öΣèré╖éΘ
BCC LO2HI
HI2LO MOVE.W (A0)+,D1 D1.W:R00é╔âZâbâgé╖éΘâfü[â^
ADDQ.L #2,A1
MOVE.W D2,$26(A1) R20âZâbâg
MOVE.L (A0)+,(A1)+ R01,R02âZâbâg
MOVE.L (A0)+,(A1)+ R03,R04âZâbâg
MOVE.L (A0)+,(A1)+ R05,R06âZâbâg
MOVE.L (A0)+,(A1)+ R07,R08âZâbâg
MOVE.W D1,-$12(A1) R00âZâbâg
BRA VCRSET
LO2HI MOVE.W (A0)+,D1 D1.W:R00é╔âZâbâgé╖éΘâfü[â^
MOVE.W D1,(A1)+ R00âZâbâg
MOVE.L (A0)+,(A1)+ R01,R02âZâbâg
MOVE.L (A0)+,(A1)+ R03,R04âZâbâg
MOVE.L (A0)+,(A1)+ R05,R06âZâbâg
MOVE.L (A0)+,(A1)+ R07,R08âZâbâg
MOVE.W D2,$16(A1) R20âZâbâg
VCRSET MOVE.B (A3),VCTRL_R01-VCTRL_R03(A2) V01âZâbâg
MOVE.B 3(A3),(A2) V03âZâbâg
LEA SYS_R04,A2 âhâbâgâNâìâbâNÉ▌ÆΦ
MOVE.L (A0)+,D0 D0.Lé╠Bit8:HRL
MOVEQ #1,D1
ASL.W #7,D0 D0.Wé╠Bit15:HRL
BMI HRLON
HRLOFF BCLR.B D1,(A2)
BRA SPCSET
HRLON BSET.B D1,(A2)
SPCSET LEA SP_HDISP+1,A1 âXâvâëâCâgâRâôâgâìü[âëÉ▌ÆΦ
MOVEQ #$10,D0
MOVE.W D0,BG_CTRL-SP_HDISP-1(A1) BGò\ĪOFF
MOVE.B (A0)+,D1 H-TOTALéµéΦɵé╔H-DISPé≡É▌ÆΦé╡é╚é»éΩé╬é╚éτé╚éó
MOVE.B (A0)+,(A1)+ H-DISPâZâbâg
ST D0 15kHz,256x256Ä₧é╔é═é▒é▒é┼Ä₧è╘æ╥é┐é¬òKùv
RWAIT DBRA D0,RWAIT û{ôûé═130â╩òbòKùvéτé╡éóé»é╟030é┼éαô«é¡ücôΣ
MOVE.W D1,-4(A1) H-TOTALÉ▌ÆΦ
MOVE.W (A0)+,D0
MOVEP.W D0,1(A1) V-DISP,SP-RESâZâbâg
LEA $95C.w,A1 âÅü[âNâGâèâAÉ▌ÆΦ
MOVE.W #$00C0,(A1)+ $95C $C00000
CLR.L (A1)+
MOVE.W 8(A3),(A1)+ $962 size
MOVE.W 6(A3),(A1)+ $964 mask
MOVE.B 5(A3),$93D.w $93D page
TST.L (SP)
BMI STUEE
DC.W $FF20 *DOS _SUPER
STUEE ADDQ.L #4,SP
"::"a"(_A0),"a"(_A3):"d0","d1","d2","a0","a1","a2");
}
if( mode != -1 )
PaletInit();
if( HomeX+ScreenH >= 1024 )
HomeX= 1024-ScreenH;
if( HomeY+ScreenV >= 1024 )
HomeY= 1024-ScreenV;
#if AUTOGPOS
if( GraphicMode == WindowAttrGraphic16 ){
GVramRegion( 0, 0, 1023, 1023 );
GraphicHomeX= 0;
GraphicHomeY= 0;
}else{
GraphicHomeX= GraphicOldHomeX;
GraphicHomeY= GraphicOldHomeY;
# if WIDE256
if( GraphicMode == WindowAttrGraphic256 ){
GraphicHomeY= 0;
GVramRegion( GraphicHomeX, 0,
GraphicHomeX+511, 1023 );
}else
# endif
GVramRegion( GraphicHomeX, GraphicHomeY,
GraphicHomeX+511, GraphicHomeY+511 );
}
#endif
WindowRootScroll( HomeX, HomeY );
if( mx >= HomeX+ScreenH )
mx= HomeX+ScreenH-1;
if( my >= HomeY+ScreenV )
my= HomeY+ScreenV-1;
MouseMove( mx, my );
WindowGetViewSize( &RootWindow, &h, &v );
MouseRegion( 0, 0, h-1, v-1 );
if( mode > 0 ){
WindowClass *wp;
for( wp= RootWindow.window.childtop ; wp ; wp= wp->window.next ){
if( wp->window.attr & WindowAttrGraphicUse ){
EventInfo info;
info.option= EventGraphic;
info.x= GraphicMode;
WindowSendEvent( wp, &info );
}
}
}
}
/* 1995 2/25 H.Ogasawara (COR.) */
/*
level= 0 Holdë≡Å£
4 ApplicationLevel
8 ManagerLevel
16 ServerReserved
*/
GetGraphicOffset( x, y )
int *x, *y;
{
*x= GraphicHomeX;
*y= GraphicHomeY;
}
SetGraphicOffset( x, y, level )
{
if( GraphicMode == WindowAttrGraphic16 ){
GraphicHomeX= 0;
GraphicHomeY= 0;
GVramRegion( 0, 0, 1023, 1023 );
}else if( !level ){
GraphicHoldLevel= 0;
}else if( level >= GraphicHoldLevel ){
if( x < 0 )
x= 0;
else if( x > 512 )
x= 512;
if( y < 0 )
y= 0;
else if( y > 512 )
y= 512;
GraphicHoldLevel= level;
if( GraphicHomeX != x || GraphicHomeY != y ){
GraphicOldHomeX= GraphicHomeX= x;
GraphicOldHomeY= GraphicHomeY= y;
#if WIDE256
if( GraphicMode == WindowAttrGraphic256 ){
GraphicHomeY= 0;
GVramRegion( GraphicHomeX, 0, GraphicHomeX+511, 1023 );
}else
#endif
GVramRegion( GraphicHomeX, GraphicHomeY,
GraphicHomeX+511, GraphicHomeY+511 );
WindowRootScroll( HomeX, HomeY );
return TRUE;
}
}
return FALSE;
}
void
PaletInit()
{
switch( GraphicMode ){
case 20:
case WindowAttrGraphic16:
B_MEMSET( (void*)0xE82000, (void*)Palet16, 16*2-1 );
break;
case 16:
case WindowAttrGraphic256:
B_MEMSET( (void*)0xE82000, (void*)Palet256, 256*2-1 );
break;
case WindowAttrGraphic65536:
setpalet65536();
}
}