]> 4ch.mooo.com Git - plz.git/blob - PLZPART/PLZA.ASM
adc4ad33845d61a4d326b39b0d7670e132d90a3f
[plz.git] / PLZPART / PLZA.ASM
1         IDEAL\r
2         MODEL large\r
3         P386\r
4 \r
5 SEGMENT lerssicode para PUBLIC 'CODE'\r
6 \r
7 PUBLIC C jmp_tau\r
8 LABEL jmp_tau WORD\r
9 IRP ccc, <0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199>\r
10 dw      OFFSET plz_y&ccc\r
11 ENDM\r
12 \r
13 LABEL start_mask BYTE\r
14 REPT    200\r
15         db      1111b, 1110b, 1100b, 1000b\r
16 ENDM\r
17 LABEL end_mask BYTE\r
18 REPT    200\r
19         db      0001b, 0011b, 0111b, 1111b\r
20 ENDM\r
21 \r
22 PUBLIC C xx, C yy\r
23 PUBLIC C yy1, C xx1, C yy2, C xx2\r
24 PUBLIC C ay1, C ay2, C ax1, C ax2\r
25 PUBLIC C txx1, C txx2, C txy1, C txy2\r
26 PUBLIC C tax1, C tax2, C tay1, C tay2\r
27 PUBLIC C to, C from, C dseg, C ctau\r
28 \r
29 xx      dw      ?\r
30 yy      dw      ?\r
31 yy1     dd      ?\r
32 xx1     dd      ?\r
33 yy2     dd      ?\r
34 xx2     dd      ?\r
35 ay1     dd      ?\r
36 ax1     dd      ?\r
37 ay2     dd      ?\r
38 ax2     dd      ?\r
39 txx1    dd      ?\r
40 txy1    dd      ?\r
41 txx2    dd      ?\r
42 txy2    dd      ?\r
43 tax1    dd      ?\r
44 tay1    dd      ?\r
45 tax2    dd      ?\r
46 tay2    dd      ?\r
47 to      dd      0a0000000h\r
48 from    dd      ?\r
49 dseg    dw      0\r
50 ctau    dd      ?\r
51 \r
52 \r
53 linecount       dw      ?\r
54 \r
55 ASSUME cs:lerssicode, ds:nothing, es:nothing\r
56 \r
57 PUBLIC c do_block\r
58 \r
59 PROC C do_block FAR\r
60         ARG     ycount:word\r
61 \r
62         push    es ds si di bp\r
63 \r
64         mov     ax, [ycount]\r
65         mov     [linecount], ax\r
66         cmp     ax, 0d\r
67         je      @@end\r
68         lds     bx, [from]\r
69         les     di, [to]\r
70         lgs     si, [ctau]\r
71         mov     fs, [dseg]\r
72 \r
73 @@doline:\r
74         cmp     [yy], 0d\r
75         jl      @@endline\r
76         cmp     [yy], 134d\r
77         jge     @@end                           ; y-clip\r
78 \r
79         mov     bp, [word ctau]\r
80         mov     ax, [Word xx2+2]\r
81         cmp     ax, [gs:bp]\r
82         ja      @@l7\r
83         mov     [gs:bp], ax                     ; x1..\r
84 @@l7:   shr     ax, 2d\r
85         add     di, ax\r
86         mov     si, [Word xx1+2]\r
87         cmp     si, [gs:bp+2]\r
88         jb      @@l8\r
89         mov     [gs:bp+2], si                   ; x2..\r
90 @@l8:   shr     si, 2d\r
91         sub     si, ax                  ; si = bytes to copy\r
92         jb      @@endline\r
93         jz      @@singlebyte\r
94         mov     bp, si\r
95         dec     si\r
96         jz      @@twobyte\r
97 \r
98         mov     dx, 3c4h\r
99         mov     ax, 0f02h\r
100         out     dx, ax\r
101 \r
102         mov     ebx, [txy1-2]           ; xlo\r
103         mov     ecx, [txx1-2]           ; ylo\r
104 \r
105         movsx   esi, si\r
106         mov     eax, [txy2]\r
107         sub     eax, [txy1]\r
108         cdq\r
109         idiv    esi                     ; addy\r
110         mov     ecx, eax\r
111         mov     eax, [txx2]\r
112         sub     eax, [txx1]\r
113         cdq\r
114         idiv    esi                     ; addx\r
115 \r
116         mov     edx, ecx                ; look reg table\r
117         rol     edx, 16d                ; y_add\r
118         mov     dh, dl                  ; yah\r
119         rol     eax, 16d                ; x_add\r
120         mov     dl, al                  ; xah\r
121         test    dl, 80h\r
122         jz      @@l2\r
123         dec     dh\r
124 @@l2:\r
125         mov     bh, [Byte txy1+2]       ; txt y\r
126         mov     bl, [Byte txx1+2]       ; txt x\r
127         test    si, 1d\r
128         jz      @@l1\r
129 \r
130         movzx   si, [fs:bx]             ; out odd byte\r
131         add     ecx, eax\r
132         mov     al, [ds:bx+si]\r
133         adc     ebx, edx\r
134         adc     bh, 0\r
135         mov     [es:bp+di-1],al\r
136         jmp     [cs:jmp_tau+bp-2]\r
137 \r
138 @@l1:   jmp     [cs:jmp_tau+si]         ; and jump to rept\r
139 \r
140 ;               e       h       l\r
141 ;       ax      x_add   data    data\r
142 ;       bx      ylo     ty      tx\r
143 ;       cx      xlo     -       -\r
144 ;       dx      y_add   yah     xah\r
145 ;       di      -\r
146 ;       si      sinus inc\r
147 \r
148         ALIGN   4\r
149 IRP ccc, <200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1>\r
150 \r
151 plz_y&ccc&:\r
152 \r
153         movzx   si, [fs:bx]\r
154         add     ecx, eax\r
155         mov     ah, [ds:bx+si]\r
156         adc     ebx, edx\r
157         adc     bh, 0\r
158 \r
159         movzx   si, [fs:bx]\r
160         add     ecx, eax\r
161         mov     al, [ds:bx+si]\r
162         adc     ebx, edx\r
163         adc     bh, 0                   ; immediate = y_hi\r
164 \r
165         mov     [es:di+ccc*2-1], ax     ; output byte\r
166 ENDM\r
167 plz_y0:\r
168 \r
169 @@twobyte:\r
170         mov     bh, [Byte txy2+2]       ; txt y\r
171         mov     bl, [Byte txx2+2]       ; txt x\r
172         movzx   si, [fs:bx]\r
173         mov     cl, [ds:bx+si]\r
174         mov     bh, [Byte txy1+2]       ; txt y\r
175         mov     bl, [Byte txx1+2]       ; txt x\r
176         movzx   si, [fs:bx]\r
177         mov     ch, [ds:bx+si]\r
178 \r
179         mov     bx, [Word xx2+2]\r
180         and     bx, 3d\r
181         mov     ah, [start_mask+bx]\r
182         mov     al, 02\r
183         mov     dx, 3c4h\r
184         out     dx, ax\r
185         mov     [es:di], cl\r
186 \r
187         mov     bx, [Word xx1+2]\r
188         and     bx, 3d\r
189         mov     ah, [end_mask+bx]\r
190         out     dx, ax\r
191         mov     [es:bp+di], ch\r
192 \r
193 @@endline:\r
194         add     [Word to], 160d         ; next line\r
195         mov     di, [word to]\r
196         inc     [yy]\r
197         add     [word ctau], 4d\r
198 \r
199         mov     eax, [ax1]\r
200         add     [xx1], eax\r
201         mov     eax, [ax2]\r
202         add     [xx2], eax\r
203         mov     eax, [tay1]\r
204         add     [txy1], eax\r
205         mov     eax, [tax1]\r
206         add     [txx1], eax\r
207         mov     eax, [tay2]\r
208         add     [txy2], eax\r
209         mov     eax, [tax2]\r
210         add     [txx2], eax             ; increment txt and line indexes\r
211 \r
212         dec     [linecount]\r
213         jnz     @@doline\r
214 \r
215 @@end:\r
216         pop     bp di si ds es\r
217         ret\r
218 \r
219 \r
220 @@singlebyte:\r
221         mov     bh, [Byte txy2+2]       ; txt y\r
222         mov     bl, [Byte txx2+2]       ; txt x\r
223         movzx   si, [fs:bx]\r
224         mov     cl, [ds:bx+si]\r
225 \r
226         mov     al, 02\r
227         mov     dx, 3c4h\r
228         mov     bx, [Word xx2+2]\r
229         and     bx, 3d\r
230         mov     ah, [start_mask+bx]\r
231         mov     bx, [Word xx1+2]\r
232         and     bx, 3d\r
233         and     ah, [end_mask+bx]\r
234         out     dx, ax\r
235         mov     [es:di], cl\r
236 \r
237         add     [Word to], 160d         ; next line\r
238         mov     di, [word to]\r
239         inc     [yy]\r
240         add     [word ctau], 4d\r
241 \r
242         mov     eax, [ax1]\r
243         add     [xx1], eax\r
244         mov     eax, [ax2]\r
245         add     [xx2], eax\r
246         mov     eax, [tay1]\r
247         add     [txy1], eax\r
248         mov     eax, [tax1]\r
249         add     [txx1], eax\r
250         mov     eax, [tay2]\r
251         add     [txy2], eax\r
252         mov     eax, [tax2]\r
253         add     [txx2], eax             ; increment txt and line indexes\r
254 \r
255         dec     [linecount]\r
256         jnz     @@doline\r
257         pop     bp di si ds es\r
258         ret\r
259 ENDP\r
260 \r
261 \r
262 PUBLIC C shadepal\r
263 \r
264 PROC C shadepal\r
265 \r
266         ARG     fpal:dword, ppal:dword, shd:word\r
267 \r
268         push    si di ds es\r
269 \r
270         lds     si, [ppal]\r
271         les     di, [fpal]\r
272         mov     dx, [shd]\r
273         mov     cx, 192/16d\r
274 @@loop:\r
275         REPT    16\r
276         lodsb\r
277         mul     dl\r
278         shr     ax, 6d\r
279         stosb\r
280         ENDM\r
281         loop    @@loop\r
282 \r
283         pop     es ds di si\r
284         ret\r
285 \r
286 ENDP\r
287 \r
288 \r
289 ycnt    dw      0\r
290 \r
291 PUBLIC C do_clear\r
292 \r
293 PROC C do_clear\r
294 \r
295         ARG     vmem:dword, otau:dword, ntau:dword\r
296 \r
297         push    si di ds es bp\r
298 \r
299         mov     dx, 3c4h\r
300         mov     ax, 0f02h\r
301         out     dx, ax\r
302 \r
303         les     dx, [vmem]\r
304         lds     bx, [otau]              ; dx:bx-> otau\r
305         lds     si, [ntau]\r
306         sub     si, bx                  ; dx:bx+si-> ntau\r
307         mov     dl, [es:0]              ; fill latches\r
308         mov     [ycnt], 134d\r
309         xor     ax, ax\r
310 \r
311 @@lineloop:\r
312         cmp     [Word ds:bx], 640d\r
313         je      @@nextline\r
314 \r
315         mov     di, [Word ds:bx]\r
316         shr     di, 2d\r
317         mov     cx, [word ds:bx+si]\r
318         shr     cx, 2d\r
319         sub     cx, di\r
320         jb      @@l1\r
321         add     di, dx\r
322         rep     stosb\r
323 @@l1:\r
324         mov     di, [Word ds:bx+si+2]\r
325         shr     di, 2d\r
326         mov     cx, [word ds:bx+2]\r
327         shr     cx, 2d\r
328         sub     cx, di\r
329         jb      @@nextline\r
330         add     di, dx\r
331         inc     di\r
332         rep     stosb\r
333 \r
334 @@nextline:\r
335         mov     [Word ds:bx], 640d\r
336         mov     [Word ds:bx+2], 0d\r
337 \r
338         add     dx, 160d\r
339         add     bx, 4d\r
340         sub     [ycnt], 1d\r
341         jae     @@lineloop\r
342 \r
343 ; Maskaa p\84\84t...\r
344 \r
345         les     di, [vmem]\r
346         lds     si, [ntau]              ; dx:bx-> ntau\r
347         mov     cx, 134d\r
348         mov     dx, 3c4h\r
349         mov     ax, 0f02h\r
350 @@maskloop:\r
351         mov     bx, [ds:si]\r
352         dec     bx\r
353         mov     ah, [end_mask+bx]\r
354         out     dx, ax\r
355         shr     bx, 2d\r
356         mov     [es:bx+di], ch\r
357 \r
358         mov     bx, [ds:si+2]\r
359         inc     bx\r
360         mov     ah, [start_mask+bx]\r
361         out     dx, ax\r
362         shr     bx, 2d\r
363         mov     [es:bx+di], ch\r
364 \r
365 @@nextmask:\r
366         add     si,4d\r
367         add     di, 160d\r
368         loop    @@maskloop\r
369 \r
370         pop     bp es ds di si\r
371         ret\r
372 ENDP\r
373 ENDS\r
374 \r
375 END\r