]> 4ch.mooo.com Git - 16.git/blob - 16/xlib/xpoint.asm
16_ca needs huge amounts of work and I should remember what needs to be done soon...
[16.git] / 16 / xlib / xpoint.asm
1 ;-----------------------------------------------------------------------\r
2 ; MODULE XPOINT\r
3 ;\r
4 ; Point functions all MODE X 256 Color resolutions\r
5 ;\r
6 ; Compile with Tasm.\r
7 ; C callable.\r
8 ;\r
9 ;\r
10 ; ****** XLIB - Mode X graphics library                ****************\r
11 ; ******                                               ****************\r
12 ; ****** Written By Themie Gouthas                     ****************\r
13 ;\r
14 ; egg@dstos3.dsto.gov.au\r
15 ; teg@bart.dsto.gov.au\r
16 ;-----------------------------------------------------------------------\r
17 \r
18 \r
19 include xlib.inc\r
20 include xpoint.inc\r
21 \r
22         .code\r
23 \r
24 \r
25 ;-----------------------------------------------------------------------\r
26 ; Mode X (256 color mode) write pixel routine.\r
27 ; No clipping is performed.\r
28 ;\r
29 ; Based on code originally published in DDJ Mag by M. Abrash\r
30 ;\r
31 ; C near-callable as:\r
32 ;    void x_put_pix(int X, int Y, int PageOffset, int Color);\r
33 ;\r
34 ;\r
35 \r
36 _x_put_pix  proc\r
37         ;ARG X:word,Y:word,PgOfs:word,Color:word\r
38         push bp                   ;preserve caller's stack frame\r
39         mov  bp,sp                ;point to local stack frame\r
40 \r
41         mov  ax,[_ScrnLogicalByteWidth]\r
42         mul  [BP+6]                  ;offset of pixel's scan line in page\r
43         mov  bx,[BP+4]\r
44         shr  bx,1                 ;X/4 = offset of pixel in scan line\r
45         shr  bx,1                 ;X/4 = offset of pixel in scan line\r
46         add  bx,ax                ;offset of pixel in page\r
47         add  bx,[BP+8]           ;offset of pixel in display memory\r
48         mov  ax,SCREEN_SEG\r
49         mov  es,ax                ;point ES:BX to the pixel's address\r
50 \r
51         mov  cl,byte ptr [BP+4]\r
52         and  cl,011b              ;CL = pixel's plane\r
53         mov  ax,0100h + MAP_MASK  ;AL = index in SC of Map Mask reg\r
54         shl  ah,cl                ;set only the bit for the pixel's\r
55                                   ; plane to 1\r
56         mov  dx,SC_INDEX          ;set the Map Mask to enable only the\r
57         out  dx,ax                ; pixel's plane\r
58 \r
59         mov  al,byte ptr [BP+10]\r
60         mov  es:[bx],al           ;draw the pixel in the desired color\r
61 \r
62         pop   bp                  ;restore caller's stack frame\r
63         ret\r
64 _x_put_pix   endp\r
65 \r
66 ;-------------------------------------------------------------------------\r
67 ; Mode X (320x240, 256 colors) read pixel routine. Works on all VGAs.\r
68 ; No clipping is performed.\r
69 ;\r
70 ; Based on code originally published in DDJ Mag by M. Abrash\r
71 ;\r
72 ; C near-callable as:\r
73 ;    unsigned int x_get_pix(int X, int Y, unsigned int PageBase);\r
74 \r
75 \r
76 _x_get_pix   proc\r
77         ;ARG x:word,y:word,PageBase:word\r
78         push bp                   ;preserve caller's stack frame\r
79         mov  bp,sp                ;point to local stack frame\r
80 \r
81         mov  ax,[_ScrnLogicalByteWidth]\r
82         mul  [bp+6]                  ;offset of pixel's scan line in page\r
83         mov  bx,[bp+4]\r
84         shr  bx,1\r
85         shr  bx,1                 ;X/4 = offset of pixel in scan line\r
86         add  bx,ax                ;offset of pixel in page\r
87         add  bx,[bp+8]        ;offset of pixel in display memory\r
88         mov  ax,SCREEN_SEG\r
89         mov  es,ax                ;point ES:BX to the pixel's address\r
90 \r
91         mov  ah,byte ptr [bp+4]\r
92         and  ah,011b              ;AH = pixel's plane\r
93         mov  al,READ_MAP          ;AL = index in GC of the Read Map reg\r
94         mov  dx,GC_INDEX          ;set the Read Map to read the pixel's\r
95         out  dx,ax                ; plane\r
96 \r
97         mov  al,es:[bx]           ;read the pixel's color\r
98         sub  ah,ah                ;convert it to an unsigned int\r
99 \r
100         pop  bp                   ;restore caller's stack frame\r
101         ret\r
102 _x_get_pix   endp\r
103         end\r