page_t result;\r
\r
result.data = p->data + (p->pagesize);\r
- result.dx = 0;\r
- result.dy = 0;\r
+ result.dx = p->dx; // not used anymore we use page[0].dx\r
+ result.dy = p->dy; // not used anymore we use page[0].dy\r
result.sw = p->sw;\r
result.sh = p->sh;\r
result.width = p->width;\r
page_t result;\r
\r
result.data = p->data + (p->pagesize); /* compute the offset */\r
- result.dx = 0;\r
- result.dy = 0;\r
+ result.dx = 0; // not used anymore we use page[0].dx\r
+ result.dy = 0; // not used anymore we use page[0].dy\r
result.sw = x;\r
result.sh = y;\r
result.width = x;\r
video->r=1;\r
\r
//setup the buffersize\r
- video->page[0].dy=video->page[0].dx=\r
+ video->page[0].dx=video->page[0].dy=\r
video->page[1].dx=video->page[1].dy=TILEWH; // 1 tile size buffer\r
video->page[2].dx=video->page[2].dy=\r
video->page[3].dx=video->page[3].dy=0; // cache pages are buffer wwww\r
void\r
modexShowPage(page_t *page) {\r
word high_address, low_address, offset;\r
-// byte crtcOffset;\r
+ byte crtcOffset;\r
\r
/* calculate offset */\r
offset = (word) page->data;\r
- offset += page->dy * (page->width >> 2 );\r
- offset += page->dx >> 2;\r
+ offset += page[0].dy * (page->width >> 2 );\r
+ offset += page[0].dx >> 2;\r
\r
/* calculate crtcOffset according to virtual width */\r
-// crtcOffset = page->width >> 3;\r
+ crtcOffset = page->width >> 3;\r
\r
high_address = HIGH_ADDRESS | (offset & 0xff00);\r
low_address = LOW_ADDRESS | (offset << 8);\r
//+=+= 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
+ outp(CRTC_INDEX, 0x13);\r
+ outp(CRTC_DATA, crtcOffset);\r
\r
/* wait for one retrace */\r
//+=+= while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
\r
/* do PEL panning here */\r
outp(AC_INDEX, 0x33);\r
- outp(AC_INDEX, (page->dx & 0x03) << 1);\r
+ outp(AC_INDEX, (page[0].dx & 0x03) << 1);\r
}\r
\r
+//another variant\r
+//args: page, vertical sync switch, screen resolution switch, page0 switch\r
+void\r
+VL_ShowPage(page_t *page, boolean vsync, boolean sr) {\r
+ word high_address, low_address, offset;\r
+ byte crtcOffset;\r
+\r
+ /* calculate offset */\r
+ offset = (word) page->data;\r
+ offset += page[0].dy * (page->width >> 2 );\r
+ offset += page[0].dx >> 2;\r
+\r
+ /* calculate crtcOffset according to virtual width */\r
+ switch(sr)\r
+ {\r
+ case 1:\r
+ crtcOffset = page->sw >> 3;\r
+ break;\r
+ default:\r
+ case 0:\r
+ crtcOffset = 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, (page[0].dx & 0x03) << 1);\r
+}\r
+\r
+//=============================================================================\r
+\r
void\r
modexPanPage(page_t *page, int dx, int dy) {\r
- page->dx = dx;\r
- page->dy = dy;\r
+ page[0].dx = dx;\r
+ page[0].dy = dy;\r
}\r
\r
void\r
}\r
\r
\r
+void VL_LoadPalFile(const char *filename, byte *palette)\r
+{\r
+ int fd;\r
+\r
+ fd = open(filename,O_RDONLY|O_BINARY);\r
+ if (fd >= 0) {\r
+ word i;\r
+\r
+ read(fd,palette,768);\r
+ close(fd);\r
+\r
+ vga_palette_lseek(0);\r
+ for (i=0;i < 256;i++) vga_palette_write(palette[(i*3)+0]>>2,palette[(i*3)+1]>>2,palette[(i*3)+2]>>2);\r
+ }\r
+}\r
+\r
+\r
void\r
modexSavePalFile(char *filename, byte *pal) {\r
//unsigned int i;\r