X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fmodex16.c;h=1e6a2fcc430942e03e88be8ba3abec0ffb00acf1;hb=208a9f3194d5039b308f3a4f1a1bcdee7beb244d;hp=6a5b27994f5549b8c1e80e141fab486627389662;hpb=ab7178cd4cfa5f75d0388d0322db7512bc9a6f20;p=16.git diff --git a/src/lib/modex16.c b/src/lib/modex16.c index 6a5b2799..1e6a2fcc 100755 --- a/src/lib/modex16.c +++ b/src/lib/modex16.c @@ -85,6 +85,9 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv) vgaSetMode(VGA_256_COLOR_MODE); vga_enable_256color_modex(); + /* reprogram the CRT controller */ +// outp(CRTC_INDEX, 0x11); /* VSync End reg contains register write prot */ +// outp(CRTC_DATA, 0x7f); /* get current write protect on varios regs */ update_state_from_vga(); vga_read_crtc_mode(&cm); @@ -92,6 +95,9 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv) { case 1: //CRTParmCount = sizeof(ModeX_320x240regs) / sizeof(ModeX_320x240regs[0]); + /*for(i=0; ivideo.page[0].sw = vga_state.vga_width = 320; // VGA lib currently does not update this gv->video.page[0].sh = vga_state.vga_height = 240; // VGA lib currently does not update this @@ -155,7 +161,6 @@ void modexEnter(sword vq, boolean cmem, global_game_variables_t *gv) //TODO MAKE FLEXIBLE~ // gv->video.page[0].tilemidposscreenx = gv->video.page[0].tilesw; // gv->video.page[0].tilemidposscreeny = (gv->video.page[0].tilesh/2)+1; - gv->video.num_of_pages=0; } void @@ -185,7 +190,8 @@ modexDefaultPage(page_t *p) page.tilesh=page.height/TILEWH; page.tilemidposscreenx = page.tw/2; page.tilemidposscreeny = (page.th/2)+1; - page.pagesize = (sdiword)(page.width/4)*page.height; + page.stridew=page.width/4; + page.pagesize = (word)(page.width/4)*page.height; page.id = 0; return page; @@ -201,6 +207,8 @@ modexNextPage(page_t *p) { result.data = p->data + (p->pagesize); result.dx = 0; result.dy = 0; + result.sw = p->sw; + result.sh = p->sh; result.width = p->width; result.height = p->height; result.tw = p->tw; @@ -208,6 +216,7 @@ modexNextPage(page_t *p) { result.tilesw = p->tilesw; result.tilesh = p->tilesh; result.id = p->id+1; + result.stridew=p->stridew; result.pagesize = p->pagesize; return result; @@ -222,6 +231,8 @@ modexNextPageFlexibleSize(page_t *p, word x, word y) result.data = p->data + (p->pagesize); /* compute the offset */ result.dx = 0; result.dy = 0; + result.sw = x; + result.sh = y; result.width = x; result.height = y; result.tw = result.sw/TILEWH; @@ -229,7 +240,8 @@ modexNextPageFlexibleSize(page_t *p, word x, word y) result.tilesw=result.width/TILEWH; result.tilesh=result.height/TILEWH; result.id = p->id+1; - result.pagesize = (sdiword)(result.width/4)*result.height; + result.stridew=result.width/4; + result.pagesize = (word)(result.width/4)*result.height; return result; } @@ -237,25 +249,28 @@ modexNextPageFlexibleSize(page_t *p, word x, word y) void modexCalcVmemRemain(video_t *video) { byte i; - //printf("\n\n 1st vmem_remain=%ld\n", video->vmem_remain); - for(i=0; i<=video->num_of_pages-1; i++) + //printf("\n\n 1st vmem_remain=%u\n", video->vmem_remain); + for(i=0; inum_of_pages; i++) { video->vmem_remain-=video->page[i].pagesize; - //printf(" [%u], video->page[i].pagesize=%ld\n", i, video->page[i].pagesize); - //printf(" [%u], vmem_remain=%ld\n", i, video->vmem_remain); + //printf(" [%u], video->page[%u].pagesize=%u\n", i, i, video->page[i].pagesize); + //printf(" [%u], vmem_remain=%u\n", i, video->vmem_remain); } } void modexHiganbanaPageSetup(video_t *video) { - video->vmem_remain=262144L; - (video->page[0]) = modexDefaultPage(&(video->page[0])); video->num_of_pages++; - //video->page[0].width += (TILEWHD); video->page[0].height += (TILEWHD); + video->vmem_remain=65535U; + video->num_of_pages=0; + (video->page[0]) = modexDefaultPage(&(video->page[0])); video->num_of_pages++; //video->page[0].width += (TILEWHD); video->page[0].height += (TILEWHD); (video->page[1]) = modexNextPage(&(video->page[0])); video->num_of_pages++; - //(video->page[2]) = modexNextPageFlexibleSize(&(video->page[1]), video->page[0].width, video->page[0].sh-40); video->num_of_pages++; - //(video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), TILEWH, TILEWH); 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, 172); video->num_of_pages++; +// (video->page[3]) = modexNextPageFlexibleSize(&(video->page[2]), 72, 128); video->num_of_pages++; modexCalcVmemRemain(video); video->p=0; + video->r=1; } void @@ -291,28 +306,25 @@ modexShowPage(page_t *page) { outp(AC_INDEX, (page->dx & 0x03) << 1); } - void modexPanPage(page_t *page, int dx, int dy) { page->dx = dx; page->dy = dy; } - void modexSelectPlane(byte plane) { outp(SC_INDEX, MAP_MASK); /* select plane */ outp(SC_DATA, plane); } - void modexClearRegion(page_t *page, int x, int y, int w, int h, byte color) { word pageOff = (word) page->data; word xoff=x/4; /* xoffset that begins each row */ word scanCount=w/4; /* number of iterations per row (excluding right clip)*/ - word poffset = pageOff + y*(page->width/4) + xoff; /* starting offset */ - word nextRow = page->width/4-scanCount-1; /* loc of next row */ + word poffset = pageOff + y*(page->stridew) + xoff; /* starting offset */ + word nextRow = page->stridew-scanCount-1; /* loc of next row */ byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */ byte rclip[] = {0x00, 0x01, 0x03, 0x07}; byte left = lclip[x&0x03]; @@ -388,17 +400,26 @@ modexCopyPageRegion(page_t *dest, page_t *src, word dx, word dy, word width, word height) { - word doffset = (word)dest->data + dy*(dest->width/4) + dx/4; - word soffset = (word)src->data + sy*(src->width/4) + sx/4; + word doffset = (word)dest->data + dy*(dest->stridew) + dx/4; + word soffset = (word)src->data + sy*(src->stridew) + sx/4; word scans = vga_state.vga_stride; - word nextSrcRow = src->width/4 - scans - 1; - word nextDestRow = dest->width/4 - scans - 1; + word nextSrcRow = src->stridew - scans - 1; + word nextDestRow = dest->stridew - scans - 1; byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */ byte rclip[] = {0x0f, 0x01, 0x03, 0x07}; byte left = lclip[sx&0x03]; byte right = rclip[(sx+width)&0x03]; __asm { + PUSHF + PUSH ES + PUSH AX + PUSH BX + PUSH CX + PUSH DX + PUSH SI + PUSH DI + MOV AX, SCREEN_SEG ; work in the vga space MOV ES, AX ; MOV DI, doffset ; @@ -447,6 +468,15 @@ modexCopyPageRegion(page_t *dest, page_t *src, MOV DX, GC_INDEX+1 ; go back to CPU data MOV AL, 0ffh ; none from latches OUT DX, AL ; + + POP DI + POP SI + POP DX + POP CX + POP BX + POP AX + POP ES + POPF } } @@ -1008,6 +1038,15 @@ void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, c } //load the letter 'A' __asm { + PUSHF + PUSH ES + PUSH AX + PUSH BX + PUSH CX + PUSH DX + PUSH SI + PUSH DI + MOV DI, addr MOV SI, o MOV ES, s @@ -1022,6 +1061,15 @@ void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, c INC DI DEC CX JNZ L1 + + POP DI + POP SI + POP DX + POP CX + POP BX + POP AX + POP ES + POPF } for(i=0; ivmem_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(" sw=%lu sh=%lu ", (unsigned long)v->page[i].sw, (unsigned long)v->page[i].sh); + printf(" width=%lu height=%lu", (unsigned long)v->page[i].width, (unsigned long)v->page[i].height); + printf("\n"); + } +}