]> 4ch.mooo.com Git - 16.git/blob - 16/x/mxpi.asm
p16 is being worked on a bunch by me wwww [16_ca needs huge amounts of work and I...
[16.git] / 16 / x / mxpi.asm
1 ;-----------------------------------------------------------\r
2 ;\r
3 ; MXPI.ASM - Put image\r
4 ; Copyright (c) 1993,1994 by Alessandro Scotti\r
5 ;\r
6 ;-----------------------------------------------------------\r
7 WARN    PRO\r
8 NOWARN  RES\r
9 INCLUDE MODEX.DEF\r
10 \r
11 PUBLIC  mxPutImage\r
12 \r
13 EXTRN   subClipImage            : NEAR\r
14 \r
15 MX_TEXT         SEGMENT USE16 PARA PUBLIC 'CODE'\r
16                 ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
17 \r
18 EXTRN   mx_VideoSegment : WORD\r
19 EXTRN   mx_BytesPerLine : WORD\r
20 \r
21 mxTable LABEL   WORD                    ; Raster ops\r
22         DW      subMove\r
23         DW      subAnd\r
24         DW      subOr\r
25         DW      subXor\r
26         DW      subTrans\r
27         DW      subAdd\r
28 \r
29 ;-----------------------------------------------------------\r
30 ;\r
31 ; Move functions.\r
32 ; Note: loops unrolled and optimized for CX even, no check for CX = 0.\r
33 ;\r
34 subMove         PROC    NEAR\r
35         shr     cx, 1                   ; Make CX even\r
36         jc      @@Odd                   ; Special case if odd byte\r
37 @@Loop: movsb\r
38         add     si, 3\r
39         movsb\r
40         add     si, 3\r
41         dec     cx\r
42         jnz     @@Loop\r
43 @@Exit: ret\r
44 @@Odd:  movsb\r
45         add     si, 3\r
46         jcxz    @@Exit\r
47         jmp     @@Loop\r
48 subMove         ENDP\r
49 ;\r
50 subAnd          PROC     NEAR\r
51         shr     cx, 1\r
52         jc      @@Odd\r
53 @@Loop: mov     al, ds:[si]\r
54         mov     ah, ds:[si+4]\r
55         and     es:[di], ax\r
56         inc     di\r
57         inc     di\r
58         add     si, 8\r
59         dec     cx\r
60         jnz     @@Loop\r
61 @@Exit: ret\r
62 @@Odd:  lodsb\r
63         and     es:[di], al\r
64         inc     di\r
65         add     si, 3\r
66         jcxz    @@Exit\r
67         jmp     @@Loop\r
68 subAnd          ENDP\r
69 ;\r
70 subOr           PROC     NEAR\r
71         shr     cx, 1\r
72         jc      @@Odd\r
73 @@Loop: mov     al, ds:[si]\r
74         mov     ah, ds:[si+4]\r
75         or      es:[di], ax\r
76         inc     di\r
77         inc     di\r
78         add     si, 8\r
79         dec     cx\r
80         jnz     @@Loop\r
81 @@Exit: ret\r
82 @@Odd:  lodsb\r
83         or      es:[di], al\r
84         inc     di\r
85         add     si, 3\r
86         jcxz    @@Exit\r
87         jmp     @@Loop\r
88 subOr           ENDP\r
89 ;\r
90 subXor          PROC     NEAR\r
91         shr     cx, 1\r
92         jc      @@Odd\r
93 @@Loop: mov     al, ds:[si]\r
94         mov     ah, ds:[si+4]\r
95         xor     es:[di], ax\r
96         inc     di\r
97         inc     di\r
98         add     si, 8\r
99         dec     cx\r
100         jnz     @@Loop\r
101 @@Exit: ret\r
102 @@Odd:  lodsb\r
103         xor     es:[di], al\r
104         inc     di\r
105         add     si, 3\r
106         jcxz    @@Exit\r
107         jmp     @@Loop\r
108 subXor          ENDP\r
109 ;\r
110 subTrans        PROC     NEAR\r
111 @@Loop: mov     al, ds:[si]\r
112         cmp     al, ah\r
113         je      @@Skip\r
114         mov     es:[di], al\r
115 @@Skip: inc     di\r
116         add     si, 4\r
117         dec     cx\r
118         jnz     @@Loop\r
119 @@Exit: ret\r
120 subTrans        ENDP\r
121 ;\r
122 subAdd          PROC     NEAR\r
123 @@Loop: mov     al, ds:[si]\r
124         add     es:[di], al\r
125         inc     di\r
126         add     si, 4\r
127         dec     cx\r
128         jnz     @@Loop\r
129         ret\r
130 subAdd          ENDP\r
131 \r
132 ;-----------------------------------------------------------\r
133 ;\r
134 ; Copies a "raw" image from memory to screen.\r
135 ;\r
136 ; Input:\r
137 ;       Image   = pointer to image\r
138 ;       X, Y    = coordinates of destination\r
139 ;       Width   = width of image in pixels\r
140 ;       Height  = height of image in pixels\r
141 ;       Op      = raster op (OP_xxx)\r
142 ; Output:\r
143 ;       none\r
144 ;\r
145 mxPutImage      PROC    FAR\r
146         ARG     Op:WORD,                \\r
147                 Height:WORD,            \\r
148                 Width:WORD,             \\r
149                 Y:WORD,                 \\r
150                 X:WORD,                 \\r
151                 Image:DWORD             = ARG_SIZE\r
152         LOCAL   PlaneWidth:WORD:4,      \\r
153                 PixelOffset:WORD,       \\r
154                 MoveFunction:WORD,      \\r
155                 Count:BYTE,             \\r
156                 ReadPlane:BYTE,         \\r
157                 OpInfo:BYTE,            \\r
158                 WritePlane:BYTE         = AUTO_SIZE\r
159         ASSUME  ds:NOTHING\r
160         .enter  AUTO_SIZE\r
161         .push   ds, si, es, di\r
162 \r
163 ; Clip image\r
164         mov     bx, [X]\r
165         mov     ax, [Y]\r
166         mov     cx, [Width]\r
167         mov     dx, [Height]\r
168         call    subClipImage\r
169         jc      @@Exit                  ; Full clipped\r
170         mov     [Height], dx\r
171         add     WORD PTR Image[0], si   ; Skip clipped pixels\r
172 \r
173 ; Get pixel address\r
174         mul     [mx_BytesPerLine]\r
175         mov     di, bx\r
176         shr     di, 1\r
177         shr     di, 1\r
178         add     di, ax\r
179         mov     [PixelOffset], di\r
180         mov     es, [mx_VideoSegment]   ; ES:DI points to pixel\r
181         and     bl, 03h\r
182         mov     [ReadPlane], bl\r
183 \r
184 ; Compute extra bytes and width count for each plane\r
185         mov     bx, cx\r
186         shr     bx, 1\r
187         shr     bx, 1                   ; Width for each plane\r
188         and     cl, 03h\r
189         mov     al, 00001000b\r
190         shr     al, cl\r
191         mov     si, 3 SHL 1\r
192 @@PatchLoop:\r
193         mov     PlaneWidth[si], bx\r
194         shr     al, 1\r
195         adc     bx, 0\r
196         dec     si\r
197         dec     si\r
198         jge     @@PatchLoop\r
199 \r
200 ; Setup planes for output to VGA registers\r
201         mov     cl, [ReadPlane]\r
202         mov     al, 00010001b\r
203         shl     al, cl\r
204         mov     [WritePlane], al\r
205 \r
206 ; Install move function\r
207         mov     bx, [Op]\r
208         mov     [OpInfo], bh            ; Remember additional info if needed\r
209         xor     bh, bh\r
210         cmp     bl, OP_ADD\r
211         jbe     @@SetMoveFunction\r
212         xor     bl, bl\r
213 @@SetMoveFunction:\r
214         shl     bx, 1\r
215         mov     ax, mxTable[bx]\r
216         mov     [MoveFunction], ax\r
217 \r
218 ; Put image\r
219         cld\r
220         mov     [Count], 4              ; Four planes\r
221         lea     bx, PlaneWidth          ; SS:[BX] = width in bytes for plane\r
222         mov     ds, WORD PTR Image[2]\r
223 @@PlaneLoop:\r
224         cmp     WORD PTR ss:[bx], 0     ; Exit if nothing more to do\r
225         je      @@Exit                  ; (also, never try to move zero bytes!)\r
226         mov     si, WORD PTR Image[0]\r
227         mov     ah, [WritePlane]\r
228         and     ah, 0Fh\r
229         mov     al, 02h\r
230         mov     dx, TS\r
231         out     dx, ax                  ; Select write plane\r
232         mov     ah, [ReadPlane]\r
233         and     ah, 03h\r
234         mov     al, 04h\r
235         mov     dx, GDC\r
236         out     dx, ax                  ; Select read plane\r
237         mov     dx, [Height]\r
238         mov     di, [PixelOffset]\r
239 @@Loop:\r
240         push    si\r
241         push    di\r
242         mov     cx, WORD PTR ss:[bx]    ; Number of bytes to move\r
243         mov     ah, [OpInfo]            ; Transparent color for subTrans\r
244         call    [MoveFunction]\r
245         pop     di\r
246         pop     si\r
247         add     si, [Width]             ; Go to next image line\r
248         add     di, [mx_BytesPerLine]   ; Go to next screen row\r
249         dec     dx\r
250         jnz     @@Loop                  ; Repeat for all lines\r
251         inc     bx\r
252         inc     bx                      ; Select width for next plane\r
253         inc     [ReadPlane]\r
254         rol     [WritePlane], 1\r
255         adc     [PixelOffset], 0\r
256         inc     WORD PTR Image[0]\r
257         dec     [Count]\r
258         jnz     @@PlaneLoop             ; Repeat for all planes\r
259 \r
260 @@Exit:\r
261         xor     ax, ax\r
262         .pop    ds, si, es, di\r
263         .leave  ARG_SIZE\r
264 mxPutImage      ENDP\r
265 \r
266 MX_TEXT         ENDS\r
267 END\r