/* 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
byte/*FIXME: why long? "long" is 32-bit datatype, VGA modes are 8-bit numbers. */\r
vgaGetMode()\r
{\r
- return int10_getmode();\r
+ return int10_getmode();\r
}\r
\r
/* -========================= Entry Points ==========================- */\r
{\r
word i;\r
struct vga_mode_params cm;\r
- int CRTParmCount;\r
+ //int CRTParmCount;\r
\r
vgaSetMode(VGA_256_COLOR_MODE);\r
vga_enable_256color_modex();\r
cm.word_mode = 0;\r
cm.dword_mode = 0;\r
// 320x240 mode 60Hz\r
- cm.horizontal_total=0x5f + 5; /* CRTC[0] -5 */\r
- cm.horizontal_display_end=0x4f + 1; /* CRTC[1] -1 */\r
+ cm.horizontal_total=0x5f + 5; /* CRTC[0] -5 */\r
+ cm.horizontal_display_end=0x4f + 1; /* CRTC[1] -1 */\r
cm.horizontal_blank_start=0x50 + 1; /* CRTC[2] */\r
// cm.horizontal_blank_end=0x82 + 1; /* CRTC[3] bit 0-4 & CRTC[5] bit 7 *///skewing ^^;\r
cm.horizontal_start_retrace=0x54;/* CRTC[4] */\r
{\r
case 1: {\r
/* clear video memory */\r
- dword far*ptr=(dword far*)vga_state.vga_graphics_ram;//VGA; /* used for faster screen clearing */\r
+ dword far*ptr=(dword far*)vga_state.vga_graphics_ram;//VGA; /* used for faster screen clearing */\r
vga_write_sequencer(2/*map mask register*/,0xf/*all 4 planes*/);\r
for(i = 0;i < 0x4000; i++) ptr[i] = 0x0000; // 0x4000 x dword = 64KB\r
+ /* fix up the palette and everything */\r
+ modexPalBlack(); //reset the palette~\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
-\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
}\r
\r
void\r
page_t\r
modexDefaultPage(page_t *p)\r
{\r
- page_t page;\r
+ page_t page;\r
\r
- /* default page values */\r
+ /* default page values */\r
//page.data = VGA;\r
//page.data = (byte far *)(vga_state.vga_graphics_ram);\r
page.data = (vga_state.vga_graphics_ram);\r
- page.dx = 0;\r
- page.dy = 0;\r
+ page.dx = 0;\r
+ page.dy = 0;\r
page.sw = p->sw;\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
page.id = 0;\r
\r
- return page;\r
+ return page;\r
}\r
\r
/* returns the next page in contiguous memory\r
*/\r
page_t\r
modexNextPage(page_t *p) {\r
- page_t result;\r
+ page_t result;\r
\r
- result.data = p->data + (p->pagesize);\r
- result.dx = 0;\r
- result.dy = 0;\r
+ result.data = p->data + (p->pagesize);\r
+ result.dx = p->dx; // not used anymore we use page[0].dx\r
+ result.dy = p->dy; // not used anymore we use page[0].dy\r
result.sw = p->sw;\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.width = p->width;\r
+ result.height = p->height;\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
page_t result;\r
\r
result.data = p->data + (p->pagesize); /* compute the offset */\r
- result.dx = 0;\r
- result.dy = 0;\r
+ result.dx = 0; // not used anymore we use page[0].dx\r
+ result.dy = 0; // not used anymore we use page[0].dy\r
result.sw = x;\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[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
- video->r=1;\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 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
+ 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
}\r
\r
+//\r
+// move page to appropriate part and show it\r
+//\r
void\r
modexShowPage(page_t *page) {\r
- word high_address;\r
- word low_address;\r
- word offset;\r
- byte crtcOffset;\r
-\r
- /* calculate offset */\r
- offset = (word) page->data;\r
- offset += page->dy * (page->width >> 2 );\r
- offset += page->dx >> 2;\r
-\r
- /* calculate crtcOffset according to virtual width */\r
- crtcOffset = page->width >> 3;\r
-\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
- //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
- //while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
-\r
- /* do PEL panning here */\r
- outp(AC_INDEX, 0x33);\r
- outp(AC_INDEX, (page->dx & 0x03) << 1);\r
+ word high_address, low_address, offset;\r
+ byte crtcOffset;\r
+\r
+ /* calculate offset */\r
+ offset = (word) page->data;\r
+ offset += page[0].dy * (page->width >> 2 );\r
+ offset += page[0].dx >> 2;\r
+\r
+ /* calculate crtcOffset according to virtual width */\r
+ crtcOffset = page->width >> 3;\r
+\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
+//+=+= 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
+//+=+= while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
+\r
+ /* do PEL panning here */\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
+ offset = (word) page->data;\r
+ offset += page->dy * (page->width >> 2 );\r
+ offset += page->dx >> 2;\r
+\r
+ // calculate crtcOffset according to virtual width\r
+ switch(sr)\r
+ {\r
+ case 1:\r
+ crtcOffset = page->sw >> 3;\r
+ break;\r
+ default:\r
+ case 0:\r
+ crtcOffset = page->width >> 3;\r
+ break;\r
+ }\r
+\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
+ 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
+ if(vsync) while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
+\r
+ // do PEL panning here\r
+ outp(AC_INDEX, 0x33);\r
+ outp(AC_INDEX, (page->dx & 0x03) << 1);\r
+ vga_state.vga_graphics_ram = (VGA_RAM_PTR)page->data;\r
}\r
\r
+//=============================================================================\r
+\r
void\r
modexPanPage(page_t *page, int dx, int dy) {\r
- page->dx = dx;\r
- page->dy = dy;\r
+ page[0].dx = dx;\r
+ page[0].dy = dy;\r
}\r
\r
void\r
modexSelectPlane(byte plane) {\r
- outp(SC_INDEX, MAP_MASK); /* select plane */\r
- outp(SC_DATA, plane);\r
+ outp(SC_INDEX, MAP_MASK); /* select plane */\r
+ outp(SC_DATA, plane);\r
}\r
\r
void\r
modexClearRegion(page_t *page, int x, int y, int w, int h, byte color) {\r
- word pageOff = (word) page->data;\r
- word xoff=x/4; /* xoffset that begins each row */\r
- word scanCount=w/4; /* number of iterations per row (excluding right clip)*/\r
- word poffset = pageOff + y*(page->stridew) + xoff; /* starting offset */\r
- word nextRow = page->stridew-scanCount-1; /* loc of next row */\r
- byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */\r
- byte rclip[] = {0x00, 0x01, 0x03, 0x07};\r
- byte left = lclip[x&0x03];\r
- byte right = rclip[(x+w)&0x03];\r
-\r
- /* handle the case which requires an extra group */\r
- if((x & 0x03) && !((x+w) & 0x03)) {\r
- right=0x0f;\r
- }\r
+ word pageOff = (word) page->data;\r
+ word xoff=x/4; /* xoffset that begins each row */\r
+ word scanCount=w/4; /* number of iterations per row (excluding right clip)*/\r
+ word poffset = pageOff + y*(page->stridew) + xoff; /* starting offset */\r
+ word nextRow = page->stridew-scanCount-1; /* loc of next row */\r
+ byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */\r
+ byte rclip[] = {0x00, 0x01, 0x03, 0x07};\r
+ byte left = lclip[x&0x03];\r
+ byte right = rclip[(x+w)&0x03];\r
+\r
+ /* handle the case which requires an extra group */\r
+ if((x & 0x03) && !((x+w) & 0x03)) {\r
+ right=0x0f;\r
+ }\r
\r
//printf("modexClearRegion(x=%u, y=%u, w=%u, h=%u, left=%u, right=%u)\n", x, y, w, h, left, right);\r
\r
- __asm {\r
- PUSHF\r
- PUSH ES\r
- PUSH AX\r
- PUSH BX\r
- PUSH CX\r
- PUSH DX\r
- PUSH SI\r
- PUSH DI\r
- MOV AX, SCREEN_SEG ; go to the VGA memory\r
+ __asm {\r
+ PUSHF\r
+ PUSH ES\r
+ PUSH AX\r
+ PUSH BX\r
+ PUSH CX\r
+ PUSH DX\r
+ PUSH SI\r
+ PUSH DI\r
+ MOV AX, SCREEN_SEG ; go to the VGA memory\r
MOV ES, AX\r
MOV DI, poffset ; go to the first pixel\r
MOV DX, SC_INDEX ; point to the map mask\r
INC DX\r
MOV AL, color ; get ready to write colors\r
SCAN_START:\r
- MOV CX, scanCount ; count the line\r
- MOV BL, AL ; remember color\r
- MOV AL, left ; do the left clip\r
- OUT DX, AL ; set the left clip\r
- MOV AL, BL ; restore color\r
+ MOV CX, scanCount ; count the line\r
+ MOV BL, AL ; remember color\r
+ MOV AL, left ; do the left clip\r
+ OUT DX, AL ; set the left clip\r
+ MOV AL, BL ; restore color\r
STOSB ; write the color\r
DEC CX\r
- JZ SCAN_DONE ; handle 1 group stuff\r
+ JZ SCAN_DONE ; handle 1 group stuff\r
\r
;-- write the main body of the scanline\r
- MOV BL, AL ; remember color\r
- MOV AL, 0x0f ; write to all pixels\r
+ MOV BL, AL ; remember color\r
+ MOV AL, 0x0f ; write to all pixels\r
OUT DX, AL\r
- MOV AL, BL ; restore color\r
- REP STOSB ; write the color\r
+ MOV AL, BL ; restore color\r
+ REP STOSB ; write the color\r
SCAN_DONE:\r
- MOV BL, AL ; remeber color\r
+ MOV BL, AL ; remeber color\r
MOV AL, right\r
- OUT DX, AL ; do the right clip\r
- MOV AL, BL ; restore color\r
+ OUT DX, AL ; do the right clip\r
+ MOV AL, BL ; restore color\r
STOSB ; write pixel\r
ADD DI, nextRow ; go to the next row\r
DEC h\r
JNZ SCAN_START\r
- POP DI\r
- POP SI\r
- POP DX\r
- POP CX\r
- POP BX\r
- POP AX\r
- POP ES\r
- POPF\r
- }\r
+ POP DI\r
+ POP SI\r
+ POP DX\r
+ POP CX\r
+ POP BX\r
+ POP AX\r
+ POP ES\r
+ POPF\r
+ }\r
}\r
\r
/* moved to src/lib/modex16/16render.c */\r
*/\r
void\r
modexCopyPageRegion(page_t *dest, page_t *src,\r
- word sx, word sy,\r
- word dx, word dy,\r
- word width, word height)\r
+ word sx, word sy,\r
+ word dx, word dy,\r
+ word width, word height)\r
{\r
- word doffset = (word)dest->data + dy*(dest->stridew) + dx/4;\r
- word soffset = (word)src->data + sy*(src->stridew) + sx/4;\r
- word scans = vga_state.vga_stride; //++++0000 the quick and dirty fix of the major issue with p16 video display wwww\r
- word nextSrcRow = src->stridew - scans - 1;\r
- word nextDestRow = dest->stridew - scans - 1;\r
- byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */\r
- byte rclip[] = {0x00, 0x01, 0x03, 0x07};\r
- byte left = lclip[sx&0x03];\r
- byte right = rclip[(sx+width)&0x03];\r
+ word doffset = (word)dest->data + dy*(dest->stridew) + dx/4;\r
+ word soffset = (word)src->data + sy*(src->stridew) + sx/4;\r
+ word scans = vga_state.vga_stride; //++++0000 the quick and dirty fix of the major issue with p16 video display wwww\r
+ word nextSrcRow = src->stridew - scans - 1;\r
+ word nextDestRow = dest->stridew - scans - 1;\r
+ byte lclip[] = {0x0f, 0x0e, 0x0c, 0x08}; /* clips for rectangles not on 4s */\r
+ byte rclip[] = {0x00, 0x01, 0x03, 0x07};\r
+ byte left = lclip[sx&0x03];\r
+ byte right = rclip[(sx+width)&0x03];\r
\r
/* handle the case which requires an extra group */\r
if((sx & 0x03) && !((sx+width) & 0x03)) {\r
\r
// printf("modexCopyPageRegion(src->stridew=%u, dest->stridew=%u, sx=%u, sy=%u, dx=%u, dy=%u, width=%u, height=%u, left=%u, right=%u)\n", src->stridew, dest->stridew, sx, sy, dx, dy, width, height, left, right);\r
\r
- __asm {\r
- PUSHF\r
- PUSH ES\r
- PUSH AX\r
- PUSH BX\r
- PUSH CX\r
- PUSH DX\r
- PUSH SI\r
- PUSH DI\r
-\r
- MOV AX, SCREEN_SEG ; work in the vga space\r
- MOV ES, AX ;\r
+ __asm {\r
+ PUSHF\r
+ PUSH ES\r
+ PUSH AX\r
+ PUSH BX\r
+ PUSH CX\r
+ PUSH DX\r
+ PUSH SI\r
+ PUSH DI\r
+\r
+ MOV AX, SCREEN_SEG ; work in the vga space\r
+ MOV ES, AX ;\r
MOV DI, doffset ;\r
MOV SI, soffset ;\r
\r
OUT DX, AX\r
\r
MOV AX, SC_INDEX ; point to the mask register\r
- MOV DX, AX ;\r
+ MOV DX, AX ;\r
MOV AL, MAP_MASK ;\r
- OUT DX, AL ;\r
+ OUT DX, AL ;\r
INC DX ;\r
\r
ROW_START:\r
MOV DS, AX\r
MOV CX, scans ; the number of latches\r
\r
- MOV AL, left ; do the left column\r
- OUT DX, AL ;\r
+ MOV AL, left ; do the left column\r
+ OUT DX, AL ;\r
MOVSB ;\r
DEC CX ;\r
\r
- MOV AL, 0fh ; do the inner columns\r
+ MOV AL, 0fh ; do the inner columns\r
OUT DX, AL\r
- REP MOVSB ; copy the pixels\r
+ REP MOVSB ; copy the pixels\r
\r
MOV AL, right ; do the right column\r
OUT DX, AL\r
MOVSB\r
POP DS\r
\r
- MOV AX, SI ; go the start of the next row\r
- ADD AX, nextSrcRow ;\r
- MOV SI, AX ;\r
- MOV AX, DI ;\r
- ADD AX, nextDestRow ;\r
- MOV DI, AX ;\r
+ MOV AX, SI ; go the start of the next row\r
+ ADD AX, nextSrcRow ;\r
+ MOV SI, AX ;\r
+ MOV AX, DI ;\r
+ ADD AX, nextDestRow ;\r
+ MOV DI, AX ;\r
\r
- DEC height ; do the rest of the actions\r
+ DEC height ; do the rest of the actions\r
JNZ ROW_START ;\r
\r
- MOV DX, GC_INDEX+1 ; go back to CPU data\r
- MOV AL, 0ffh ; none from latches\r
- OUT DX, AL ;\r
-\r
- POP DI\r
- POP SI\r
- POP DX\r
- POP CX\r
- POP BX\r
- POP AX\r
- POP ES\r
- POPF\r
- }\r
+ MOV DX, GC_INDEX+1 ; go back to CPU data\r
+ MOV AL, 0ffh ; none from latches\r
+ OUT DX, AL ;\r
+\r
+ POP DI\r
+ POP SI\r
+ POP DX\r
+ POP CX\r
+ POP BX\r
+ POP AX\r
+ POP ES\r
+ POPF\r
+ }\r
}\r
\r
\r
/* fade and flash */\r
void\r
modexFadeOn(word fade, byte *palette) {\r
- fadePalette(-fade, 64, 64/fade+1, palette);\r
+ fadePalette(-fade, 64, 64/fade+1, palette);\r
}\r
\r
\r
void\r
modexFadeOff(word fade, byte *palette) {\r
- fadePalette(fade, 0, 64/fade+1, palette);\r
+ fadePalette(fade, 0, 64/fade+1, palette);\r
}\r
\r
\r
void\r
modexFlashOn(word fade, byte *palette) {\r
- fadePalette(fade, -64, 64/fade+1, palette);\r
+ fadePalette(fade, -64, 64/fade+1, palette);\r
}\r
\r
\r
void\r
modexFlashOff(word fade, byte *palette) {\r
- fadePalette(-fade, 0, 64/fade+1, palette);\r
+ fadePalette(-fade, 0, 64/fade+1, palette);\r
}\r
\r
\r
static void\r
fadePalette(sbyte fade, sbyte start, word iter, byte *palette) {\r
- word i;\r
- byte dim = start;\r
+ word i;\r
+ byte dim = start;\r
\r
- /* handle the case where we just update */\r
- if(iter == 0) {\r
- modexPalUpdate1(palette);\r
+ /* handle the case where we just update */\r
+ if(iter == 0) {\r
+ modexPalUpdate(palette);\r
return;\r
- }\r
+ }\r
\r
- while(iter > 0) { /* FadeLoop */\r
+ while(iter > 0) { /* FadeLoop */\r
for(i=0; i<PAL_SIZE; i++) { /* loadpal_loop */\r
- tmppal[i] = palette[i] - dim;\r
- if(tmppal[i] > 127) {\r
+ tmppal[i] = palette[i] - dim;\r
+ if(tmppal[i] > 127) {\r
tmppal[i] = 0;\r
- } else if(tmppal[i] > 63) {\r
+ } else if(tmppal[i] > 63) {\r
tmppal[i] = 63;\r
- }\r
+ }\r
}\r
- modexPalUpdate1(tmppal);\r
+ modexPalUpdate(tmppal);\r
iter--;\r
dim += fade;\r
- }\r
+ }\r
}\r
\r
\r
/* save and load */\r
void\r
modexPalSave(byte *palette) {\r
- int i;\r
+ int i;\r
\r
- outp(PAL_READ_REG, 0); /* start at palette entry 0 */\r
- for(i=0; i<PAL_SIZE; i++) {\r
+ outp(PAL_READ_REG, 0); /* start at palette entry 0 */\r
+ for(i=0; i<PAL_SIZE; i++) {\r
palette[i] = inp(PAL_DATA_REG); /* read the palette data */\r
- }\r
+ }\r
}\r
\r
\r
byte *\r
modexNewPal() {\r
- byte *ptr;\r
- ptr = malloc(PAL_SIZE);\r
+ byte *ptr;\r
+ ptr = malloc(PAL_SIZE);\r
\r
- /* handle errors */\r
- if(!ptr) {\r
- printf("Could not allocate palette.\n");\r
- exit(-1);\r
- }\r
+ /* handle errors */\r
+ if(!ptr) {\r
+ printf("Could not allocate palette.\n");\r
+ }\r
\r
- return ptr;\r
+ return ptr;\r
}\r
\r
\r
void\r
modexLoadPalFile(byte *filename, byte **palette) {\r
- FILE *file;\r
- byte *ptr;\r
+ FILE *file;\r
+ byte *ptr;\r
\r
- /* free the palette if it exists */\r
- if(*palette) {\r
+ /* free the palette if it exists */\r
+ if(*palette) {\r
free(*palette);\r
- }\r
+ }\r
\r
- /* allocate the new palette */\r
- *palette = modexNewPal();\r
+ /* allocate the new palette */\r
+ *palette = modexNewPal();\r
\r
- /* open the file */\r
- file = fopen(filename, "rb");\r
- if(!file) {\r
+ /* open the file */\r
+ file = fopen(filename, "rb");\r
+ if(!file) {\r
printf("Could not open palette file: %s\n", filename);\r
- exit(-2);\r
- }\r
+ }\r
\r
- /* read the file */\r
- ptr = *palette;\r
- while(!feof(file)) {\r
+ /* read the file */\r
+ ptr = *palette;\r
+ while(!feof(file)) {\r
*ptr++ = fgetc(file);\r
- }\r
+ }\r
+\r
+ fclose(file);\r
+}\r
\r
- fclose(file);\r
+\r
+void VL_LoadPalFile(const char *filename, byte *palette)\r
+{\r
+ VL_LoadPalFilewithoffset(filename, palette, 0);\r
+}\r
+\r
+void VL_LoadPalFilewithoffset(const char *filename, byte *palette, word o)\r
+{\r
+ int fd;\r
+\r
+ fd = open(filename,O_RDONLY|O_BINARY);\r
+ if (fd >= 0) {\r
+ word i;\r
+\r
+ read(fd,palette, PAL_SIZE);\r
+ close(fd);\r
+\r
+ vga_palette_lseek(1+o);\r
+ for (i=o;i < 255-o;i++) vga_palette_write(palette[(i*3)+0]>>2,palette[(i*3)+1]>>2,palette[(i*3)+2]>>2);\r
+ }\r
}\r
\r
\r
void\r
modexSavePalFile(char *filename, byte *pal) {\r
- unsigned int i;\r
- FILE *file;\r
+ //unsigned int i;\r
+ FILE *file;\r
\r
- /* open the file for writing */\r
- file = fopen(filename, "wb");\r
- if(!file) {\r
+ /* open the file for writing */\r
+ file = fopen(filename, "wb");\r
+ if(!file) {\r
printf("Could not open %s for writing\n", filename);\r
- exit(-2);\r
- }\r
+ }\r
\r
- /* write the data to the file */\r
- fwrite(pal, 1, PAL_SIZE, file);\r
- fclose(file);\r
+ /* write the data to the file */\r
+ fwrite(pal, 1, PAL_SIZE, file);\r
+ fclose(file);\r
}\r
\r
\r
/* blanking */\r
void\r
modexPalBlack() {\r
- fadePalette(-1, 64, 1, tmppal);\r
+ fadePalette(-1, 64, 1, tmppal);\r
}\r
\r
\r
void\r
modexPalWhite() {\r
- fadePalette(-1, -64, 1, tmppal);\r
+ fadePalette(-1, -64, 1, tmppal);\r
}\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
outp(PAL_DATA_REG, col);\r
}\r
\r
-//color checker~\r
-//i want to make another vesion that checks the palette when the palette is being appened~\r
-void modexchkcolor(bitmap_t *bmp, word *q, word *a, word *aa, word *z, word *i/*, word *offset*/)\r
-{\r
- byte *pal;\r
- word zz=0;\r
- pal = modexNewPal();\r
- modexPalSave(pal);\r
- //printf("q: %02d\n", (*q));\r
- printf("chkcolor start~\n");\r
- printf("1 (*z): %d\n", (*z)/3);\r
- printf("1 (*i): %d\n", (*i)/3);\r
-// printf("1 offset of color in palette (*q): %d\n", (*q)/3);\r
- printf("wwwwwwwwwwwwwwww\n");\r
- //check palette for dups\r
- for(; (*z)<PAL_SIZE; (*z)+=3)\r
- {\r
- //printf("\n z: %d\n", (*z));\r
- //printf(" q: %d\n", (*q));\r
- //printf(" z+q: %d\n\n", ((*z)+(*q)));\r
- //if((*z)%3==0)\r
- //{\r
-//---- if(pal[(*z)]==pal[(*z)+3] && pal[(*z)+1]==pal[(*z)+4] && pal[(*z)+2]==pal[(*z)+5])\r
- if((*z)==(*i))\r
- {\r
-// printf("\n%d [%02d][%02d][%02d]\n", (*z), pal[(*z)], pal[(*z)+1], pal[(*z)+2]);\r
-// printf("%d [%02d][%02d][%02d]\n\n", (*z)+3, pal[(*z)+3], pal[(*z)+4], pal[(*z)+5]);\r
-//0000 (*z)-=3;\r
- break;\r
- }\r
- else for(zz=0; zz<(*q); zz+=3)\r
- {\r
- //printf("zz: %02d\n", zz/3);\r
- if(zz%3==0)\r
- {\r
- if(pal[((*z)+(*q))]==pal[((*z)+(*q))+3] && pal[((*z)+(*q))+1]==pal[((*z)+(*q))+4] && pal[((*z)+(*q))+2]==pal[((*z)+(*q))+5]) //break if duplicate colors found in palette because it have reached the end of the current data of the palette\r
- {\r
-// (*z)-=3;\r
-// (*i)-=3;\r
-// printf("\nzq1:%d[%02d][%02d][%02d]\n", (zz+q), pal[(zz+q)], pal[(zz+q)+1], pal[(zz+q)+2]);\r
-// printf("zq2:%d[%02d][%02d][%02d]\n\n", (zz+q)+3, pal[(zz+q)+3], pal[(zz+q)+4], pal[(zz+q)+5]);\r
- break;\r
- }\r
- else if(pal[zz]==pal[((*z)+(*q))] && pal[zz+1]==pal[((*z)+(*q))+1] && pal[zz+2]==pal[((*z)+(*q))+2])\r
- {\r
-// printf("\n\nwwwwwwwwwwwwwwww\n");\r
-// printf(" zq: %d [%02d][%02d][%02d] value that is needing to be changed~\n", ((*z)+(*q))/3, pal[((*z)+(*q))], pal[((*z)+(*q))+1], pal[((*z)+(*q))+2]);\r
-// printf(" zz: %d [%02d][%02d][%02d] value that the previous value is going to change to~\n", (zz)/3, pal[zz], pal[zz+1], pal[zz+2]);\r
-// //printf(" zv: %d [%02d][%02d][%02d] wwww\n", (zz-z+q)/3, pal[(zz-z+q)], pal[(zz-z+q)+1], pal[(zz-z+q)+2]);\r
-// printf(" z : %d [%02d][%02d][%02d] offset value~\n", (*z)/3, pal[(*z)], pal[(*z)+1], pal[(*z)+2]);\r
-//++++ (*i)--;\r
-// (*z)--;\r
- //expand dong here\r
-/*\r
-planned features that i plan to implement~\r
-image that has values on the pallete list!\r
-wwww\r
-no... wait.... no wwww\r
-*/\r
- //for(zzii=0; zzii<3; zzii++)\r
- //{\r
- //printf("z+q: %d\n\n", ((*z)+(*q)));\r
- a[(((*z)+(*q)))]=zz;\r
- //}\r
- (*aa)=(((*z)+(*q)));\r
- printf("!! a[%02d]: %d\n", (((*z)+(*q))/3), zz/3);\r
-// printf("\n aa: %d\n\n", (*aa));\r
-// printf(" a[%02d]=(%02d) offset array i think the palette should be updated again~\n", ((*z)+(*q))/3, a[((*z)+(*q))/3]);\r
-// printf("wwwwwwwwwwwwwwww\n\n");\r
- }\r
- /*else\r
- {\r
- printf("================\n");\r
- printf("zq: %d [%02d][%02d][%02d]\n", ((*z)+(*q))/3, pal[((*z)+(*q))], pal[((*z)+(*q))+1], pal[((*z)+(*q))+2]);\r
- printf("zz: %d [%02d][%02d][%02d]\n", (zz)/3, pal[zz], pal[zz+1], pal[zz+2]);\r
- printf("z : %d [%02d][%02d][%02d]\n", (*z)/3, pal[(*z)], pal[(*z)+1], pal[(*z)+2]);\r
- printf("================\n");\r
- }*/\r
- //printf("[%d]", (zz+q));\r
- }\r
- }\r
- }\r
- printf("wwwwwwwwwwwwwwww\n");\r
- printf("2 (*z): %d\n", (*z)/3);\r
- printf("2 (*i): %d\n", (*i)/3);\r
-// printf("2 offset of color in palette (*q): %d\n", (*q)/3);\r
- printf("chkcolor end~\n");\r
- free(pal);\r
-}\r
-\r
void modexputPixel(page_t *page, int x, int y, byte color)\r
{\r
word pageOff = (word) page->data;\r
\r
}\r
\r
-void modexprint(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str)\r
+void modexDrawChar(page_t *page, int x/*for planar selection only*/, word t, word col, word bgcol, word addr)\r
+{\r
+ /* vertical drawing routine by joncampbell123.\r
+ *\r
+ * optimize for VGA mode X planar memory to minimize the number of times we do I/O write to map mask register.\r
+ * so, we enumerate over columns (not rows!) to draw every 4th pixel. bit masks are used because of the font bitmap.\r
+ *\r
+ * NTS: addr defines what VGA memory address we use, "x" is redundant except to specify which of the 4 pixels we select in the map mask register. */\r
+ word rows = romFonts[t].charSize;\r
+ word drawaddr;\r
+ word colm, row;\r
+ byte fontbyte;\r
+ byte plane;\r
+ byte m1,m2;\r
+\r
+ plane = x & 3;\r
+ m1 = 0x80; // left half\r
+ m2 = 0x08; // right half\r
+ for (colm=0;colm < 4;colm++) {\r
+ drawaddr = addr;\r
+ modexSelectPlane(PLANE(plane));\r
+ for (row=0;row < rows;row++) {\r
+ fontbyte = romFontsData.l[row];\r
+ vga_state.vga_graphics_ram[drawaddr ] = (fontbyte & m1) ? col : bgcol;\r
+ vga_state.vga_graphics_ram[drawaddr+1] = (fontbyte & m2) ? col : bgcol;\r
+ drawaddr += page->width >> 2;\r
+ }\r
+\r
+ m1 >>= 1;\r
+ m2 >>= 1;\r
+ if ((++plane) == 4) {\r
+ addr++;\r
+ plane = 0;\r
+ }\r
+ }\r
+}\r
+\r
+void modexprint(page_t *page, sword x, sword y, word t, word col, word bgcol, const byte *str)\r
{\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 addrr = addrq;\r
+ sword x_draw;\r
+ //word addr = (word) romFontsData.l;\r
+ word addrq;\r
+ word addrr;\r
byte c;\r
\r
+ x-=page->tlx; y-=page->tly;\r
+ x_draw = x/4;\r
+ addrq = (page->stridew) * y + (x_draw) +\r
+ ((word)page->data);\r
+ addrr = addrq;\r
s=romFonts[t].seg;\r
o=romFonts[t].off;\r
w=romFonts[t].charSize;\r
\r
for(; *str != '\0'; str++)\r
{\r
- c = (*str);\r
- if(c=='\n')\r
- {\r
- x = x_draw;\r
- romFontsData.chw = 0;\r
- addrq += (page->width / 4) * 8;\r
- addrr = addrq;\r
- y += 8;\r
- continue;\r
- }\r
+ c = (*str);\r
+ if(c=='\n')\r
+ {\r
+ x = x_draw;\r
+ romFontsData.chw = 0;\r
+ addrq += (page->stridew) * 8;\r
+ addrr = addrq;\r
+ y += 8;\r
+ continue;\r
+ }\r
\r
// load the character into romFontsData.l\r
// no need for inline assembly!\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
+ //printf("print xy:%dx%d tlxy:%dx%d\n", x, y, page->tlx, page->tly);\r
}\r
\r
void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str)\r
}\r
//load the letter 'A'\r
__asm {\r
- PUSHF\r
- PUSH ES\r
- PUSH AX\r
- PUSH BX\r
- PUSH CX\r
- PUSH DX\r
- PUSH SI\r
- PUSH DI\r
+ PUSHF\r
+ PUSH ES\r
+ PUSH AX\r
+ PUSH BX\r
+ PUSH CX\r
+ PUSH DX\r
+ PUSH SI\r
+ PUSH DI\r
\r
MOV DI, addr\r
MOV SI, o\r
DEC CX\r
JNZ L1\r
\r
- POP DI\r
- POP SI\r
- POP DX\r
- POP CX\r
- POP BX\r
- POP AX\r
- POP ES\r
- POPF\r
+ POP DI\r
+ POP SI\r
+ POP DX\r
+ POP CX\r
+ POP BX\r
+ POP AX\r
+ POP ES\r
+ POPF\r
}\r
\r
for(i=0; i<w; i++)\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
+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
+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