X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2F16_vl.c;h=59ce49aa30117061d9f2ecff29346c9829efd15b;hb=cd8d88b23a2c9a5f0a3df949f57ff81a44b6aa94;hp=0e2bfcf064f83b93f52bd8832826c906da2d2cf9;hpb=1159fe5a6cd0f8eaeee6e8584f5972d42e004073;p=16.git diff --git a/src/lib/16_vl.c b/src/lib/16_vl.c index 0e2bfcf0..59ce49aa 100755 --- a/src/lib/16_vl.c +++ b/src/lib/16_vl.c @@ -1,5 +1,5 @@ /* Project 16 Source Code~ - * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover + * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover * * This file is part of Project 16. * @@ -249,9 +249,9 @@ modexNextPageFlexibleSize(page_t *p, word x, word y) result.tilesw=result.width/TILEWH; result.tilesh=result.height/TILEWH; result.id = p->id+1; - result.stridew=p->sw/4;//result.width/4; + result.stridew=result.width/4;//p->sw/4; result.pagesize = (word)(result.stridew)*result.height; - switch(result.id) +/* switch(result.id) { case 2: result.pi=p->width*4; @@ -259,7 +259,8 @@ modexNextPageFlexibleSize(page_t *p, word x, word y) case 3: result.pi=p->pi; break; - } + }*/ + result.pi=result.width*4; return result; } @@ -284,20 +285,26 @@ void modexHiganbanaPageSetup(video_t *video) (video->page[1]) = modexNextPage(&(video->page[0])); video->num_of_pages++; //0000 (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), (video->page[0]).width, TILEWH*4); video->num_of_pages++; //0000 (video->page[3]) = (video->page[2]); video->num_of_pages++; - (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), TILEWH*4, TILEWH*4); video->num_of_pages++; -// (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), video->page[0].width, 176); video->num_of_pages++; - (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), video->page[0].sw, 208); video->num_of_pages++; -// (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), video->page[0].width, 172); video->num_of_pages++; -// (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), 72, 128); video->num_of_pages++; +//// (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), TILEWH*4, TILEWH*4); video->num_of_pages++; +//// (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), video->page[0].sw, 208); video->num_of_pages++; + (video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), video->page[0].width, 96); video->num_of_pages++; + (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), video->page[0].width, 96); video->num_of_pages++; modexCalcVmemRemain(video); - video->p=0; + video->sp=video->p=0; video->r=1; + video->vh=video->page[0].height+video->page[1].height+video->page[3].height-8;//+video->page[2].height + //doslib origi var + video->omemptr= vga_state.vga_graphics_ram; + video->vga_draw_stride= vga_state.vga_draw_stride; + video->vga_draw_stride_limit= vga_state.vga_draw_stride_limit; + //sprite render switch + video->rss=0; //setup the buffersize - video->page[0].dy=video->page[0].dx=TILEWH; - /* video->page[1].dx=video->page[1].dy=TILEWH; // 1 tile size buffer + video->page[0].dx=video->page[0].dy= + video->page[1].dx=video->page[1].dy=TILEWH; // 1 tile size buffer video->page[2].dx=video->page[2].dy= - video->page[3].dx=video->page[3].dy=0; */// cache pages are buffer wwww + video->page[3].dx=video->page[3].dy=0; // cache pages are buffer wwww } // @@ -333,13 +340,9 @@ modexShowPage(page_t *page) { outp(AC_INDEX, 0x33); outp(AC_INDEX, (page[0].dx & 0x03) << 1); } - -// -// testing version of void modexShowPage() -// +//args: page, vertical sync switch, screen resolution switch, page0 switch void -modexShowPage_(page_t *page) -{ +VL_ShowPage(page_t *page, boolean vsync, boolean sr) { word high_address, low_address, offset; byte crtcOffset; @@ -349,56 +352,37 @@ modexShowPage_(page_t *page) offset += page[0].dx >> 2; /* calculate crtcOffset according to virtual width */ - crtcOffset = page->sw >> 3; + switch(sr) + { + case 1: + crtcOffset = page->sw >> 3; + break; + default: + case 0: + crtcOffset = page->width >> 3; + break; + } high_address = HIGH_ADDRESS | (offset & 0xff00); low_address = LOW_ADDRESS | (offset << 8); /* wait for appropriate timing and then program CRTC */ -//+=+= while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE)); + if(vsync) while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE)); outpw(CRTC_INDEX, high_address); outpw(CRTC_INDEX, low_address); outp(CRTC_INDEX, 0x13); outp(CRTC_DATA, crtcOffset); /* wait for one retrace */ -//+=+= while (!(inp(INPUT_STATUS_1) & VRETRACE)); + if(vsync) while (!(inp(INPUT_STATUS_1) & VRETRACE)); /* do PEL panning here */ outp(AC_INDEX, 0x33); outp(AC_INDEX, (page[0].dx & 0x03) << 1); + vga_state.vga_graphics_ram = (VGA_RAM_PTR)page[0].data; } -void -modexShowPageVsync(page_t *page) { - word high_address, low_address, offset; - byte crtcOffset; - - /* calculate offset */ - offset = (word) page->data; - offset += page[0].dy * (page->width >> 2 ); - offset += page[0].dx >> 2; - - /* calculate crtcOffset according to virtual width */ - crtcOffset = page->width >> 3; - - high_address = HIGH_ADDRESS | (offset & 0xff00); - low_address = LOW_ADDRESS | (offset << 8); - - /* wait for appropriate timing and then program CRTC */ - while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE)); - outpw(CRTC_INDEX, high_address); - outpw(CRTC_INDEX, low_address); - outp(CRTC_INDEX, 0x13); - outp(CRTC_DATA, crtcOffset); - - /* wait for one retrace */ - while (!(inp(INPUT_STATUS_1) & VRETRACE)); - - /* do PEL panning here */ - outp(AC_INDEX, 0x33); - outp(AC_INDEX, (page[0].dx & 0x03) << 1); -} +//============================================================================= void modexPanPage(page_t *page, int dx, int dy) { @@ -693,6 +677,23 @@ modexLoadPalFile(byte *filename, byte **palette) { } +void VL_LoadPalFile(const char *filename, byte *palette) +{ + int fd; + + fd = open(filename,O_RDONLY|O_BINARY); + if (fd >= 0) { + word i; + + read(fd,palette,768); + close(fd); + + vga_palette_lseek(0); + for (i=0;i < 256;i++) vga_palette_write(palette[(i*3)+0]>>2,palette[(i*3)+1]>>2,palette[(i*3)+2]>>2); + } +} + + void modexSavePalFile(char *filename, byte *pal) { //unsigned int i; @@ -1258,6 +1259,56 @@ void modexcls(page_t *page, byte color, byte *Where) _fmemset(Where, color, page->width*(page->height)/4); } +// +// pattern filler from joncampbell123's code +// +void VL_PatternDraw(video_t *video, word pn, boolean sw, boolean allsw) +{ + unsigned int i,j,o, d,h,s; + word w; + + switch(sw) + { + case 0: + w=vga_state.vga_width; + d=0; + s=vga_state.vga_stride; + switch(allsw) + { + case 0: + h=vga_state.vga_height; + break; + case 1: + h=video->vh; + break; + } + break; + default: + w=video->page[pn].width; + d=(0x10000UL - (uint16_t)video->page[pn].data); + s=video->page[pn].stridew; + switch(allsw) + { + case 0: + h=video->page[pn].height; + break; + case 1: + if(!pn) h=video->vh; + else h=video->page[pn].height; + break; + } + break; + } + + /* fill screen/pattern with a distinctive pattern */ + for (i=0;i < w;i++) { + o = (i >> 2) + d; + vga_write_sequencer(0x02/*map mask*/,1 << (i&3)); + for (j=0;j < h;j++,o += s) + vga_state.vga_graphics_ram[o] = (i^j)&15; // VRL samples put all colors in first 15! + } +} + void modexWaitBorder() { while(inp(INPUT_STATUS_1) & 8) { @@ -1269,18 +1320,28 @@ modexWaitBorder() { } } -void modexprintmeminfo(video_t *v) +// +// printings of video memory information +// +void VL_PrintmodexmemInfo(video_t *v) { byte i; - printf("video memory remaining: %u\n", v->vmem_remain); - printf("page "); + +// printf("========================================\n"); + printf("VL_PrintmodexmemInfo:\n"); +// printf("========================================\n"); + 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"); + 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"); + + printf(" Free Video Memory: %u\n", v->vmem_remain); + printf(" page"); for(i=0; inum_of_pages;i++) { printf(" [%u]=", i); printf("(%Fp)", (v->page[i].data)); printf(" size=%u ", v->page[i].pagesize); - printf("w=%lu h=%lu ", (unsigned long)v->page[i].width, (unsigned long)v->page[i].height); - printf("sw=%lu sh=%lu ", (unsigned long)v->page[i].sw, (unsigned long)v->page[i].sh); + printf("w=%-3lu h=%-3lu ", (unsigned long)v->page[i].width, (unsigned long)v->page[i].height); + printf("sw=%-3lu sh=%-3lu ", (unsigned long)v->page[i].sw, (unsigned long)v->page[i].sh); printf("pi=%u", v->page[i].pi); printf("\n"); }