- __asm {\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
- MOV AL, MAP_MASK\r
- OUT DX, AL\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
- STOSB ; write the color\r
- DEC CX\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
- OUT DX, AL\r
- MOV AL, BL ; restore color\r
- REP STOSB ; write the color\r
- SCAN_DONE:\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
- STOSB ; write pixel\r
- ADD DI, nextRow ; go to the next row\r
- DEC h\r
- JNZ SCAN_START\r
- }\r
-}\r
-\r
-//TODO! ADD CLIPPING!!\r
-//memory management needs to be added\r
-//void\r
-//modexDrawBmpRegion (page_t *page, int x, int y, int rx, int ry, int rw, int rh, bitmap_t *bmp)\r
-void modexDrawPBufRegion (page_t *page, int x, int y, int rx, int ry, int rw, int rh, planar_buf_t *p, boolean sprite)\r
-{\r
- int plane;\r
- int px, py, i;\r
- px=x;\r
- py=y;\r
- for(plane=0; plane < 4; plane++) {\r
- i=(rx/4)+((rx/4)*ry);\r
- modexSelectPlane(PLANE(plane+x));\r
- for(; y < py+rh; y++) {\r
- //for(px=0; px < p->width; px++) {\r
- //printf("%02X ", (int) p->plane[plane][i++]);\r
-// _fmemcpy(buff, &(p->plane[plane][i+=p->pwidth]), p->pwidth);\r
-// printf("buff %u==%s\n", y, *buff);\r
- _fmemcpy(page->data + (((page->width/4) * (y+page->dy)) + ((x+page->dx) / 4)), &(p->plane[plane][i+=rw]), rw/4);\r
- //}\r
- }\r
- x=px;\r
- y=py;\r
- }\r
-}\r
-\r
-\r
-/*temp*/\r
-void\r
-DrawPBuf(page_t *page, int x, int y, planar_buf_t *p, boolean sprite)\r
-{\r
- int plane;\r
- int px, py, i;\r
-// byte near *buff;\r
- px=x;\r
- py=y;\r
-// buff = _nmalloc(p->pwidth+1);\r
- // TODO Make this fast. It's SLOOOOOOW\r
-// for(plane=0; plane < 4; plane++) {\r
-// i=0;\r
-// modexSelectPlane(PLANE(plane+x));\r
-// for(px = plane; px < p->width; px+=4) {\r
-// offset=px;\r
-// for(py=0; py<p->height/2; py++) {\r
-// //SELECT_ALL_PLANES();\r
-// if(!sprite || p->plane[offset])\r
-// page->data = &(p->plane[offset][i++]);\r
-// offset+=p->width;\r
-// offset++;\r
-// }\r
-// }\r
-// }\r
- for(plane=0; plane < 4; plane++) {\r
- i=0;\r
- modexSelectPlane(PLANE(plane+x));\r
- for(; y < py+p->height; y++) {\r
- //for(px=0; px < p->width; px++) {\r
- //printf("%02X ", (int) p->plane[plane][i++]);\r
-// _fmemcpy(buff, &(p->plane[plane][i+=p->pwidth]), p->pwidth);\r
-// printf("buff %u==%s\n", y, *buff);\r
-// _fmemcpy(page->data + (((page->width/4) * (y+page->dy)) + ((x+page->dx) / 4)), buff, p->pwidth);\r
- _fmemcpy(page->data + (((page->width/4) * (y+page->dy)) + ((x+page->dx) / 4)), &(p->plane[plane][i+=p->pwidth]), p->pwidth);\r
- //}\r
- }\r
- x=px;\r
- y=py;\r
- }\r
-// _nfree(buff);\r
-}\r
-\r
-void\r
-oldDrawBmp(byte far* page, int x, int y, bitmap_t *bmp, byte sprite)\r
-{\r
- byte plane;\r
- word px, py;\r
- word offset;\r
-\r
- /* TODO Make this fast. It's SLOOOOOOW */\r
- for(plane=0; plane < 4; plane++) {\r
- modexSelectPlane(PLANE(plane+x));\r
- for(px = plane; px < bmp->width; px+=4) {\r
- offset=px;\r
- for(py=0; py<bmp->height; py++) {\r
- if(!sprite || bmp->data[offset])\r
- page[PAGE_OFFSET(x+px, y+py)] = bmp->data[offset];\r
- offset+=bmp->width;\r
- }\r
- }\r
- }\r
-}\r
-\r
-void\r
-modexDrawBmp(page_t *page, int x, int y, bitmap_t *bmp) {\r
- /* draw the region (the entire freakin bitmap) */\r
- modexDrawBmpRegion(page, x, y, 0, 0, bmp->width, bmp->height, bmp);\r
-}\r