]> 4ch.mooo.com Git - 16.git/blob - 16/x/mxgi.asm
7037d41130e0e55145f29cc4e50d1d97073417df
[16.git] / 16 / x / mxgi.asm
1 ;-----------------------------------------------------------\r
2 ;\r
3 ; MXGI.ASM - Get image\r
4 ; Copyright (c) 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  mxGetImage\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 ;-----------------------------------------------------------\r
22 ;\r
23 ; Copies an image from screen to memory.\r
24 ;\r
25 ; Input:\r
26 ;       Image   = pointer to buffer for image\r
27 ;       X, Y    = coordinates of image on screen\r
28 ;       Width   = width of image in pixels\r
29 ;       Height  = height of image in pixels\r
30 ; Output:\r
31 ;       none\r
32 ;\r
33 mxGetImage      PROC    FAR\r
34         ARG     Height:WORD,            \\r
35                 Width:WORD,             \\r
36                 Y:WORD,                 \\r
37                 X:WORD,                 \\r
38                 Image:DWORD             = ARG_SIZE\r
39         LOCAL   PlaneWidth:WORD:4,      \\r
40                 PixelOffset:WORD,       \\r
41                 MoveFunction:WORD,      \\r
42                 ReadPlane:BYTE,         \\r
43                 Count:BYTE              = AUTO_SIZE\r
44         ASSUME  ds:NOTHING\r
45         .enter  AUTO_SIZE\r
46         .push   ds, si, es, di\r
47 \r
48 ; Clip image\r
49         mov     bx, [X]\r
50         mov     ax, [Y]\r
51         mov     cx, [Width]\r
52         mov     dx, [Height]\r
53         call    subClipImage\r
54         jc      @@Exit                  ; Full clipped\r
55         mov     [Height], dx\r
56         add     WORD PTR Image[0], si   ; Skip clipped pixels\r
57 \r
58 ; Get pixel address\r
59         mul     [mx_BytesPerLine]\r
60         mov     si, bx\r
61         shr     si, 1\r
62         shr     si, 1\r
63         add     si, ax\r
64         mov     [PixelOffset], si\r
65         mov     ds, [mx_VideoSegment]   ; DS:SI points to pixel\r
66         and     bl, 03h\r
67         mov     [ReadPlane], bl\r
68 \r
69 ; Compute extra bytes and width count for each plane\r
70         mov     bx, cx\r
71         shr     bx, 1\r
72         shr     bx, 1                   ; Width for each plane\r
73         and     cl, 03h\r
74         mov     al, 00001000b\r
75         shr     al, cl\r
76         mov     di, 3 SHL 1\r
77 @@PatchLoop:\r
78         mov     PlaneWidth[di], bx\r
79         shr     al, 1\r
80         adc     bx, 0\r
81         dec     di\r
82         dec     di\r
83         jge     @@PatchLoop\r
84 \r
85 ; Get image\r
86         cld\r
87         mov     [Count], 4              ; Four planes\r
88         lea     bx, PlaneWidth          ; SS:[BX] = width in bytes for plane\r
89         mov     es, WORD PTR Image[2]   ; ES:DI will point to image\r
90         mov     ah, [ReadPlane]\r
91 @@PlaneLoop:\r
92         cmp     WORD PTR ss:[bx], 0     ; Exit if nothing more to do\r
93         je      @@Exit                  ; (also, never try to move zero bytes!)\r
94         mov     di, WORD PTR Image[0]\r
95         mov     al, 04h\r
96         mov     dx, GDC\r
97         out     dx, ax                  ; Select read plane\r
98         mov     dx, [Height]\r
99         mov     si, [PixelOffset]       ; DS:SI points to video memory\r
100 @@Loop:\r
101         .push   si, di\r
102         mov     cx, WORD PTR ss:[bx]    ; Number of bytes to move\r
103 @@MoveLoop:\r
104         movsb\r
105         add     di, 3\r
106         dec     cx\r
107         jnz     @@MoveLoop\r
108         .pop    si, di\r
109         add     di, [Width]             ; Go to next image line\r
110         add     si, [mx_BytesPerLine]   ; Go to next screen row\r
111         dec     dx\r
112         jnz     @@Loop                  ; Repeat for all lines\r
113         inc     bx\r
114         inc     bx                      ; Select width for next plane\r
115         inc     ah\r
116         test    ah, 04h                 ; Plane wraparound?\r
117         jz      @@PlaneOk               ; No\r
118         inc     [PixelOffset]           ; Yes, bump video pointer\r
119         and     ah, 03h\r
120 @@PlaneOk:\r
121         inc     WORD PTR Image[0]\r
122         dec     [Count]\r
123         jnz     @@PlaneLoop             ; Repeat for all planes\r
124 \r
125 @@Exit:\r
126         xor     ax, ax\r
127         .pop    ds, si, es, di\r
128         .leave  ARG_SIZE\r
129 mxGetImage      ENDP\r
130 \r
131 MX_TEXT         ENDS\r
132 END\r