initial commit
[fifth.git] / emulator / tvidput.inc
1 ; part of virtual processor, emulator for FIFTH\r
2 \r
3 \r
4 xtvidput:\r
5 mov     ebx, edi      ; read data from stack, and save it to variables\r
6 mov     eax, [es:ebx]\r
7 mov     [cory], eax\r
8 add     ebx, 4\r
9 mov     eax, [es:ebx]\r
10 mov     [corx], eax\r
11 \r
12 add     ebx, 4\r
13 mov     eax, [es:ebx]\r
14 add     eax, [xms_addr]\r
15 mov     ecx, [es:eax]\r
16 mov     [img2x], ecx\r
17 add     eax, 4\r
18 mov     ecx, [es:eax]\r
19 mov     [img2y], ecx\r
20 add     eax, 4\r
21 mov     [img2a], eax\r
22 \r
23 add     ebx, 4\r
24 mov     eax, [es:ebx]\r
25 add     eax, [xms_addr]\r
26 mov     ecx, [es:eax]\r
27 mov     [img1x], ecx\r
28 add     eax, 4\r
29 mov     ecx, [es:eax]\r
30 mov     [img1y], ecx\r
31 add     eax, 4\r
32 mov     [img1a], eax\r
33 \r
34 add     ebx, 4\r
35 mov     edi, ebx\r
36 \r
37 cmp     dword [cory] , 0        ; calculate Y start\r
38 jl      tvidl1\r
39 mov     dword [starty], 0\r
40 jmp     tvidl2\r
41 tvidl1:\r
42 mov     eax, [cory]\r
43 neg     eax\r
44 mov     [starty], eax\r
45 tvidl2:\r
46 \r
47 cmp     dword [corx] , 0        ; calculate X start\r
48 jl      tvidl3\r
49 mov     dword [startx], 0\r
50 jmp     tvidl4\r
51 tvidl3:\r
52 mov     eax, [corx]\r
53 neg     eax\r
54 mov     [startx], eax\r
55 tvidl4:\r
56 \r
57 mov     eax, [cory]             ; calculate Y end\r
58 add     eax, [img1y]\r
59 cmp     eax, [img2y]\r
60 jg      tvidl5\r
61 mov     eax, [img1y]\r
62 mov     [endy], eax\r
63 jmp     tvidl6\r
64 tvidl5:\r
65 mov     eax, [img2y]\r
66 sub     eax, [cory]\r
67 mov     [endy], eax\r
68 tvidl6:\r
69 \r
70 mov     eax, [corx]             ; calculate X end\r
71 add     eax, [img1x]\r
72 cmp     eax, [img2x]\r
73 jg      tvidl7\r
74 mov     eax, [img1x]\r
75 mov     [endx], eax\r
76 jmp     tvidl8\r
77 tvidl7:\r
78 mov     eax, [img2x]\r
79 sub     eax, [corx]\r
80 mov     [endx], eax\r
81 tvidl8:\r
82 \r
83 mov     eax, [endy]             ; calculate Y length\r
84 sub     eax, [starty]\r
85 cmp     eax, 0\r
86 jle     emu\r
87 mov     [lengthy], eax\r
88 \r
89 mov     eax, [endx]             ; calculate X length\r
90 sub     eax, [startx]\r
91 cmp     eax, 0\r
92 jle     emu\r
93 mov     [lengthx], eax\r
94 \r
95 mov     eax, [starty]           ; calculate img1 start address\r
96 mov     ebx, [img1x]\r
97 sub     edx, edx\r
98 mul     ebx\r
99 add     eax, [img1a]\r
100 add     eax, [startx]\r
101 mov     [img1start], eax\r
102 \r
103 mov     eax, [cory]             ; calculate img2 start address\r
104 add     eax, [starty]\r
105 mov     ebx, [img2x]\r
106 sub     edx, edx\r
107 mul     ebx\r
108 add     eax, [img2a]\r
109 add     eax, [corx]\r
110 add     eax, [startx]\r
111 mov     [img2start], eax\r
112 \r
113 tvidl9:\r
114 mov     ebx, [img1start]\r
115 mov     ecx, [lengthx]\r
116 mov     edx, [img2start]\r
117 \r
118 tmemmove:                ; ebx - from, edx - to, ecx - amount\r
119 cmp     ecx, 0\r
120 je      tl11\r
121 mov     al, [es:ebx]\r
122 cmp     al, 255\r
123 je      tl12\r
124 mov     [es:edx], al\r
125 tl12:\r
126 inc     ebx\r
127 inc     edx\r
128 dec     ecx\r
129 jmp     tmemmove\r
130 tl11:\r
131 \r
132 mov     eax, [img1x]\r
133 add     [img1start], eax\r
134 mov     eax, [img2x]\r
135 add     [img2start], eax\r
136 dec     dword [lengthy]\r
137 cmp     [lengthy], 0\r
138 jg      tvidl9\r
139 \r
140 jmp     emu\r