home *** CD-ROM | disk | FTP | other *** search
- /*--------------------------------------------------------------------------*/
- /* HERCGRAF.C */
- /* Grafik-Routinen für Hercules-Karte */
- /* (C) 2.88 M.Schlöter & PASCAL INT. */
- /*--------------------------------------------------------------------------*/
-
- /* Siehe PASCAL 8 & 9/87 (begin, end, ...) */
- #include <stdio.h>
- #include <my-h.h>
- #include <dos.h>
- #include <stdlib.h>
- /* Bildschirmspeicher */
- #define SCRBASE 0xB800
- /* Register */
- #define MODEREG 0x3B8
- #define INDREG 0x3B4
- #define DATAREG 0x3B5
- #define KONFREG 0x3BF
-
- /* Bildschirm-Grenzen */
- #define XMIN 0
- #define YMIN 0
- #define XMAX 719
- #define YMAX 347
-
- /* Berechne Adresse im Speicher */
- #define ADR(x,y) ((((y) & 3) << 13) + (((y) >> 2)*90) + ((x) >> 3))
- /* Bitmaske */
- #define MASK(x) (128 >> ((x)%8))
-
- /* Punkt auf dem Bildschirm ? */
- #define checkwin(x,y) ((x>=XMIN)&&(x<=XMAX)&&(y>=YMIN)&&(y<=YMAX))
-
- char GrafInit[] = {0x35, 0x2D, 0x2E, 0x07, 0x5B, 0x02,
- 0x57, 0x57, 0x02, 0x03, 0x00, 0x00 };
- char TextInit[] = {0x61, 0x50, 0x52, 0x0F, 0x19, 0x06,
- 0x19, 0x19, 0x02, 0x0D, 0x0B, 0x0C };
- int XOrFlag = 0;
-
- void cls_0(void)
- begin
- int i;
- char *p;
-
- for(i = 0; i < 0x7FFF; i++) begin
- p = MK_FP(SCRBASE,i);
- *p = 0;
- end;
- end;
-
-
- void hires_0(void)
- begin
- int i;
-
- outportb(MODEREG,0x82);
- for(i = 0; i < 12; i++) begin
- outportb(INDREG,i);
- outportb(DATAREG,GrafInit[i]);
- end;
- outportb(KONFREG,3); /* Full-Mode */
- outportb(MODEREG,0x82+0x8);
- end;
-
-
- void textmode_0(void)
- begin
- int i;
-
- outportb(MODEREG,0x20);
- for(i = 0; i < 12; i++) begin
- outportb(INDREG,i);
- outportb(DATAREG,TextInit[i]);
- end;
- outportb(KONFREG,1); /* Diag-Mode */
- outportb(MODEREG,0x20+0x8);
- end;
-
-
-
- /* Plot mit Clipping */
- void Plot_0(x,y,col)
- int x,y,col;
-
- begin
- char *p;
-
- if (checkwin(x,y)) begin
- p = MK_FP(SCRBASE,ADR(x,y));
- if (!(XOrFlag)) begin
- if (col)
- *p |= MASK(x);
- else
- *p &= ~MASK(x);
- end
- else
- *p ^= MASK(x);
- end;
- end;
-
-
- void XOrMode_0(flag)
- int flag;
-
- begin
- XOrFlag = flag;
- end;
-
-
- void TestPixel_0(x, y, res)
- int x, y, *res;
-
- begin
- char *p;
-
- if (not(checkwin(x,y)))
- *res = -1;
- else begin
- p = MK_FP(SCRBASE,ADR(x,y));
- if (*p & MASK(x))
- *res = 1;
- else
- *res = 0;
- end;
- end;
-
-
- /* Integer-DDA mit Clipping siehe PASCAL 4/88 ff */
- void Draw_0(x1, y1, x2, y2, col)
- int x1,y1,x2,y2,col;
-
- begin
- register delta_x, delta_y; /* That is stored in SI and DI ! */
- int line_delta, temp, loop;
-
- begin
- line_delta = 0;
- delta_x = x2 - x1;
- delta_y = y2 - y1;
- if (delta_y < 0)
- begin /* change points */
- temp = x1; x1 = x2; x2 = temp;
- temp = y1; y1 = y2; y2 = temp;
- delta_y = -delta_y;
- delta_x = -delta_x;
- end;
- Plot_0(x1, y1, col);
- if (delta_x >= 0)
- if (delta_x < delta_y)
- for (loop = 1; loop < delta_y; loop++)
- if (line_delta < 0)
- begin
- x1++;
- y1++;
- Plot_0(x1, y1, col);
- line_delta += (delta_y - delta_x);
- end
- else
- begin
- y1++;
- Plot_0(x1, y1, col);
- line_delta -= delta_x;
- end
- else
- for (loop = 1; loop < delta_x; loop++ )
- if (line_delta <= 0)
- begin
- x1++;
- Plot_0(x1, y1, col);
- line_delta += delta_y;
- end
- else
- begin
- x1++;
- y1++;
- Plot_0(x1, y1, col);
- line_delta += (delta_y - delta_x);
- end
- else
- if (abs(delta_x) >= delta_y)
- for (loop = 1; loop < abs(delta_x); loop++)
- if (line_delta <= 0)
- begin
- x1--;
- Plot_0(x1, y1, col);
- line_delta += delta_y;
- end
- else
- begin
- x1--;
- y1++;
- Plot_0(x1, y1, col);
- line_delta += (delta_x + delta_y);
- end
- else
- for (loop = 1; loop < delta_y; loop++)
- if (line_delta < 0)
- begin
- x1--;
- y1++;
- Plot_0(x1, y1, col);
- line_delta += (delta_x + delta_y);
- end
- else
- begin
- y1--;
- Plot_0(x1, y1, col);
- line_delta += delta_x;
- end;
- Plot_0(x2, y2, col)
- end;
- }
-
- /* Bresenham-Algorithmus, siehe PASCAL 4/87 */
- void Circle_0(x_center,y_center,rad, col)
- int x_center,y_center,rad, col;
-
- begin
- int delta,
- AspRX,
- AspRY;
- #define aspect_ratio 2/3
- register x, y;
-
- x = 0;
- y = rad;
- delta = 1 - rad;
-
- repeat
- AspRX = x*aspect_ratio;
- AspRY = y*aspect_ratio;
- Plot_0(x_center + x, y_center + AspRY, col);
- Plot_0(x_center - x, y_center + AspRY, col);
- Plot_0(x_center + x, y_center - AspRY, col);
- Plot_0(x_center - x, y_center - AspRY, col);
- Plot_0(x_center + y, y_center + AspRX, col);
- Plot_0(x_center - y, y_center + AspRX, col);
- Plot_0(x_center + y, y_center - AspRX, col);
- Plot_0(x_center - y, y_center - AspRX, col);
- if (delta > 0) begin
- x++;
- y--;
- delta += 2*x - 2*y + 3;
- end
- else begin
- x++;
- delta += 2*x + 1;
- end;
- until (x > y);
- end;