switch(vq)\r
{\r
case 1:\r
-// case 8: //320x240 no buffer\r
+ case 8: //320x240 no buffer\r
//CRTParmCount = sizeof(ModeX_320x240regs) / sizeof(ModeX_320x240regs[0]);\r
/*for(i=0; i<CRTParmCount; i++) {\r
outpw(CRTC_INDEX, ModeX_320x240regs[i]);\r
}\r
break;\r
}\r
-// VL_SetLineWidth (cm.offset, gv);\r
- gv->video.ofs.displayofs = 0;\r
- gv->video.ofs.bufferofs = gv->video.page[0].width*gv->video.page[0].height;//gvar->video.page[0].pagesize;\r
-// gv->video.curr_mode=vq;\r
+//-- VL_SetLineWidth (cm.offset, gv);\r
+ //gv->video.ofs.displayofs = 0;\r
+ //gv->video.ofs.bufferofs = gv->video.page[0].width*gv->video.page[0].height;//gvar->video.page[0].pagesize;\r
+ gv->video.curr_mode=vq;\r
gv->video.VL_Started=1;\r
}\r
\r
VL_vgaSetMode(TEXT_MODE);\r
}\r
\r
+#if 0\r
page_t\r
modexDefaultPage(page_t *p)\r
{\r
page_t page;\r
-\r
/* default page values */\r
//page.data = VGA;\r
//page.data = (byte far *)(vga_state.vga_graphics_ram);\r
page.pagesize = (word)(page.stridew)*page.height;\r
page.pi=page.width*4;\r
page.id = 0;\r
-\r
+ if(ggvv->video.curr_mode = 1)\r
+ {\r
+ page.width += TILEWHD;\r
+ page.height += TILEWHD;\r
+ }\r
return page;\r
}\r
-#if 0\r
+#endif\r
page_t\r
-modexDefaultPage(page_t *p, video_t *v)\r
+modexDefaultPage(page_t *p, global_game_variables_t *gvar)\r
{\r
page_t page;\r
\r
page.sh = p->sh;\r
page.width = p->sw;\r
page.height = p->sh;\r
- if(v->curr_mode == 1)\r
+ if(gvar->video.curr_mode == 1)\r
{ page.width += TILEWHD;\r
page.height += TILEWHD; }\r
page.ti.tw = page.sw/TILEWH;\r
\r
return page;\r
}\r
-#endif\r
+\r
/* returns the next page in contiguous memory\r
* the next page will be the same size as p, by default\r
*/\r
}\r
}\r
\r
-void modexHiganbanaPageSetup(video_t *video)\r
+void modexHiganbanaPageSetup(global_game_variables_t *gvar)\r
{\r
- video->vmem_remain=65535U;\r
- video->num_of_pages=0;\r
- (video->page[0]) = modexDefaultPage(&(video->page[0])/*, video*/); video->num_of_pages++; //video->page[0].width += (TILEWHD); video->page[0].height += (TILEWHD);\r
- (video->page[1]) = modexNextPage(&(video->page[0])); video->num_of_pages++;\r
-//0000 (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), (video->page[0]).width, TILEWH*4); video->num_of_pages++;\r
-//0000 (video->page[3]) = (video->page[2]); video->num_of_pages++;\r
-//// (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), TILEWH*4, TILEWH*4); video->num_of_pages++;\r
-//// (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), video->page[0].sw, 208); video->num_of_pages++;\r
- (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), video->page[0].width, 96); video->num_of_pages++;\r
- (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), video->page[0].width, 96); video->num_of_pages++;\r
- modexCalcVmemRemain(video);\r
-\r
- video->sp=video->p = 0; //showpage\r
- video->dorender = 1; //render\r
- video->vh=video->page[0].height+video->page[1].height+video->page[2].height+video->page[3].height;\r
-\r
- VL_Initofs(video);\r
+ gvar->video.vmem_remain=65535U;\r
+ gvar->video.num_of_pages=0;\r
+ (gvar->video.page[0]) = modexDefaultPage(&(gvar->video.page[0]), gvar); gvar->video.num_of_pages++; //gvar->video.page[0].width += (TILEWHD); gvar->video.page[0].height += (TILEWHD);\r
+ (gvar->video.page[1]) = modexNextPage(&(gvar->video.page[0])); gvar->video.num_of_pages++;\r
+//0000 (gvar->video.page[2]) = modexNextPageFlexibleSize(&(gvar->video.page[1]), (gvar->video.page[0]).width, TILEWH*4); gvar->video.num_of_pages++;\r
+//0000 (gvar->video.page[3]) = (gvar->video.page[2]); gvar->video.num_of_pages++;\r
+//// (gvar->video.page[2]) = modexNextPageFlexibleSize(&(gvar->video.page[1]), TILEWH*4, TILEWH*4); gvar->video.num_of_pages++;\r
+//// (gvar->video.page[3]) = modexNextPageFlexibleSize(&(gvar->video.page[2]), gvar->video.page[0].sw, 208); gvar->video.num_of_pages++;\r
+ (gvar->video.page[2]) = modexNextPageFlexibleSize(&(gvar->video.page[1]), gvar->video.page[0].width, 96); gvar->video.num_of_pages++;\r
+ (gvar->video.page[3]) = modexNextPageFlexibleSize(&(gvar->video.page[2]), gvar->video.page[0].width, 96); gvar->video.num_of_pages++;\r
+ modexCalcVmemRemain(&gvar->video);\r
+\r
+ gvar->video.sp=gvar->video.p = 0; //showpage\r
+ gvar->video.dorender = 1; //render\r
+ gvar->video.vh=gvar->video.page[0].height+gvar->video.page[1].height+gvar->video.page[2].height+gvar->video.page[3].height;\r
+\r
+ VL_Initofs(&gvar->video);\r
//doslib origi var\r
- video->vga_state.omemptr= vga_state.vga_graphics_ram;\r
- video->vga_state.vga_draw_stride= vga_state.vga_draw_stride;\r
- video->vga_state.vga_draw_stride_limit= vga_state.vga_draw_stride_limit;\r
+ gvar->video.vga_state.omemptr= vga_state.vga_graphics_ram;\r
+ gvar->video.vga_state.vga_draw_stride= vga_state.vga_draw_stride;\r
+ gvar->video.vga_state.vga_draw_stride_limit= vga_state.vga_draw_stride_limit;\r
//sprite render switch and bgpreservation switch\r
- video->vga_state.rss= 1;\r
- video->vga_state.bgps= 1;\r
+ gvar->video.vga_state.rss= 1;\r
+ gvar->video.vga_state.bgps= 1;\r
\r
//setup the buffersize\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
+ gvar->video.page[0].dx=gvar->video.page[0].dy=\r
+ gvar->video.page[1].dx=gvar->video.page[1].dy=TILEWH; // 1 tile size buffer\r
+ gvar->video.page[2].dx=gvar->video.page[2].dy=\r
+ gvar->video.page[3].dx=gvar->video.page[3].dy=0; // cache pages are buffer wwww\r
+\r
+ gvar->video.page[0].tlx=gvar->mv[0].tx*TILEWH;\r
+ gvar->video.page[0].tly=gvar->mv[0].ty*TILEWH;\r
}\r
\r
//\r
low_address = LOW_ADDRESS | (offset << 8);\r
\r
/* wait for appropriate timing and then program CRTC */\r
-//+=+= while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));\r
+//+=+= while ((inp(STATUS_REGISTER_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
-//+=+= while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
+//+=+= while (!(inp(STATUS_REGISTER_1) & VRETRACE));\r
\r
/* do PEL panning here */\r
outp(AC_INDEX, 0x33);\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
+ if(vsync) while ((inp(STATUS_REGISTER_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
+ if(vsync) while (!(inp(STATUS_REGISTER_1) & VRETRACE));\r
\r
// do PEL panning here\r
outp(AC_INDEX, 0x33);\r
/*byte *\r
modexNewPal() {\r
byte *ptr;\r
- ptr = m a l l o c(PAL_SIZE);\r
+ ptr = mAlloc(PAL_SIZE);\r
\r
// handle errors\r
if(!ptr) {\r
- printf("Could not allocate palette.\n");\r
+ printf("Could not Allocate palette.\n");\r
}\r
\r
return ptr;\r
fclose(file);\r
}\r
\r
-void VL_LoadPalFile(const char *filename, byte *palette, global_game_variables_t *gvar)\r
-{\r
- VL_LoadPalFilewithoffset(filename, palette, 9, gvar);\r
-// VL_LoadPalFileCore(palette);\r
-}\r
-\r
-void VL_LoadPalFileCore(byte *palette, global_game_variables_t *gvar)\r
-{\r
- VL_LoadPalFilewithoffset("data/16.pal", palette, 0, gvar);\r
-}\r
+#define COREPALSIZE 9//27 //3*9\r
\r
-void VL_LoadPalFilewithoffset(const char *filename, byte *palette, word o, global_game_variables_t *gvar)\r
+void VLL_LoadPalFilewithoffset(const char *filename, byte *palette, word o, word palsize, global_game_variables_t *gvar)\r
{\r
int fd;\r
+ byte *newpalette;\r
\r
fd = open(filename,O_RDONLY|O_BINARY);\r
if (fd >= 0) {\r
- read(fd,palette, PAL_SIZE);\r
+ read(fd,palette, palsize*3);\r
close(fd);\r
\r
- VL_UpdatePaletteWrite(palette, o, gvar);\r
+ if(palsize==COREPALSIZE) newpalette = palette; else{ //if core then load it\r
+ newpalette = &palette[3]; //skip overscan color\r
+ if(!o) o++;\r
+ }\r
+ VL_UpdatePaletteWrite(newpalette, o, palsize, gvar);\r
}\r
}\r
\r
-void VL_UpdatePaletteWrite(byte *palette, word o, global_game_variables_t *gvar)\r
+void VL_LoadPalFile(const char *filename, byte *palette, global_game_variables_t *gvar)\r
+{\r
+ VLL_LoadPalFilewithoffset(filename, palette,\r
+ 0, //overwrite core/system palette\r
+// COREPALSIZE, //preserved core/system palette\r
+ PAL_SIZE/3, gvar);\r
+}\r
+\r
+void VL_LoadPalFileCore(byte *palette, global_game_variables_t *gvar)\r
+{\r
+ VLL_LoadPalFilewithoffset("data/16.pal", palette, 0, COREPALSIZE, gvar);\r
+}\r
+\r
+void VL_UpdatePaletteWrite(byte *palette, word o, word p, global_game_variables_t *gvar)\r
{\r
word i;\r
- vga_palette_lseek(/*1+*/o);\r
- //for (i=o;i < 256-o;i++)\r
- for (i=0;i < 256-o;i++)\r
+\r
+ vga_palette_lseek(o);\r
+ for (i=0;i < p-o;i++)\r
vga_palette_write(palette[(i*3)+0]>>2,palette[(i*3)+1]>>2,palette[(i*3)+2]>>2);\r
\r
VL_PaletteSync(gvar);\r
}\r
\r
word\r
-modexPalOverscan(word col)\r
+VL_modexPalOverscan(byte *p, word col)\r
{\r
+ int i;\r
//modexWaitBorder();\r
vga_wait_for_vsync();\r
outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */\r
- outp(PAL_DATA_REG, col);\r
+ for(i=col; i<(3+col); i++)\r
+ {\r
+ outp(PAL_DATA_REG, p[i]);\r
+ }\r
+// modexPalSave(p);\r
return col;\r
}\r
+\r
//check 16_vl_1.c\r
\r
void modexputPixel(page_t *page, int x, int y, byte color)\r
}\r
}\r
\r
-void modexprint(page_t *page, sword x, sword y, word t, boolean tlsw, word col, word bgcol, boolean sw, const byte *str)\r
+void modexprint(page_t *page, sword x, sword y, word t, boolean tlsw, word color, word bgcolor, boolean vidsw, const byte *str)\r
{\r
word s, o, w;\r
word x_draw;\r
word addrr;\r
byte c;\r
\r
- switch(sw)\r
+ switch(vidsw)\r
{\r
case 0:\r
printf("%s\n", str);\r
break;\r
case 1:\r
if(tlsw){ x-=page->tlx; y-=page->tly; }\r
- x_draw = x/4;\r
+ x_draw = x>>2;\r
addrq = (page->stridew) * y + (word)(x_draw) +\r
((word)page->data);\r
addrr = addrq;\r
// no need for inline assembly!\r
// NTS: It might even be faster to just let the modexDrawChar point directly at ROM font than to copy per char! --J.C.\r
_fmemcpy(romFontsData.l,MK_FP(s,o+(w*c))/*ROM font location*/,w/*char size*/);\r
- modexDrawChar(page, x_draw/*for mode X planar use*/, t, col, bgcol, addrr);\r
+ modexDrawChar(page, x_draw/*for mode X planar use*/, t, color, bgcolor, addrr);\r
x_draw += 8; /* track X for edge of screen */\r
addrr += 2; /* move 8 pixels over (2 x 4 planar pixels per byte) */\r
}\r
}\r
}\r
\r
+// short hand of modexprint\r
+void VL_print(const byte *str, nibble pagenum, global_game_variables_t *gvar)\r
+{\r
+ modexprint(&(gvar->video.page[pagenum]), gvar->video.print.x, gvar->video.print.y, gvar->video.print.t, gvar->video.print.tlsw, gvar->video.print.color, gvar->video.print.bgcolor, gvar->video.VL_Started, str);\r
+}\r
+\r
/* palette dump on display! */\r
-void modexpdump(page_t *pee)\r
+void modexpdump(nibble pagenum, global_game_variables_t *gvar)\r
{\r
int mult=(QUADWH);\r
int palq=(mult)*TILEWH;\r
int palx, paly;\r
for(paly=TILEWH*8; paly<palq+TILEWH*8; paly+=mult){\r
for(palx=TILEWH*12; palx<palq+TILEWH*12; palx+=mult){\r
- modexClearRegion(pee, palx+TILEWH, paly+TILEWH, mult, mult, palcol);\r
+ modexClearRegion(&gvar->video.page[pagenum], palx+TILEWH, paly+TILEWH, mult, mult, palcol);\r
palcol++;\r
}\r
}\r
+ modexPalSave(gvar->video.palette);\r
}\r
#if 0\r
/////////////////////////////////////////////////////////////////////////////\r
\r
void\r
modexWaitBorder() {\r
- while(inp(INPUT_STATUS_1) & 8) {\r
+ while(inp(STATUS_REGISTER_1) & 8) {\r
// spin\r
}\r
\r
- while(!(inp(INPUT_STATUS_1) & 8)) {\r
+ while(!(inp(STATUS_REGISTER_1) & 8)) {\r
//spin\r
}\r
}\r
void\r
modexWaitBorder_start()\r
{\r
- while(inp(INPUT_STATUS_1) & 8) {\r
+ while(inp(STATUS_REGISTER_1) & 8) {\r
// spin\r
}\r
\r
void\r
modexWaitBorder_end()\r
{\r
- while(!(inp(INPUT_STATUS_1) & 8)) {\r
+ while(!(inp(STATUS_REGISTER_1) & 8)) {\r
// spin\r
}\r
\r
// printf("========================================\n");\r
printf(" Virtual Screen: %dx", v->page[0].width); printf("%d ", v->page[0].height); printf("Tile: %dx", v->page[0].ti.tilesw); printf("%d", v->page[0].ti.tilesh); printf("=((Virtual Screen)/16)\n");\r
printf(" Screen: %dx", v->page[0].sw); printf("%d ", v->page[0].sh); printf("Tile: %dx", v->page[0].ti.tw); printf("%d", v->page[0].ti.th); printf("=((Screen)/16)\n");\r
-\r
- printf(" Free Video Memory: %u\n", v->vmem_remain);\r
- printf(" page");\r
- for(i=0; i<v->num_of_pages;i++)\r
+ printf(" vga_stride: %u ", vga_state.vga_stride);\r
+ printf("pagestride: %u ", v->page[0].stridew);\r
+ printf("draw_stride: %u ", vga_state.vga_draw_stride);\r
+ printf("draw_stride_limit: %u\n", vga_state.vga_draw_stride_limit);\r
+\r
+ if(v->vmem_remain)\r
+ printf(" Free Video Memory: %u\n", v->vmem_remain);\r
+ if(v->num_of_pages)\r
{\r
- printf(" [%u]=", i);\r
- printf("(%Fp)", (v->page[i].data));\r
- printf(" size=%u ", v->page[i].pagesize);\r
- printf("w=%-3lu h=%-3lu ", (unsigned long)v->page[i].width, (unsigned long)v->page[i].height);\r
- printf("sw=%-3lu sh=%-3lu ", (unsigned long)v->page[i].sw, (unsigned long)v->page[i].sh);\r
- printf("pi=%u", v->page[i].pi);\r
- printf("\n");\r
+ printf(" page");\r
+ for(i=0; i<v->num_of_pages;i++)\r
+ {\r
+ printf(" [%u]=", i);\r
+ printf("(%Fp)", (v->page[i].data));\r
+ printf(" size=%u ", v->page[i].pagesize);\r
+ printf("w=%-3lu h=%-3lu ", (unsigned long)v->page[i].width, (unsigned long)v->page[i].height);\r
+ printf("sw=%-3lu sh=%-3lu ", (unsigned long)v->page[i].sw, (unsigned long)v->page[i].sh);\r
+ printf("pi=%u", v->page[i].pi);\r
+ printf("\n");\r
+ }\r
}\r
}\r