/* Project 16 Source Code~\r
- * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
+ * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
*\r
* This file is part of Project 16.\r
*\r
break;\r
}\r
\r
-// gv->video.page[0].tw = gv->video.page[0].sw/TILEWH;\r
-// gv->video.page[0].th = gv->video.page[0].sh/TILEWH;\r
+// gv->video.page[0].ti.tw = gv->video.page[0].sw/TILEWH;\r
+// gv->video.page[0].ti.th = gv->video.page[0].sh/TILEWH;\r
\r
//TODO MAKE FLEXIBLE~\r
-// gv->video.page[0].tilemidposscreenx = gv->video.page[0].tilesw;\r
-// gv->video.page[0].tilemidposscreeny = (gv->video.page[0].tilesh/2)+1;\r
+// gv->video.page[0].ti.tilemidposscreenx = gv->video.page[0].ti.tilesw;\r
+// gv->video.page[0].ti.tilemidposscreeny = (gv->video.page[0].ti.tilesh/2)+1;\r
}\r
\r
void\r
page.sh = p->sh;\r
page.width = p->sw+TILEWHD;\r
page.height = p->sh+TILEWHD;\r
- page.tw = page.sw/TILEWH;\r
- page.th = page.sh/TILEWH;\r
- page.tilesw=page.width/TILEWH;\r
- page.tilesh=page.height/TILEWH;\r
- page.tilemidposscreenx = page.tw/2;\r
- page.tilemidposscreeny = (page.th/2)+1;\r
+ page.ti.tw = page.sw/TILEWH;\r
+ page.ti.th = page.sh/TILEWH;\r
+ page.ti.tilesw=page.width/TILEWH;\r
+ page.ti.tilesh=page.height/TILEWH;\r
+ page.ti.tilemidposscreenx = page.ti.tw/2;\r
+ page.ti.tilemidposscreeny = (page.ti.th/2)+1;\r
page.stridew=page.width/4;\r
page.pagesize = (word)(page.stridew)*page.height;\r
page.pi=page.width*4;\r
result.sh = p->sh;\r
result.width = p->width;\r
result.height = p->height;\r
- result.tw = p->tw;\r
- result.th = p->th;\r
- result.tilesw = p->tilesw;\r
- result.tilesh = p->tilesh;\r
+ result.ti.tw = p->ti.tw;\r
+ result.ti.th = p->ti.th;\r
+ result.ti.tilesw = p->ti.tilesw;\r
+ result.ti.tilesh = p->ti.tilesh;\r
result.stridew=p->stridew;\r
result.pagesize = p->pagesize;\r
result.pi=result.width*4;\r
result.sh = y;\r
result.width = x;\r
result.height = y;\r
- result.tw = result.sw/TILEWH;\r
- result.th = result.sh/TILEWH;\r
- result.tilesw=result.width/TILEWH;\r
- result.tilesh=result.height/TILEWH;\r
+ result.ti.tw = result.sw/TILEWH;\r
+ result.ti.th = result.sh/TILEWH;\r
+ result.ti.tilesw=result.width/TILEWH;\r
+ result.ti.tilesh=result.height/TILEWH;\r
result.id = p->id+1;\r
- result.stridew=p->sw/4;//result.width/4;\r
+ result.stridew=result.width/4;//p->sw/4;\r
result.pagesize = (word)(result.stridew)*result.height;\r
- switch(result.id)\r
+/* switch(result.id)\r
{\r
case 2:\r
result.pi=p->width*4;\r
case 3:\r
result.pi=p->pi;\r
break;\r
- }\r
+ }*/\r
+ result.pi=result.width*4;\r
\r
return result;\r
}\r
}\r
}\r
\r
+void VL_Initofs(video_t *video)\r
+{\r
+ video->ofs.offscreen_ofs = video->page[0].pagesize+video->page[1].pagesize;//(vga_state.vga_stride * vga_state.vga_height);\r
+ video->ofs.pattern_ofs = (uint16_t)video->page[2].data;\r
+}\r
+\r
void modexHiganbanaPageSetup(video_t *video)\r
{\r
video->vmem_remain=65535U;\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].width, 176); 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, 172); video->num_of_pages++;\r
-// (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), 72, 128); 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
- video->p=0;\r
+\r
+ video->sp=video->p=0;\r
video->r=1;\r
+ video->vh=video->page[0].height+video->page[1].height+video->page[3].height-8;//+video->page[2].height\r
+\r
+ VL_Initofs(video);\r
//doslib origi var\r
video->omemptr= vga_state.vga_graphics_ram;\r
video->vga_draw_stride= vga_state.vga_draw_stride;\r
video->vga_draw_stride_limit= vga_state.vga_draw_stride_limit;\r
+ //sprite render switch\r
+ video->rss=0;\r
\r
//setup the buffersize\r
video->page[0].dx=video->page[0].dy=\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
+ // calculate offset\r
offset = (word) page->data;\r
- offset += page[0].dy * (page->width >> 2 );\r
- offset += page[0].dx >> 2;\r
+ offset += page->dy * (page->width >> 2 );\r
+ offset += page->dx >> 2;\r
\r
- /* calculate crtcOffset according to virtual width */\r
+ // calculate crtcOffset according to virtual width\r
switch(sr)\r
{\r
case 1:\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
+ // 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
+ // wait for one retrace\r
if(vsync) while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
\r
- /* do PEL panning here */\r
+ // do PEL panning here\r
outp(AC_INDEX, 0x33);\r
- outp(AC_INDEX, (page[0].dx & 0x03) << 1);\r
- vga_state.vga_graphics_ram = (VGA_RAM_PTR)page[0].data;\r
+ outp(AC_INDEX, (page->dx & 0x03) << 1);\r
+ vga_state.vga_graphics_ram = (VGA_RAM_PTR)page->data;\r
}\r
\r
//=============================================================================\r
\r
/* handle errors */\r
if(!ptr) {\r
- printf("Could not allocate palette.\n");\r
- exit(-1);\r
+ printf("Could not allocate palette.\n");\r
}\r
\r
return ptr;\r
file = fopen(filename, "rb");\r
if(!file) {\r
printf("Could not open palette file: %s\n", filename);\r
- exit(-2);\r
}\r
\r
/* read the file */\r
file = fopen(filename, "wb");\r
if(!file) {\r
printf("Could not open %s for writing\n", filename);\r
- exit(-2);\r
}\r
\r
/* write the data to the file */\r
/* set map mask to all 4 planes */\r
outpw(SC_INDEX, 0xff02);\r
//_fmemset(VGA, color, 16000);\r
- _fmemset(Where, color, page->width*(page->height)/4);\r
+ _fmemset(Where, color, page->stridew*page->height);\r
+}\r
+\r
+//\r
+// pattern filler from joncampbell123's code\r
+//\r
+void VL_PatternDraw(video_t *video, word pn, boolean sw, boolean allsw)\r
+{\r
+ unsigned int i,j,o, d,h,s;\r
+ word w;\r
+\r
+ switch(sw)\r
+ {\r
+ case 0:\r
+ w=vga_state.vga_width;\r
+ d=0;\r
+ s=vga_state.vga_stride;\r
+ switch(allsw)\r
+ {\r
+ case 0:\r
+ h=vga_state.vga_height;\r
+ break;\r
+ case 1:\r
+ h=video->vh;\r
+ break;\r
+ }\r
+ break;\r
+ default:\r
+ w=video->page[pn].width;\r
+ d=(0x10000UL - (uint16_t)video->page[pn].data);\r
+ s=video->page[pn].stridew;\r
+ switch(allsw)\r
+ {\r
+ case 0:\r
+ h=video->page[pn].height;\r
+ break;\r
+ case 1:\r
+ if(!pn) h=video->vh;\r
+ else h=video->page[pn].height;\r
+ break;\r
+ }\r
+ break;\r
+ }\r
+\r
+ /* fill screen/pattern with a distinctive pattern */\r
+ for (i=0;i < w;i++) {\r
+ o = (i >> 2) + d;\r
+ vga_write_sequencer(0x02/*map mask*/,1 << (i&3));\r
+ for (j=0;j < h;j++,o += s)\r
+ vga_state.vga_graphics_ram[o] = (i^j)&15; // VRL samples put all colors in first 15!\r
+ }\r
}\r
\r
void\r
}\r
}\r
\r
-void modexprintmeminfo(video_t *v)\r
+//\r
+// printings of video memory information\r
+//\r
+void VL_PrintmodexmemInfo(video_t *v)\r
{\r
byte i;\r
- printf("video memory remaining: %u\n", v->vmem_remain);\r
- printf("page ");\r
+\r
+// printf("========================================\n");\r
+ printf("VL_PrintmodexmemInfo:\n");\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
{\r
printf(" [%u]=", i);\r
printf("(%Fp)", (v->page[i].data));\r
printf(" size=%u ", v->page[i].pagesize);\r
- printf("w=%lu h=%lu ", (unsigned long)v->page[i].width, (unsigned long)v->page[i].height);\r
- printf("sw=%lu sh=%lu ", (unsigned long)v->page[i].sw, (unsigned long)v->page[i].sh);\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