Rev 31 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | ; |
2 | ; FIRE for MENUET - Compile with FASM |
||
3 | ; |
||
4 | |||
5 | use32 |
||
6 | |||
7 | org 0x0 |
||
79 | diamond | 8 | db 'MENUET01' ; 8 byte id |
9 | dd 1 ; header version |
||
31 | halyavin | 10 | dd START ; program start |
11 | dd I_END ; image size |
||
79 | diamond | 12 | dd mem_end ; reguired amount of memory |
13 | dd mem_end |
||
14 | dd 0,0 ; no parameters, no path |
||
31 | halyavin | 15 | |
79 | diamond | 16 | ;include 'lang.inc' |
31 | halyavin | 17 | include 'macros.inc' |
18 | |||
19 | START: |
||
20 | |||
79 | diamond | 21 | red: |
31 | halyavin | 22 | |
79 | diamond | 23 | ; ************************************************ |
24 | ; ********* WINDOW DEFINITIONS AND DRAW ********** |
||
25 | ; ************************************************ |
||
31 | halyavin | 26 | |
79 | diamond | 27 | draw_window: |
28 | |||
29 | mov eax,12 ; tell os about redraw |
||
30 | mov ebx,1 |
||
31 | int 0x40 |
||
32 | |||
33 | xor eax,eax ; define and draw window |
||
34 | mov ebx,100*65536+321 |
||
35 | mov ecx,70*65536+222 |
||
36 | mov edx,0x00000000 |
||
37 | mov esi,0x00000000 |
||
38 | mov edi,0x00000000 |
||
39 | int 0x40 |
||
40 | |||
41 | mov al,4 ; 'FIRE FOR MENUET' |
||
42 | mov ebx,110*65536+8 |
||
43 | mov ecx,dword 0x00FFFFFF |
||
44 | mov edx,text |
||
45 | mov esi,textlen-text |
||
46 | int 0x40 |
||
47 | |||
48 | mov al,8 |
||
49 | mov ebx,(321-19)*65536+12 ; button start x & size |
||
50 | mov ecx,5*65536+12 ; button start y & size |
||
51 | mov edx,1 ; button number |
||
52 | mov esi,0x009a0000 |
||
53 | int 0x40 |
||
54 | |||
55 | mov ebx,ecx ;5*65536+12 |
||
56 | inc edx |
||
57 | int 0x40 |
||
58 | |||
59 | mov ebx,18*65536+12 |
||
60 | inc edx |
||
61 | int 0x40 |
||
62 | |||
63 | mov ebx,31*65536+12 |
||
64 | inc edx |
||
65 | int 0x40 |
||
66 | |||
67 | mov al,12 ; tell os about redraw end |
||
68 | mov ebx,2 |
||
69 | int 0x40 |
||
70 | |||
31 | halyavin | 71 | sta: ; calculate fire image |
72 | |||
79 | diamond | 73 | mov esi, FireScreen+0x2300-80 |
31 | halyavin | 74 | mov ecx, 80 |
79 | diamond | 75 | mov eax, [FireSeed] |
31 | halyavin | 76 | |
77 | NEWLINE: |
||
78 | |||
79 | diamond | 79 | mul [RandSeedConst] |
31 | halyavin | 80 | inc eax |
81 | mov [esi], dl |
||
82 | inc esi |
||
79 | diamond | 83 | loop NEWLINE |
31 | halyavin | 84 | |
79 | diamond | 85 | mov [FireSeed], eax |
31 | halyavin | 86 | |
79 | diamond | 87 | mov ecx, 0x2300-80 |
88 | sub esi, ecx |
||
89 | xor edx, edx |
||
90 | xor eax, eax |
||
91 | |||
31 | halyavin | 92 | FIRELOOP: |
79 | diamond | 93 | lodsb |
31 | halyavin | 94 | |
79 | diamond | 95 | cmp [type], ah |
31 | halyavin | 96 | jnz notype1 |
79 | diamond | 97 | mov dl, [esi + 1] |
98 | add eax, edx |
||
99 | mov dl, [esi] |
||
100 | add eax, edx |
||
101 | mov dl, [esi + 80] |
||
102 | jmp typedone |
||
31 | halyavin | 103 | notype1: |
104 | |||
79 | diamond | 105 | ; cmp [type],1 |
106 | ; jnz notype2 |
||
107 | mov dl, [esi - 2] |
||
108 | ; add eax, edx |
||
109 | ; mov dl, [esi - 2] |
||
110 | ; add eax, edx |
||
111 | lea eax, [eax + edx*2] |
||
112 | mov dl, [esi + 78] |
||
113 | ; notype2: |
||
31 | halyavin | 114 | |
79 | diamond | 115 | ; type 2 is never used |
116 | ; cmp [type],2 |
||
117 | ; jnz notype3 |
||
118 | ; mov dl, [esi - 2] |
||
119 | ; add eax, edx |
||
120 | ; mov dl, [esi] |
||
121 | ; add eax, edx |
||
122 | ; mov dl, [esi + 80] |
||
123 | ; notype3: |
||
31 | halyavin | 124 | |
79 | diamond | 125 | typedone: |
126 | add eax, edx |
||
31 | halyavin | 127 | shr eax, 2 |
128 | jz ZERO |
||
129 | dec eax |
||
130 | |||
131 | ZERO: |
||
132 | |||
79 | diamond | 133 | mov [esi - 81], al |
134 | loop FIRELOOP |
||
31 | halyavin | 135 | |
79 | diamond | 136 | mov al, 5 ; in this moment always high 24 bits of eax are zero! |
31 | halyavin | 137 | mov ebx,[delay] |
138 | int 0x40 |
||
139 | |||
79 | diamond | 140 | inc [calc] |
141 | cmp [calc], byte 2 |
||
142 | jnz nodrw |
||
31 | halyavin | 143 | |
144 | pdraw: |
||
145 | |||
79 | diamond | 146 | mov byte [calc],ah ;byte 0 |
31 | halyavin | 147 | |
79 | diamond | 148 | mov edi,ImageData |
149 | push edi ; pointer for sysfunction 7, draw image |
||
31 | halyavin | 150 | add edi,[fcolor] |
151 | mov esi,FireScreen |
||
152 | xor edx,edx |
||
153 | |||
154 | newc: |
||
79 | diamond | 155 | xor eax, eax |
156 | lodsb |
||
31 | halyavin | 157 | |
158 | mov ecx,eax |
||
79 | diamond | 159 | shr eax,1 |
160 | add cl,al |
||
161 | mov ch,al |
||
31 | halyavin | 162 | |
79 | diamond | 163 | mov [edi+0],ecx |
164 | mov [edi+3],ecx |
||
165 | mov [edi+6],ecx |
||
31 | halyavin | 166 | mov [edi+9],cx |
79 | diamond | 167 | lea ebx, [edi+320*3] |
168 | mov [ebx+0],ecx |
||
169 | mov [ebx+3],ecx |
||
170 | mov [ebx+6],ecx |
||
171 | mov [ebx+9],ecx |
||
31 | halyavin | 172 | |
173 | add edi,12 |
||
174 | inc edx |
||
175 | cmp edx,80 |
||
176 | jnz nnl |
||
177 | xor edx,edx |
||
178 | add edi,320*3 |
||
179 | nnl: |
||
79 | diamond | 180 | cmp esi,FireScreen+8000; 0x2000 |
31 | halyavin | 181 | jnz newc |
182 | |||
79 | diamond | 183 | mov al,7 ; display image |
184 | ; high 24 bits of eax are zero! |
||
185 | pop ebx |
||
31 | halyavin | 186 | mov ecx,4*80*65536+200 |
187 | mov edx,1*65536+22 |
||
188 | int 0x40 |
||
189 | |||
190 | nodrw: |
||
191 | |||
192 | mov eax,11 ; check if os wants to talk to us |
||
193 | int 0x40 |
||
79 | diamond | 194 | dec eax |
31 | halyavin | 195 | jz red |
79 | diamond | 196 | cmp al, 3-1 |
197 | jnz nob4 |
||
31 | halyavin | 198 | |
199 | button: ; get button id |
||
79 | diamond | 200 | mov al,17 |
31 | halyavin | 201 | int 0x40 |
79 | diamond | 202 | shr eax, 8 |
31 | halyavin | 203 | |
79 | diamond | 204 | dec eax |
31 | halyavin | 205 | jnz noclose |
79 | diamond | 206 | or eax,-1 ; close this program |
31 | halyavin | 207 | int 0x40 |
208 | noclose: |
||
209 | |||
79 | diamond | 210 | dec eax ; change fire type |
31 | halyavin | 211 | jnz nob2 |
79 | diamond | 212 | xor [type], 1 |
31 | halyavin | 213 | nob2: |
214 | |||
79 | diamond | 215 | dec eax ; change delay |
31 | halyavin | 216 | jnz nob3 |
79 | diamond | 217 | xor [delay], 1 |
31 | halyavin | 218 | nob3: |
219 | |||
79 | diamond | 220 | dec eax ; change color |
31 | halyavin | 221 | jnz nob4 |
222 | mov eax,[fcolor] |
||
79 | diamond | 223 | inc eax |
224 | ; cmp al,2 |
||
225 | ; jbe fcok |
||
226 | jnp fcok |
||
227 | xor eax,eax |
||
31 | halyavin | 228 | fcok: |
229 | mov [fcolor],eax |
||
79 | diamond | 230 | mov edi,ImageData |
231 | mov ecx,(320*600)/4 |
||
232 | xor eax,eax |
||
31 | halyavin | 233 | rep stosd |
234 | |||
235 | nob4: |
||
236 | jmp sta |
||
237 | |||
238 | ; DATA SECTION |
||
79 | diamond | 239 | RandSeedConst dd 0x8405 |
31 | halyavin | 240 | fcolor dd 2 |
241 | xx db 'x' |
||
79 | diamond | 242 | type db 0 |
243 | calc db 0 |
||
31 | halyavin | 244 | delay dd 0 |
245 | FireSeed dd 0x1234 |
||
246 | text: db 'FIRE FOR MENUET' |
||
247 | textlen: |
||
248 | |||
249 | I_END: |
||
250 | |||
79 | diamond | 251 | FireScreen: |
252 | rb 0x2300 |
||
253 | ImageData: |
||
254 | rb 320*200*3 |
||
31 | halyavin | 255 | |
79 | diamond | 256 | ; stack |
257 | align 512 |
||
258 | rb 512 |
||
259 | mem_end: |