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 >
C/C++ Source or Header  |  1995-12-01  |  11KB  |  377 lines

  1. /*#include <GIOCSLIB.H>
  2. #include <GIOCSCALL.H>*/
  3.  
  4. #include    <sys_doslib.h>
  5. #include    <stdio.h>
  6.  
  7. #include "clip.h"
  8. #include "window.h"
  9. #include "manager.h"
  10.  
  11. #include "mouselib.h"
  12. #include "screen.h"
  13.  
  14. #define AUTOGPOS    1
  15. #define    WIDE256        0
  16.  
  17. static    unsigned short    Palet16[] =
  18. {
  19.     0x0000, 0x5294, 0x0020, 0x003E, 0x0400, 0x07C0, 0x0420, 0x07FE,
  20.     0x8000, 0xF800, 0x8020, 0xF83E, 0x8400, 0xFFC0, 0xAD6A, 0xFFFE,
  21. };
  22.  
  23. static    unsigned short Palet256[] =
  24. {
  25.     0x0000, 0x0008, 0x0012, 0x001A, 0x0024, 0x002C, 0x0036, 0x003E,
  26.     0x0100, 0x0108, 0x0112, 0x011A, 0x0124, 0x012C, 0x0136, 0x013E,
  27.     0x0240, 0x0248, 0x0252, 0x025A, 0x0264, 0x026C, 0x0276, 0x027E,
  28.     0x0340, 0x0348, 0x0352, 0x035A, 0x0364, 0x036C, 0x0376, 0x037E,
  29.     0x0480, 0x0488, 0x0492, 0x049A, 0x04A4, 0x04AC, 0x04B6, 0x04BE,
  30.     0x0580, 0x0588, 0x0592, 0x059A, 0x05A4, 0x05AC, 0x05B6, 0x05BE,
  31.     0x06C0, 0x06C8, 0x06D2, 0x06DA, 0x06E4, 0x06EC, 0x06F6, 0x06FE,
  32.     0x07C0, 0x07C8, 0x07D2, 0x07DA, 0x07E4, 0x07EC, 0x07F6, 0x07FE,
  33.     0x5000, 0x5008, 0x5012, 0x501A, 0x5024, 0x502C, 0x5036, 0x503E,
  34.     0x5100, 0x5108, 0x5112, 0x511A, 0x5124, 0x512C, 0x5136, 0x513E,
  35.     0x5240, 0x5248, 0x5252, 0x525A, 0x5264, 0x526C, 0x5276, 0x527E,
  36.     0x5340, 0x5348, 0x5352, 0x535A, 0x5364, 0x536C, 0x5376, 0x537E,
  37.     0x5480, 0x5488, 0x5492, 0x549A, 0x54A4, 0x54AC, 0x54B6, 0x54BE,
  38.     0x5580, 0x5588, 0x5592, 0x559A, 0x55A4, 0x55AC, 0x55B6, 0x55BE,
  39.     0x56C0, 0x56C8, 0x56D2, 0x56DA, 0x56E4, 0x56EC, 0x56F6, 0x56FE,
  40.     0x57C0, 0x57C8, 0x57D2, 0x57DA, 0x57E4, 0x57EC, 0x57F6, 0x57FE,
  41.     0xA800, 0xA808, 0xA812, 0xA81A, 0xA824, 0xA82C, 0xA836, 0xA83E,
  42.     0xA900, 0xA908, 0xA912, 0xA91A, 0xA924, 0xA92C, 0xA936, 0xA93E,
  43.     0xAA40, 0xAA48, 0xAA52, 0xAA5A, 0xAA64, 0xAA6C, 0xAA76, 0xAA7E,
  44.     0xAB40, 0xAB48, 0xAB52, 0xAB5A, 0xAB64, 0xAB6C, 0xAB76, 0xAB7E,
  45.     0xAC80, 0xAC88, 0xAC92, 0xAC9A, 0xACA4, 0xACAC, 0xACB6, 0xACBE,
  46.     0xAD80, 0xAD88, 0xAD92, 0xAD9A, 0xADA4, 0xADAC, 0xADB6, 0xADBE,
  47.     0xAEC0, 0xAEC8, 0xAED2, 0xAEDA, 0xAEE4, 0xAEEC, 0xAEF6, 0xAEFE,
  48.     0xAFC0, 0xAFC8, 0xAFD2, 0xAFDA, 0xAFE4, 0xAFEC, 0xAFF6, 0xAFFE,
  49.     0xF800, 0xF808, 0xF812, 0xF81A, 0xF824, 0xF82C, 0xF836, 0xF83E,
  50.     0xF900, 0xF908, 0xF912, 0xF91A, 0xF924, 0xF92C, 0xF936, 0xF93E,
  51.     0xFA40, 0xFA48, 0xFA52, 0xFA5A, 0xFA64, 0xFA6C, 0xFA76, 0xFA7E,
  52.     0xFB40, 0xFB48, 0xFB52, 0xFB5A, 0xFB64, 0xFB6C, 0xFB76, 0xFB7E,
  53.     0xFC80, 0xFC88, 0xFC92, 0xFC9A, 0xFCA4, 0xFCAC, 0xFCB6, 0xFCBE,
  54.     0xFD80, 0xFD88, 0xFD92, 0xFD9A, 0xFDA4, 0xFDAC, 0xFDB6, 0xFDBE,
  55.     0xFEC0, 0xFEC8, 0xFED2, 0xFEDA, 0xFEE4, 0xFEEC, 0xFEF6, 0xFEFE,
  56.     0xFFC0, 0xFFC8, 0xFFD2, 0xFFDA, 0xFFE4, 0xFFEC, 0xFFF6, 0xFFFE,
  57. };
  58. extern int        HomeX, HomeY ;    /* 1991 COR. */
  59. extern int        GraphicMode;
  60. extern int        ScreenH, ScreenV;
  61. extern int        ScreenMode;    /* v2.24+7 */
  62. extern void        setpalet65536( void );
  63. extern int        GraphicHomeX, GraphicHomeY;        /* 1995 COR. */
  64. static int        GraphicOldHomeX, GraphicOldHomeY, GraphicHoldLevel;
  65.  
  66. typedef struct    {
  67.     unsigned short
  68.         Xsize,Ysize,R00,R01,R02,R03,R04,R05,R06,R07,R08,R20;
  69.     unsigned char
  70.         HRL,BG,Htotal,Hdisp,Vdisp,SPres;
  71.     unsigned short
  72.         Reserved00;
  73. }    ScreenModeTbl;
  74.  
  75. /*
  76. +$00 DC.W Xsize        ò\Īëµû╩é╠æσé½é│
  77. +$02 DC.W Ysize
  78. +$04 DC.W R00        Éàò╜âgü[â^âï
  79. +$06 DC.W R01        Éàò╜ô»è·ÅIù╣ê╩Æu
  80. +$08 DC.W R02        Éàò╜ò\ĪèJÄnê╩Æu
  81. +$0A DC.W R03        Éàò╜ò\ĪÅIù╣ê╩Æu
  82. +$0C DC.W R04        ÉéÆ╝âgü[â^âï
  83. +$0E DC.W R05        ÉéÆ╝ô»è·ÅIù╣ê╩Æu
  84. +$10 DC.W R06        ÉéÆ╝ò\ĪèJÄnê╩Æu
  85. +$12 DC.W R07        ÉéÆ╝ò\ĪÅIù╣ê╩Æu
  86. +$14 DC.W R08        èOòöô»è·Éàò╜âAâWâââXâg
  87. +$16 DC.W R20        VRAMì\ɼ(ë║ê╩8ârâbâgé╠é▌ùLî°)
  88. +$18 DC.B HRL        âhâbâgâNâìâbâN(0:HRL=0 / 1:HRL=1)
  89. +$19 DC.B BG        BGÄgùpë┬ö\ûçÉö(0:BGÄgùpòsë┬)
  90. +$1A DC.B Htotal    âXâvâëâCâgÉàò╜âgü[â^âï(0:âXâvâëâCâgÄgùpòsë┬)
  91. +$1B DC.B Hdisp        âXâvâëâCâgÉàò╜ò\ĪèJÄnê╩Æu
  92. +$1C DC.B Vdisp        âXâvâëâCâgÉéÆ╝ò\ĪèJÄnê╩Æu
  93. +$1D DC.B SPres        âXâvâëâCâgë≡æ£ôx
  94. +$1E DC.W Rsv00        ù\û±
  95. */
  96.  
  97. static ScreenModeTbl    screentbl[]= {
  98. { 256,256, 0x2D,0x4,0x06,0x26,0x237,5,0x28,0x228,0x1B,0x10, 0,2,255,0x0A,0x28,0x10, 0 },
  99. { 384,256, 0x45,0x5,0x0A,0x3A,0x237,5,0x28,0x228,0x1B,0x11, 1,2,255,0x0E,0x29,0x11, 0 },
  100. /*{ 384,276, 0x45,0x5,0x0A,0x3A,0x244,5,0x1c,0x244,0x1B,0x11, 1,2,255,0x0E,0x29,0x11, 0 },*/
  101. { 512,512, 0x5B,0x9,0x11,0x51,0x237,5,0x28,0x228,0x1B,0x15, 0,1,255,0x15,0x28,0x15, 0 },
  102. { 768,512, 0x89,0xE,0x1C,0x7C,0x237,5,0x28,0x228,0x1B,0x16, 0,0,  0,   0,   0,   0, 0 },
  103. { 704,424, 0x75,0xC,0x12,0x6A,0x1D0,7,0x20,0x1C8,0x1B,0x15, 0,0,  0,   0,   0,   0, 0 },
  104. {1024,424, 0xAF,0xF,0x1F,0x9F,0x1D0,7,0x20,0x1C8,0x1B,0x16, 0,0,  0,   0,   0,   0, 0 },
  105. {1024,848, 0xAF,0xF,0x1F,0x9F,0x1D0,7,0x20,0x1C8,0x1B,0x1A, 0,0,  0,   0,   0,   0, 0 },
  106. { 800,526, 0x89,0xE,0x1C,0x80,0x237,5,0x28,0x236,0x1B,0x16, 0,0,  0,   0,   0,   0, 0 },
  107. /*{ 800, 512, {0x89,0xe,0x1c,0x80,0x237,5,0x28,0x228,0x1b}, 0x16 },*/
  108. /*{ 640, 480,    {0x63,0xb,0x0d,0x5d,0x20c,1,0x21,0x201,0x1b},*/
  109. /*{ 800, 512, {0x8b,0xe,0x1a,0x7e,0x22c,5,0x28,0x228,0x1b}, 0x16 },*/
  110. };
  111.  
  112. typedef struct    {
  113.     unsigned short    V01,V03,page,mask,size;
  114. } ScreenColorTbl;
  115.  
  116. static ScreenColorTbl    screencolortbl[]= {
  117. { 0x400,0x30, 1,0xf   ,2048 },    /* 4    16ÉFâéü[âh */
  118. { 0x100,0x23, 2,0xff  ,1024 },    /* 8   256ÉFâéü[âh */
  119. { 0x300,0x2f, 1,0xffff,1024 },    /*12 65536ÉFâéü[âh */
  120. { 0x100,0x2f, 2,0xff  ,1024 },    /*16 256ÉFx2âéü[âh */
  121. { 0x000,0x2f, 4,0xf   ,1024 },    /*20  16ÉFx4âéü[âh */
  122. };
  123.  
  124. WindowSetScreenMode( mode )
  125. int    mode;
  126. {
  127.     if( mode < 8 ){
  128.         int    oldmode= ScreenMode;
  129.         if( mode != -1 )
  130.             ScreenMode= mode;
  131.         if( GraphicMode == 0 )
  132.             GraphicMode= WindowAttrGraphic16;
  133.         SetGraphicMode( -1 );
  134.         return    oldmode;
  135.     }else
  136.         return    (int)(&screentbl[mode&7]);
  137. }
  138. WindowGetScreenSize( xp, yp )
  139. int    *xp, *yp;
  140. {
  141.     *xp= ScreenH;
  142.     *yp= ScreenV;
  143.     return    ScreenMode;
  144. }
  145.  
  146. /*    âOâëâtâBâbâNâéü[âh    */
  147. void
  148. SetGraphicMode( mode )    /* 1991 by H.Ogasawara(COR.) */
  149. int        mode;
  150. {
  151.     int        h, v;
  152.     int        mx, my;
  153.  
  154.     if( GraphicMode == mode )
  155.         return;
  156.  
  157.     if( mode != -1 )
  158.         GraphicMode= mode;
  159.  
  160.     if( !(GraphicMode & 12) )
  161.         return;
  162.     /* 4 8 12 16 */
  163.     MouseGetPosition( &mx, &my );
  164.  
  165. {    /* 19940422 Copel */
  166.     register ScreenModeTbl *_A0 asm("a0")=&screentbl[ScreenMode];
  167.     register ScreenColorTbl *_A3 asm("a3")=&screencolortbl[(GraphicMode>>2)-1];
  168. asm("
  169. CRTC_R00    EQU    $E80000
  170. VCTRL_R01    EQU    $E82400
  171. VCTRL_R03    EQU    $E82600
  172. GPIPD        EQU    $E88001
  173. SYS_R04        EQU    $E8E007
  174. BG_CTRL        EQU    $EB0808
  175. SP_HDISP    EQU    $EB080C
  176.  
  177.     MOVE.W    (A0)+,_ScreenH+2    é╖é┼é╔Åπê╩âÅü[âhé═0î┼ÆΦé╔é╚é┴é─éóéΘ
  178.     MOVE.W    (A0)+,_ScreenV+2
  179.  
  180.     CLR.L    -(SP)
  181.     DC.W    $FF20        *DOS    _SUPER
  182.     MOVE.L    D0,(SP)
  183.  
  184.     LEA    GPIPD,A1
  185.     MOVEQ    #4,D0
  186. WAITVD    BTST.B    D0,(A1)        Éàò╜ò\Īè·è╘æ╥é┐
  187.     BEQ    WAITVD
  188. WAITVE    BTST.B    D0,(A1)        Éàò╜ïAÉⁿè·è╘æ╥é┐
  189.     BNE    WAITVE
  190.  
  191.     LEA    VCTRL_R03+1,A2
  192.     CLR.B    (A2)        æSò\ĪOFF
  193.  
  194.     LEA    CRTC_R00,A1
  195.     MOVE.W    (A3),D0        V01é╠Åπê╩8ârâbâg
  196.     MOVE.B    $13(A0),D0    VRAMì\ɼë║ê╩8ârâbâg
  197.     MOVE.W    D0,D2        D2.W:R20é╔âZâbâgé╖éΘâfü[â^
  198.     MOVE.W    $28(A1),D1    î╗ì▌é╠R20
  199.     ROR.B    #4,D0
  200.     ROR.B    #4,D1
  201.     CMP.B    D1,D0        æOë±é╞ìíë±é╠ò\Īûºôxé≡öΣèré╖éΘ
  202.     BCC    LO2HI
  203.  
  204. HI2LO    MOVE.W    (A0)+,D1    D1.W:R00é╔âZâbâgé╖éΘâfü[â^
  205.     ADDQ.L    #2,A1
  206.     MOVE.W    D2,$26(A1)    R20âZâbâg
  207.     MOVE.L    (A0)+,(A1)+    R01,R02âZâbâg
  208.     MOVE.L    (A0)+,(A1)+    R03,R04âZâbâg
  209.     MOVE.L    (A0)+,(A1)+    R05,R06âZâbâg
  210.     MOVE.L    (A0)+,(A1)+    R07,R08âZâbâg
  211.     MOVE.W    D1,-$12(A1)    R00âZâbâg
  212.     BRA    VCRSET
  213.  
  214. LO2HI    MOVE.W    (A0)+,D1    D1.W:R00é╔âZâbâgé╖éΘâfü[â^
  215.     MOVE.W    D1,(A1)+    R00âZâbâg
  216.     MOVE.L    (A0)+,(A1)+    R01,R02âZâbâg
  217.     MOVE.L    (A0)+,(A1)+    R03,R04âZâbâg
  218.     MOVE.L    (A0)+,(A1)+    R05,R06âZâbâg
  219.     MOVE.L    (A0)+,(A1)+    R07,R08âZâbâg
  220.     MOVE.W    D2,$16(A1)    R20âZâbâg
  221.  
  222. VCRSET    MOVE.B    (A3),VCTRL_R01-VCTRL_R03(A2)    V01âZâbâg
  223.     MOVE.B    3(A3),(A2)    V03âZâbâg
  224.  
  225.     LEA    SYS_R04,A2    âhâbâgâNâìâbâNÉ▌ÆΦ
  226.     MOVE.L    (A0)+,D0    D0.Lé╠Bit8:HRL
  227.     MOVEQ    #1,D1
  228.     ASL.W    #7,D0        D0.Wé╠Bit15:HRL
  229.     BMI    HRLON
  230. HRLOFF    BCLR.B    D1,(A2)
  231.     BRA    SPCSET
  232. HRLON    BSET.B    D1,(A2)
  233.  
  234. SPCSET    LEA    SP_HDISP+1,A1    âXâvâëâCâgâRâôâgâìü[âëÉ▌ÆΦ
  235.     MOVEQ    #$10,D0
  236.     MOVE.W    D0,BG_CTRL-SP_HDISP-1(A1)    BGò\ĪOFF
  237.     MOVE.B    (A0)+,D1    H-TOTALéµéΦɵé╔H-DISPé≡É▌ÆΦé╡é╚é»éΩé╬é╚éτé╚éó
  238.     MOVE.B    (A0)+,(A1)+    H-DISPâZâbâg
  239.  
  240.     ST    D0        15kHz,256x256Ä₧é╔é═é▒é▒é┼Ä₧è╘æ╥é┐é¬òKùv
  241. RWAIT    DBRA    D0,RWAIT    û{ôûé═130â╩òbòKùvéτé╡éóé»é╟030é┼éαô«é¡ücôΣ
  242.  
  243.     MOVE.W    D1,-4(A1)    H-TOTALÉ▌ÆΦ
  244.     MOVE.W    (A0)+,D0
  245.     MOVEP.W    D0,1(A1)    V-DISP,SP-RESâZâbâg
  246.  
  247.     LEA    $95C.w,A1    âÅü[âNâGâèâAÉ▌ÆΦ
  248.     MOVE.W    #$00C0,(A1)+    $95C    $C00000
  249.     CLR.L    (A1)+
  250.     MOVE.W    8(A3),(A1)+    $962    size
  251.     MOVE.W    6(A3),(A1)+    $964    mask
  252.     MOVE.B    5(A3),$93D.w    $93D    page
  253.  
  254.     TST.L    (SP)
  255.     BMI    STUEE
  256.     DC.W    $FF20        *DOS    _SUPER
  257. STUEE    ADDQ.L    #4,SP
  258. "::"a"(_A0),"a"(_A3):"d0","d1","d2","a0","a1","a2");
  259. }
  260.  
  261.     if( mode != -1 )
  262.         PaletInit();
  263.  
  264.     if( HomeX+ScreenH >= 1024 )
  265.         HomeX= 1024-ScreenH;
  266.     if( HomeY+ScreenV >= 1024 )
  267.         HomeY= 1024-ScreenV;
  268. #if AUTOGPOS
  269.     if( GraphicMode == WindowAttrGraphic16 ){
  270.         GVramRegion( 0, 0, 1023, 1023 );
  271.         GraphicHomeX= 0;
  272.         GraphicHomeY= 0;
  273.     }else{
  274.         GraphicHomeX= GraphicOldHomeX;
  275.         GraphicHomeY= GraphicOldHomeY;
  276. # if WIDE256
  277.         if( GraphicMode == WindowAttrGraphic256 ){
  278.             GraphicHomeY= 0;
  279.             GVramRegion( GraphicHomeX, 0,
  280.                                 GraphicHomeX+511, 1023 );
  281.         }else
  282. # endif
  283.         GVramRegion( GraphicHomeX, GraphicHomeY,
  284.                                 GraphicHomeX+511, GraphicHomeY+511 );
  285.     }
  286. #endif
  287.     WindowRootScroll( HomeX, HomeY );
  288.  
  289.     if( mx >= HomeX+ScreenH )
  290.         mx= HomeX+ScreenH-1;
  291.     if( my >= HomeY+ScreenV )
  292.         my= HomeY+ScreenV-1;
  293.     MouseMove( mx, my );
  294.     WindowGetViewSize( &RootWindow, &h, &v );
  295.     MouseRegion( 0, 0, h-1, v-1 );
  296.  
  297.     if( mode > 0 ){
  298.         WindowClass    *wp;
  299.         for( wp= RootWindow.window.childtop ; wp ; wp= wp->window.next ){
  300.             if( wp->window.attr & WindowAttrGraphicUse ){
  301.                 EventInfo    info;
  302.                 info.option= EventGraphic;
  303.                 info.x= GraphicMode;
  304.                 WindowSendEvent( wp, &info );
  305.             }
  306.         }
  307.     }
  308. }
  309.  
  310. /* 1995 2/25 H.Ogasawara (COR.)    */
  311. /*
  312.     level=    0        Holdë≡Å£
  313.             4        ApplicationLevel
  314.             8        ManagerLevel
  315.             16        ServerReserved
  316. */
  317. GetGraphicOffset( x, y )
  318. int    *x, *y;
  319. {
  320.     *x= GraphicHomeX;
  321.     *y= GraphicHomeY;
  322. }
  323.  
  324. SetGraphicOffset( x, y, level )
  325. {
  326.     if( GraphicMode == WindowAttrGraphic16 ){
  327.         GraphicHomeX= 0;
  328.         GraphicHomeY= 0;
  329.         GVramRegion( 0, 0, 1023, 1023 );
  330.     }else if( !level ){
  331.         GraphicHoldLevel= 0;
  332.     }else if( level >= GraphicHoldLevel ){
  333.         if( x < 0 )
  334.             x= 0;
  335.         else if( x > 512 )
  336.             x= 512;
  337.         if( y < 0 )
  338.             y= 0;
  339.         else if( y > 512 )
  340.             y= 512;
  341.         GraphicHoldLevel= level;
  342.         if( GraphicHomeX != x || GraphicHomeY != y ){
  343.             GraphicOldHomeX= GraphicHomeX= x;
  344.             GraphicOldHomeY= GraphicHomeY= y;
  345. #if WIDE256
  346.             if( GraphicMode == WindowAttrGraphic256 ){
  347.                 GraphicHomeY= 0;
  348.                 GVramRegion( GraphicHomeX, 0, GraphicHomeX+511, 1023 );
  349.             }else
  350. #endif
  351.             GVramRegion( GraphicHomeX, GraphicHomeY,
  352.                                         GraphicHomeX+511, GraphicHomeY+511 );
  353.             WindowRootScroll( HomeX, HomeY );
  354.             return    TRUE;
  355.         }
  356.     }
  357.     return    FALSE;
  358. }
  359.  
  360. void
  361. PaletInit()
  362. {
  363.     switch( GraphicMode ){
  364.         case 20:
  365.         case WindowAttrGraphic16:
  366.             B_MEMSET( (void*)0xE82000, (void*)Palet16, 16*2-1 );
  367.             break;
  368.         case 16:
  369.         case WindowAttrGraphic256:
  370.             B_MEMSET( (void*)0xE82000, (void*)Palet256, 256*2-1 );
  371.             break;
  372.         case WindowAttrGraphic65536:
  373.             setpalet65536();
  374.     }
  375. }
  376.  
  377.