}\r
\r
//panning page\r
-void panPageManual(map_view_t *pip, player_t *player, word pn)\r
+void ZC_panPageManual(map_view_t *pip, player_t *player, word pn)\r
{\r
+#define SHOWMVFUN_ ZC_ShowMV(pip, 0, 0);\r
switch(player[pn].d)\r
{\r
//right movement\r
case 3:\r
- if(pip[pip[0].pan->pn].tx >= 0 && pip[pip[0].pan->pn].tx+pip[pip[0].pan->pn].page->tw < pip[pip[0].pan->pn].page->tilesw)\r
+ if(pip[0].tx >= 0 && pip[0].tx+pip[0].page->tw < pip[0].page->tilesw)\r
{\r
if(player[pn].q<=player[pn].spt)\r
{\r
- pip[pip[0].pan->pn].page[0].dx+=4;\r
- modexShowPage(pip[pip[0].pan->pn].page);\r
+ pip[0].page->dx+=4;\r
+ SHOWMVFUN_;\r
player[pn].q++;\r
- } else { player[pn].q = 1; player[pn].d = 2; pip[pip[0].pan->pn].tx++; }\r
+ } else { player[pn].q = 1; player[pn].d = 2; pip[0].tx++; }\r
}\r
break;\r
\r
//left movement\r
case 1:\r
- if(pip[pip[0].pan->pn].tx > 0 && pip[pip[0].pan->pn].tx+pip[pip[0].pan->pn].page->tw <= pip[pip[0].pan->pn].page->tilesw)\r
+ if(pip[0].tx > 0 && pip[0].tx+pip[0].page->tw <= pip[0].page->tilesw)\r
{\r
if(player[pn].q<=player[pn].spt)\r
{\r
- pip[pip[0].pan->pn].page[0].dx-=4;\r
- modexShowPage(pip[pip[0].pan->pn].page);\r
+ pip[0].page->dx-=4;\r
+ SHOWMVFUN;\r
player[pn].q++;\r
- } else { player[pn].q = 1; player[pn].d = 2; pip[pip[0].pan->pn].tx--; }\r
+ } else { player[pn].q = 1; player[pn].d = 2; pip[0].tx--; }\r
}\r
break;\r
\r
//down movement\r
case 4:\r
- if(pip[pip[0].pan->pn].ty >= 0 && pip[pip[0].pan->pn].ty+pip[pip[0].pan->pn].page->th < pip[pip[0].pan->pn].page->tilesh)\r
+ if(pip[0].ty >= 0 && pip[0].ty+pip[0].page->th < pip[0].page->tilesh)\r
{\r
if(player[pn].q<=player[pn].spt)\r
{\r
- pip[pip[0].pan->pn].page[0].dy+=4;\r
- modexShowPage(pip[pip[0].pan->pn].page);\r
+ pip[0].page->dy+=4;\r
+ SHOWMVFUN_;\r
player[pn].q++;\r
- } else { player[pn].q = 1; player[pn].d = 2; pip[pip[0].pan->pn].ty++; }\r
+ } else { player[pn].q = 1; player[pn].d = 2; pip[0].ty++; }\r
}\r
break;\r
\r
//up movement\r
case 0:\r
- if(pip[pip[0].pan->pn].ty > 0 && pip[pip[0].pan->pn].ty+pip[pip[0].pan->pn].page->th <= pip[pip[0].pan->pn].page->tilesh)\r
+ if(pip[0].ty > 0 && pip[0].ty+pip[0].page->th <= pip[0].page->tilesh)\r
{\r
if(player[pn].q<=player[pn].spt)\r
{\r
- pip[pip[0].pan->pn].page[0].dy-=4;\r
- modexShowPage(pip[pip[0].pan->pn].page);\r
+ pip[0].page->dy-=4;\r
+ SHOWMVFUN_;\r
player[pn].q++;\r
- } else { player[pn].q = 1; player[pn].d = 2; pip[pip[0].pan->pn].ty--; }\r
+ } else { player[pn].q = 1; player[pn].d = 2; pip[0].ty--; }\r
}\r
break;\r
}\r
- //ZC_MVSync(pip);//&(pip[pip[0].pan->pn]));\r
- //if (player[pn].d!=2) printf("player[%u].d=%u player[%u].q=%u\n", pn, player[pn].d, pn, player[pn].q);\r
}\r
\r
/*\r
//pip[0].ty = pip[1].ty = ty;\r
}\r
\r
-void\r
-ZC_MVSync(map_view_t *pip)\r
+void ZC_ShowMV(map_view_t *moo, boolean vsync, boolean sr)\r
{\r
- //printf("0 dx=%d %d dy=%d %d\n", pip->dx, pip[!pip[0].pan->pn].dx, pip->dy, pip[!pip[0].pan->pn].dy);\r
- //printf("1 dx=%d %d dy=%d %d\n", pip[1].dx, pip[pip[0].pan->pn].dx, pip[1].dy, pip[pip[0].pan->pn].dy);\r
- pip[!pip[0].pan->pn].dx = pip[pip[0].pan->pn].dx;// = pip[pip[0].pan->pn].tx*TILEWH;\r
- pip[!pip[0].pan->pn].dy = pip[pip[0].pan->pn].dy;// = pip[pip[0].pan->pn].ty*TILEWH;\r
-}\r
+ word high_address, low_address, offset;\r
+ byte crtcOffset;\r
\r
-void ZC_panPageManual(map_view_t *pip, player_t *player, word pn)\r
-{\r
- switch(player[pn].d)\r
- {\r
- //right movement\r
- case 3:\r
- if(pip[0].tx >= 0 && pip[0].tx+pip[0].page->tw < pip[0].page->tilesw)\r
- {\r
- if(player[pn].q<=player[pn].spt)\r
- {\r
- pip[0].page->dx+=4;\r
- //modexShowPage(pip[0].page);\r
- VL_ShowPage(&(pip->video->page[pip[0].pan->pn]), 0, 0);\r
- player[pn].q++;\r
- } else { player[pn].q = 1; player[pn].d = 2; pip[0].tx++; }\r
- }\r
- break;\r
+ /* calculate offset */\r
+ offset = (word) moo[moo[0].pan->pn].page->data;\r
+ offset += moo[0].page->dy * (moo[0].page->width >> 2 );\r
+ offset += moo[0].page->dx >> 2;\r
\r
- //left movement\r
+ /* calculate crtcOffset according to virtual width */\r
+ switch(sr)\r
+ {\r
case 1:\r
- if(pip[0].tx > 0 && pip[0].tx+pip[0].page->tw <= pip[0].page->tilesw)\r
- {\r
- if(player[pn].q<=player[pn].spt)\r
- {\r
- pip[0].page->dx-=4;\r
- //modexShowPage(pip[0].page);\r
- VL_ShowPage(&(pip->video->page[pip[0].pan->pn]), 0, 0);\r
- player[pn].q++;\r
- } else { player[pn].q = 1; player[pn].d = 2; pip[0].tx--; }\r
- }\r
+ crtcOffset = moo[0].page->sw >> 3;\r
break;\r
-\r
- //down movement\r
- case 4:\r
- if(pip[0].ty >= 0 && pip[0].ty+pip[0].page->th < pip[0].page->tilesh)\r
- {\r
- if(player[pn].q<=player[pn].spt)\r
- {\r
- pip[0].page->dy+=4;\r
- //modexShowPage(pip[0].page);\r
- VL_ShowPage(&(pip->video->page[pip[0].pan->pn]), 0, 0);\r
- player[pn].q++;\r
- } else { player[pn].q = 1; player[pn].d = 2; pip[0].ty++; }\r
- }\r
- break;\r
-\r
- //up movement\r
+ default:\r
case 0:\r
- if(pip[0].ty > 0 && pip[0].ty+pip[0].page->th <= pip[0].page->tilesh)\r
- {\r
- if(player[pn].q<=player[pn].spt)\r
- {\r
- pip[0].page->dy-=4;\r
- //modexShowPage(pip[0].page);\r
- VL_ShowPage(&(pip->video->page[pip[0].pan->pn]), 0, 0);\r
- player[pn].q++;\r
- } else { player[pn].q = 1; player[pn].d = 2; pip[0].ty--; }\r
- }\r
+ crtcOffset = moo[0].page->width >> 3;\r
break;\r
}\r
+\r
+ high_address = HIGH_ADDRESS | (offset & 0xff00);\r
+ low_address = LOW_ADDRESS | (offset << 8);\r
+\r
+ /* wait for appropriate timing and then program CRTC */\r
+ if(vsync) while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));\r
+ outpw(CRTC_INDEX, high_address);\r
+ outpw(CRTC_INDEX, low_address);\r
+ outp(CRTC_INDEX, 0x13);\r
+ outp(CRTC_DATA, crtcOffset);\r
+\r
+ /* wait for one retrace */\r
+ if(vsync) while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
+\r
+ /* do PEL panning here */\r
+ outp(AC_INDEX, 0x33);\r
+ outp(AC_INDEX, (moo[0].page->dx & 0x03) << 1);\r
}\r
\r
/*map_t\r