]> 4ch.mooo.com Git - 16.git/blob - 16/x/mxtl.asm
update tesuto.c to latest VRL demo code. sprite drawing just got a bit faster.
[16.git] / 16 / x / mxtl.asm
1 ;-----------------------------------------------------------\r
2 ;\r
3 ; MXTL.ASM - Put tile\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  mxPutTile\r
12 PUBLIC  mxTransPutTile\r
13 \r
14 MX_TEXT         SEGMENT USE16 PARA PUBLIC 'CODE'\r
15                 ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
16 \r
17 EXTRN   mx_VideoSegment : WORD\r
18 EXTRN   mx_BytesPerLine : WORD\r
19 \r
20 ;-----------------------------------------------------------\r
21 ;\r
22 ; Copies a "mode-x" tile from memory to screen.\r
23 ;\r
24 ; Input:\r
25 ;       Image   = pointer to tile\r
26 ;       X, Y    = coordinates of destination\r
27 ;       Width   = width of image in pixels (Width and 3 = 0)\r
28 ;       Height  = height of image in pixels\r
29 ; Output:\r
30 ;       none\r
31 ; Note:\r
32 ;       no clipping is performed on tiles!\r
33 ;\r
34 mxPutTile       PROC    FAR\r
35         ARG     Height:WORD,            \\r
36                 Width:WORD,             \\r
37                 Y:WORD,                 \\r
38                 X:WORD,                 \\r
39                 Image:DWORD             = ARG_SIZE\r
40         ASSUME  ds:NOTHING\r
41         .enter  0\r
42         .push   ds, si, es, di\r
43 \r
44         mov     ax, [Y]                 ; Get pixel address\r
45         mul     [mx_BytesPerLine]\r
46         mov     di, [X]\r
47         .shr    di, 2\r
48         add     di, ax\r
49         mov     es, [mx_VideoSegment]\r
50 \r
51         lds     si, [Image]             ; Get tile address\r
52         .shr    [Width], 2              ; Number of bytes per plane\r
53         mov     cl, BYTE PTR [X]\r
54         and     cl, 3\r
55         mov     ah, 11h                 ; AH = plane mask\r
56         shl     ah, cl                  ; Align mask to first plane\r
57 \r
58         mov     [Y], 4                  ; Number of planes\r
59         mov     bx, [mx_BytesPerLine]\r
60         sub     bx, [Width]             ; Extra bytes per line\r
61 @@Loop:\r
62         mov     al, 02h\r
63         mov     dx, TS\r
64         out     dx, ax                  ; Set write plane\r
65         mov     [X], di                 ; Save video offset\r
66         mov     dx, [Height]\r
67 @@Loop2:\r
68         mov     cx, [Width]             ; Number of bytes to move\r
69 \r
70         shr     cx, 1                   ; Move line\r
71         rep     movsw\r
72         rcl     cx, 1\r
73         rep     movsb\r
74 \r
75         add     di, bx                  ; Move video offset to next line\r
76         dec     dx                      ; Done all lines?\r
77         jnz     @@Loop2                 ; No, continue\r
78         mov     di, [X]                 ; Restore video offset\r
79         rol     ah, 1                   ; Next plane\r
80         adc     di, 0                   ; Bump video offset if needed\r
81         dec     [Y]                     ; Any plane left?\r
82         jnz     @@Loop                  ; Yes, keep looping\r
83 \r
84         xor     ax, ax\r
85         .pop    ds, si, es, di\r
86         .leave  ARG_SIZE\r
87 mxPutTile       ENDP\r
88 \r
89 ;-----------------------------------------------------------\r
90 ;\r
91 ; Copies a "mode-x" tile from memory to screen.\r
92 ; Skips over color 0.\r
93 ;\r
94 ; Input:\r
95 ;       Image   = pointer to tile\r
96 ;       X, Y    = coordinates of destination\r
97 ;       Width   = width of image in pixels (Width and 3 = 0)\r
98 ;       Height  = height of image in pixels\r
99 ; Output:\r
100 ;       none\r
101 ; Note:\r
102 ;       no clipping is performed on tiles!\r
103 ;\r
104 mxTransPutTile  PROC    FAR\r
105         ARG     Height:WORD,            \\r
106                 Width:WORD,             \\r
107                 Y:WORD,                 \\r
108                 X:WORD,                 \\r
109                 Image:DWORD             = ARG_SIZE\r
110         ASSUME  ds:NOTHING\r
111         .enter  0\r
112         .push   ds, si, es, di\r
113 \r
114         mov     ax, [Y]                 ; Get pixel address\r
115         mul     [mx_BytesPerLine]\r
116         mov     di, [X]\r
117         .shr    di, 2\r
118         add     di, ax\r
119         mov     es, [mx_VideoSegment]\r
120 \r
121         lds     si, [Image]             ; Get tile address\r
122         .shr    [Width], 2              ; Number of bytes per plane\r
123         mov     cl, BYTE PTR [X]\r
124         and     cl, 3\r
125         mov     ah, 11h                 ; AH = plane mask\r
126         shl     ah, cl                  ; Align mask to first plane\r
127 \r
128         mov     [Y], 4                  ; Number of planes\r
129         mov     bx, [mx_BytesPerLine]\r
130         sub     bx, [Width]             ; Extra bytes per line\r
131 @@Loop:\r
132         mov     al, 02h\r
133         mov     dx, TS\r
134         out     dx, ax                  ; Set write plane\r
135         mov     [X], di                 ; Save video offset\r
136         mov     dx, [Height]\r
137 @@Loop2:\r
138         mov     cx, [Width]             ; Number of bytes to move\r
139 \r
140 ; Move one line\r
141         jcxz    @@MoveLineDone\r
142 @@MoveLineLoop:\r
143         mov     al, ds:[si]\r
144         test    al, al\r
145         jz      @@MoveLineNext\r
146         mov     es:[di], al\r
147 @@MoveLineNext:\r
148         inc     si\r
149         inc     di\r
150         dec     cx\r
151         jnz     @@MoveLineLoop\r
152 @@MoveLineDone:\r
153 \r
154         add     di, bx                  ; Move video offset to next line\r
155         dec     dx                      ; Done all lines?\r
156         jnz     @@Loop2                 ; No, continue\r
157         mov     di, [X]                 ; Restore video offset\r
158         rol     ah, 1                   ; Next plane\r
159         adc     di, 0                   ; Bump video offset if needed\r
160         dec     [Y]                     ; Any plane left?\r
161         jnz     @@Loop                  ; Yes, keep looping\r
162 \r
163         xor     ax, ax\r
164         .pop    ds, si, es, di\r
165         .leave  ARG_SIZE\r
166 mxTransPutTile  ENDP\r
167 \r
168 MX_TEXT         ENDS\r
169 END\r