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
+ if(!video->bgps)\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
+ }else{\r
+ video->ofs.offscreen_ofs = 0;\r
+ video->ofs.pattern_ofs = 0;//(uint16_t)video->page[0].data;\r
+ }\r
+}\r
+\r
void modexHiganbanaPageSetup(video_t *video)\r
{\r
video->vmem_remain=65535U;\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, video->page[2].height); 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
- 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
+ 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
//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
+ //sprite render switch and bgpreservation switch\r
+ video->rss= 1;\r
+ video->bgps= 1;\r
\r
//setup the buffersize\r
video->page[0].dx=video->page[0].dy=\r
outp(AC_INDEX, 0x33);\r
outp(AC_INDEX, (page[0].dx & 0x03) << 1);\r
}\r
+\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 the case where we just update */\r
if(iter == 0) {\r
- modexPalUpdate1(palette);\r
+ modexPalUpdate(palette);\r
return;\r
}\r
\r
tmppal[i] = 63;\r
}\r
}\r
- modexPalUpdate1(tmppal);\r
+ modexPalUpdate(tmppal);\r
iter--;\r
dim += fade;\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
if (fd >= 0) {\r
word i;\r
\r
- read(fd,palette,768);\r
+ read(fd,palette, PAL_SIZE);\r
close(fd);\r
\r
vga_palette_lseek(0);\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
\r
\r
/* utility */\r
-void\r
-modexPalUpdate(bitmap_t *bmp, word *i, word qp, word aqoffset)\r
-{\r
- byte *p = bmp->palette;\r
- word w=0;\r
- word q=0;\r
- word qq=0;\r
- static word a[PAL_SIZE]; //palette array of change values!\r
- word z=0, aq=0, aa=0, pp=0;\r
-\r
- //modexWaitBorder();\r
- vga_wait_for_vsync();\r
- if((*i)==0)\r
- {\r
- memset(a, -1, sizeof(a));\r
- outp(PAL_WRITE_REG, 0); /* start at the beginning of palette */\r
- }\r
- else if(qp==0)\r
- {\r
- q=(*i);\r
- }\r
- else\r
- {\r
- q=(*i);\r
- qq=(*i)/3;\r
-// printf("q: %02d\n", (q));\r
-// printf("qq: %02d\n", (qq));\r
- //printf(" (*i)-q=%02d\n", (*i)-q);\r
- outp(PAL_WRITE_REG, qq); /* start at the beginning of palette */\r
- }\r
- if((*i)<PAL_SIZE/2 && w==0)\r
- {\r
- for(; (*i)<PAL_SIZE/2; (*i)++)\r
- {\r
- //if(i%3==0 && (p[i+5]==p[i+4] && p[i+4]==p[i+3] && p[i+3]==p[i+2] && p[i+2]==p[i+1] && p[i+1]==p[i] && p[i+5]==p[i]))\r
-//____ if((qp>0)&&((*i)-q)%3==0 && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5])) outp(PAL_DATA_REG, p[(*i)-q]); else\r
- if(((((*i)-q)%3==0)) && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5]))\r
- {\r
- w++;\r
- break;\r
- }\r
- else if(qp>0 && (*i)>=(qp) && (*i)<((qp)+3))\r
- {\r
- //printf("qp=%d\n", qp);\r
- //printf(" (*i)=%d a[%d]=%d\n", (*i), qp, a[qp]);\r
- printf(" %d's color=%d\n", (*i), (a[qp])-(bmp->offset*3)+qp);\r
- //outp(PAL_DATA_REG, p[((a[qp])-(bmp->offset*3)+qp)]);// fix this shit!\r
- if((*i)+1==(qp)+3){ w++; /*(*i)++;*/ break; }\r
- }\r
- else\r
- {\r
- if(bmp->offset==0 && (*i)<3 && q==0) outp(PAL_DATA_REG, 0);\r
- else\r
- if(qp==0) outp(PAL_DATA_REG, p[(*i)-q]);\r
- else{ //outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3)+qp)]);\r
- printf("p[]=%d qp=%d p[]-qp=%d\n", ((*i)-(bmp->offset*3)), qp, ((*i)-(bmp->offset*3))+qp); }\r
- }\r
- }\r
- //if(qp>0) printf("qp=%d\n", qp);\r
- //if(qp>0) printf(" (*i)=%d\n", (*i)/3);\r
- }\r
- //modexWaitBorder(); /* waits one retrace -- less flicker */\r
- vga_wait_for_vsync();\r
- if((*i)>=PAL_SIZE/2 && w==0)\r
- {\r
- for(; (*i)<PAL_SIZE; (*i)++)\r
- {\r
-//____ if((qp>0)&&((*i)-q)%3==0 && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5])) outp(PAL_DATA_REG, p[(*i)-q]); else\r
- if(((((*i)-q)%3==0)) && (p[((*i)-q)]==p[((*i)-q)+3] && p[((*i)-q)+1]==p[((*i)-q)+4] && p[((*i)-q)+2]==p[((*i)-q)+5]))\r
- {\r
- w++;\r
- break;\r
- }\r
- else if(qp>0 && (*i)>=(qp) && (*i)<((qp)+3))\r
- {\r
- //printf("qp=%d\n", qp);\r
- //printf(" (*i)=%d a[%d]=%d\n", (*i), qp, a[qp]);\r
- printf(" %d's color=%d\n", (*i), (a[qp]-(bmp->offset*3)+qp));\r
- //outp(PAL_DATA_REG, p[((a[qp])-(bmp->offset*3)+qp)]);// fix this shit!\r
- if((*i)+1==(qp)+3){ w++; /*(*i)++;*/ break; }\r
- }\r
- else\r
- {\r
- if(qp==0) outp(PAL_DATA_REG, p[(*i)-q]);\r
- else{ //outp(PAL_DATA_REG, p[((*i)-(bmp->offset*3)+qp)]);\r
- printf("p[]=%d qp=%d p[]-qp=%d\n", ((*i)-(bmp->offset*3)), qp, ((*i)-(bmp->offset*3))+qp); }\r
- }\r
- }\r
- //printf(" (*i)=%d\n", (*i)/3);\r
- }\r
-\r
-printf("\nqqqqqqqq\n\n");\r
-\r
- //palette checker~\r
- if(q>0 && qp==0)\r
- {\r
- long lq;\r
- long bufSize = (bmp->width * bmp->height);\r
- pp = q;\r
- //printf("1(*i)=%02d\n", (*i)/3);\r
- //printf("1z=%02d\n", z/3);\r
- modexchkcolor(bmp, &q, &a, &aa, &z, i);\r
- //printf("2(*i)=%02d\n", (*i)/3);\r
- //printf("2z=%02d\n", z/3);\r
- aq=0;\r
-aqpee:\r
- while(aq<=aa)\r
- {\r
-// printf("a[%02d]=(%d)\n", aq, a[aq]);\r
- if(a[aq]==-1) aq++;\r
- else { aqoffset++; break; }\r
- }\r
-//update the image data here!\r
- for(lq=0; lq<bufSize; lq++)\r
- {\r
- /*\r
- note to self\r
- use a[qp] instead of bmp->offset for this spot!\r
- NO! wwww\r
- */\r
-\r
- /*\r
- Facking bloody point the values of the changed palette to correct values.... major confusion! wwww\r
- */\r
-\r
- //(offset/bmp->offset)*bmp->offset\r
-\r
-\r
- //printf("%02d ",bmp->data[lq]+bmp->offset);\r
- //if(lq > 0 && lq%bmp->width==0) printf("\n");\r
- //printf("%02d_", bmp->data[lq]+bmp->offset);\r
- /*if(bmp->data[lq]+bmp->offset==aq)\r
- {\r
- //printf("%02d", bmp->data[lq]);\r
- //printf("\n%02d\n", bmp->offset);\r
- printf("aq=%02d ", aq);\r
- printf("a[aq]=%02d ", a[aq]);\r
- printf("a[aq]+aqpp=%02d ", a[aq]+aqpp);\r
- printf("a[aq]-aqpp=%02d\n", a[aq]-aqpp);\r
- //bmp->data[lq]=((bmp->data[lq]+bmp->offset)-a[aq]);\r
-//++++ bmp->data[lq]=a[aq]-aqpp;\r
-// printf("_%d ", bmp->data[lq]);\r
- //if(lq > 0 && lq%bmp->width==0) printf("\n");\r
- }\r
- else if(bmp->data[lq]+bmp->offset < ((*i)/3)-aqpp)\r
- {\r
- if(bmp->data[lq]+bmp->offset >= aq)\r
- {\r
- bmp->data[lq]=(bmp->data[lq]+bmp->offset)-aqpp;//-((z-(*i))/3);\r
- //printf("_%d ", bmp->data[lq]+bmp->offset)-aqpp-((z-(*i))/3);\r
- }\r
- else bmp->data[lq]+=(bmp->offset-aqpp);\r
- }*/\r
-\r
- //printf("%02d`", bmp->data[lq]);\r
- //if(lq > 0 && lq%bmp->width==0) printf("\n");\r
- }\r
-\r
-//printf(" aq=%02d\n", aq);\r
-//printf(" aa=%02d\n", aa);\r
-\r
- //update the palette~\r
- modexPalUpdate(bmp, &pp, aq, aqoffset);\r
- (*i)=pp;\r
-\r
- if(aq<aa){ pp=q; aq++; goto aqpee; }\r
- }\r
-}\r
+//moved to 16_vlpal.c\r
\r
void\r
-modexPalUpdate1(byte *p)\r
+modexPalUpdate(byte *p)\r
{\r
int i;\r
//modexWaitBorder();\r
word s, o, w;\r
word x_draw = x;\r
//word addr = (word) romFontsData.l;\r
- word addrq = (page->width/4) * y + (x / 4) + ((word)page->data);\r
+ word addrq = (page->stridew) * y + (x / 4) + ((word)page->data);\r
word addrr = addrq;\r
byte c;\r
\r
{\r
x = x_draw;\r
romFontsData.chw = 0;\r
- addrq += (page->width / 4) * 8;\r
+ addrq += (page->stridew) * 8;\r
addrr = addrq;\r
y += 8;\r
continue;\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
}\r
}\r
\r
+void\r
+modexWaitBorder_start()\r
+{\r
+ while(inp(INPUT_STATUS_1) & 8) {\r
+ // spin\r
+ }\r
+\r
+}\r
+\r
+void\r
+modexWaitBorder_end()\r
+{\r
+ while(!(inp(INPUT_STATUS_1) & 8)) {\r
+ // spin\r
+ }\r
+\r
+}\r
+\r
//\r
// printings of video memory information\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].tilesw); printf("%d", v->page[0].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].tw); printf("%d", v->page[0].th); printf("=((Screen)/16)\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