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