Rev 109 | Rev 180 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 109 | Rev 131 | ||
---|---|---|---|
Line 14... | Line 14... | ||
14 | ; Thanks to Ville, the author of this wonderful OS ! |
14 | ; Thanks to Ville, the author of this wonderful OS ! |
15 | ; Join with us to code ! |
15 | ; Join with us to code ! |
16 | ; |
16 | ; |
17 | ; |
17 | ; |
18 | ; Changelog: |
18 | ; Changelog: |
19 | ; |
- | |
- | 19 | ; 09.11.2005 - fix for work under MeosDebug & better random - Andrey Halyavin |
|
20 | ; 28.06.2001 - fasm port & framed blocks - Ville Turjanmaa |
20 | ; 23.09.2005 - fixed bug, when 011111111111111-like sequence interpreted |
- | 21 | ; as _11111111111111 in check_full_line - Sergey Kuzmin aka Wildwest |
|
21 | ; 31.10.2001 - rdtsc replaced - quickcode |
22 | ; 18.09.2005 - added 'Pause' button and made appropriate code and interface redesign |
- | 23 | ; BTW, you can MOVE and ROTATE block during Pause ;) - Sergey Kuzmin aka Wildwest |
|
22 | ; 03.11.2003 - added new blocks & random - Ivan Poddubny |
24 | ; 03.11.2003 - added new blocks & random - Ivan Poddubny |
- | 25 | ; 31.10.2001 - rdtsc replaced - quickcode |
|
- | 26 | ; 28.06.2001 - fasm port & framed blocks - Ville Turjanmaa |
|
- | 27 | ; |
|
23 | ; |
28 | ; |
Line 24... | Line 29... | ||
24 | 29 | ||
25 | LEN_X equ 14 |
30 | LEN_X equ 19 ;width of table |
26 | LEN_Y equ 24 |
31 | LEN_Y equ 29 ; height of table |
27 | BORDER_LEFT equ 2 |
32 | BORDER_LEFT equ 1 |
28 | BORDER_RIGHT equ 2 |
33 | BORDER_RIGHT equ 1 |
29 | BORDER_TOP equ 1 |
34 | BORDER_TOP equ 1 |
30 | BORDER_BOTTOM equ 1 |
35 | BORDER_BOTTOM equ 1 |
31 | ADOBE_SIZE equ 12 |
- | |
32 | X_LOCATION equ 6 |
- | |
33 | Y_LOCATION equ 21 |
- | |
34 | _MAXBLOCKS_ = 7*4 |
- | |
Line -... | Line 36... | ||
- | 36 | ADOBE_SIZE equ 12 |
|
- | 37 | ||
- | 38 | X_LOCATION equ 30 ; distance to table from left side |
|
- | 39 | Y_LOCATION equ 50 ; distance to table from header |
|
- | 40 | ||
- | 41 | UP_KEY equ 130+48 |
|
- | 42 | DOWN_KEY equ 129+48 |
|
- | 43 | LEFT_KEY equ 128+48 |
|
- | 44 | RIGHT_KEY equ 131+48 |
|
- | 45 | BACKGROUND equ 03000080h |
|
Line 35... | Line 46... | ||
35 | SCORE_TO_NEW_LEVEL equ 100000 |
46 | |
Line 36... | Line 47... | ||
36 | 47 | _MAXBLOCKS_ = 7*4 |
|
Line 37... | Line 48... | ||
37 | 48 | ||
38 | use32 |
49 | use32 |
39 | 50 | ||
40 | org 0x0 |
51 | org 0x0 |
41 | 52 | ||
42 | db 'MENUET01' ; 8 byte id |
53 | db 'MENUET01' ; 8 byte id |
43 | dd 0x01 ; header version |
54 | dd 0x01 ; header version |
44 | dd START ; program start |
55 | dd START ; program start |
- | 56 | dd I_END ; program image size |
|
- | 57 | dd I_END+1024 ; reguired amount of memory |
|
- | 58 | dd I_END+1024 ; esp |
|
45 | dd I_END ; program image size |
59 | dd 0x0,0x0 ; I_PARAM, I_ICON |
Line 46... | Line -... | ||
46 | dd IM_END ; reguired amount of memory |
- | |
47 | dd IM_END ; esp |
- | |
48 | dd 0x0,0x0 ; I_PARAM, I_ICON |
- | |
49 | include 'lang.inc' |
- | |
50 | START: ; start of execution |
- | |
51 | - | ||
Line 52... | Line -... | ||
52 | mov eax,3 ; |
- | |
53 | int 0x40 ; |
60 | include 'lang.inc' |
54 | mov cl,16 ; |
- | |
Line -... | Line 61... | ||
- | 61 | include 'macros.inc' |
|
- | 62 | ||
- | 63 | ||
- | 64 | START: ; start of execution |
|
- | 65 | ||
55 | ror eax,cl ; to make seconds more significant |
66 | |
Line 56... | Line 67... | ||
56 | mov [generator],eax ; |
67 | ; -- quickcode - start |
57 | call random ; |
- | |
Line 58... | Line -... | ||
58 | - | ||
Line 59... | Line 68... | ||
59 | mov byte[status],'0' |
68 | |
60 | mov byte[menu],'0' |
69 | mov eax,3 |
- | 70 | int 0x40 |
|
Line -... | Line 71... | ||
- | 71 | mov cl,16 |
|
- | 72 | ror eax,cl ; to make seconds more significant |
|
61 | call draw_window ; at first, draw the window |
73 | mov [generator],eax |
Line 62... | Line -... | ||
62 | - | ||
63 | still: |
74 | call random |
Line 64... | Line -... | ||
64 | - | ||
65 | cmp byte[status],'2' |
- | |
66 | je attesa |
- | |
67 | - | ||
68 | cmp byte[status],'1' |
- | |
69 | 75 | ||
70 | jne attesa |
76 | ; -- quickcode - end |
Line 71... | Line 77... | ||
71 | xor edx,edx |
77 | |
72 | 78 | ||
Line 89... | Line 95... | ||
89 | jnz check_button |
95 | jnz check_button |
90 | jmp key |
96 | jmp key |
91 | check_button: |
97 | check_button: |
92 | cmp eax,3 ; button in buffer ? |
98 | cmp eax,3 ; button in buffer ? |
93 | jnz scendi |
99 | jnz scendi |
94 | mov eax,-1 ; close this program |
- | |
95 | int 0x40 |
100 | jmp button |
Line 96... | Line 101... | ||
96 | 101 | ||
97 | red: ; redraw |
102 | red: ; redraw |
98 | call draw_window |
103 | call draw_window |
Line 99... | Line -... | ||
99 | jmp still |
- | |
Line 100... | Line -... | ||
100 | - | ||
101 | parallel dd 1 |
- | |
Line -... | Line 104... | ||
- | 104 | jmp still |
|
- | 105 | ||
102 | 106 | ||
103 | scendi: cmp byte[status],'1' |
107 | |
104 | jne still |
108 | scendi: |
- | 109 | ;///////////////////////////////////////////////// Wildwest |
|
- | 110 | cmp dword [pauses], 0 |
|
- | 111 | je ok |
|
105 | 112 | jne not_ok |
|
106 | cmp byte[blabla],10 |
113 | not_ok: |
107 | je blabla_0 |
114 | inc dword [current_block_y] |
- | 115 | dec dword [current_block_y] |
|
- | 116 | call check_crash |
|
108 | inc byte[blabla] |
117 | jne block_crash |
109 | jmp blabla_1 |
118 | jmp draw |
110 | blabla_0: |
119 | ok: |
111 | mov byte[blabla],0 |
- | |
112 | inc dword [current_block_y] |
- | |
113 | call check_crash |
- | |
114 | jne block_crash |
120 | ;///////////////////////////////////////////////// |
115 | blabla_1: |
121 | inc dword [current_block_y] |
116 | 122 | call check_crash |
|
117 | - | ||
118 | draw: movzx edx,byte [current_block_color] |
123 | jne block_crash |
119 | call draw_block |
124 | draw: movzx edx,byte [current_block_color] |
120 | mov eax,5 |
125 | call draw_block |
Line 121... | Line 126... | ||
121 | mov ebx,5 |
126 | mov eax,5 |
122 | sub ebx,[speed] |
127 | movzx ebx,byte [delay] |
123 | int 0x40 |
128 | int 0x40 |
124 | jmp still |
129 | jmp still |
125 | 130 | ||
126 | block_crash: dec dword [current_block_y] |
131 | block_crash: dec dword [current_block_y] |
127 | movzx edx,byte [current_block_color] |
132 | movzx edx,byte [current_block_color] |
- | 133 | call draw_block |
|
128 | call draw_block |
134 | call fix_block |
129 | call fix_block |
135 | call check_full_line |
130 | call check_full_line |
136 | call draw_table |
131 | call draw_table |
137 | call new_block |
132 | call new_block |
138 | inc dword [score] |
133 | call write_score |
139 | call write_score |
134 | call check_crash |
140 | call check_crash |
135 | jz adr400 |
141 | jz adr400 |
136 | aspetta: mov eax,10 |
142 | aspetta: mov eax,10 |
137 | int 0x40 |
143 | int 0x40 |
138 | cmp eax,1 |
- | |
139 | jne adr10000 |
144 | cmp eax,1 |
140 | call draw_window |
145 | jne adr10000 |
141 | adr10000: cmp eax,3 |
146 | call draw_window |
- | 147 | adr10000: cmp eax,3 |
|
- | 148 | jne aspetta |
|
- | 149 | new_game: mov eax,17 |
|
- | 150 | int 0x40 |
|
142 | jne aspetta |
151 | cmp ah,1 |
- | 152 | jnz adr401 |
|
143 | 153 | jmp end_program |
|
144 | new_game: mov dword [score],0 |
154 | adr401: |
145 | mov dword [lines],0 |
- | |
146 | mov dword [level],0 |
155 | ;///////////////////////////////////////////////////// Wildwest |
147 | mov dword [speed],0 |
156 | mov dword [pauses], 0 |
Line 148... | Line 157... | ||
148 | mov byte [status],'1' |
157 | ;//////////////////////////////////////////////////// |
149 | call clear_table_tetris |
158 | mov dword [score],0 |
- | 159 | call clear_table_tetris |
|
- | 160 | call new_block |
|
- | 161 | call draw_window |
|
150 | call first_block |
162 | |
Line 151... | Line -... | ||
151 | call new_block |
- | |
152 | call draw_window |
163 | adr400: movzx edx,byte [current_block_color] |
153 | - | ||
154 | adr400: movzx edx,byte [current_block_color] |
164 | call draw_block |
155 | call draw_block |
- | |
156 | jmp still |
- | |
157 | - | ||
158 | include 'key.inc' |
- | |
Line -... | Line 165... | ||
- | 165 | mov eax,5 |
|
- | 166 | movzx ebx,byte [delay] |
|
- | 167 | int 0x40 |
|
- | 168 | jmp still |
|
- | 169 | ||
- | 170 | key: mov eax,2 |
|
- | 171 | int 0x40 |
|
- | 172 | ||
- | 173 | adr32: cmp ah,LEFT_KEY |
|
- | 174 | jne adr_30 |
|
- | 175 | dec dword [current_block_x] |
|
- | 176 | call check_crash |
|
- | 177 | jz adr4000 |
|
- | 178 | inc dword [current_block_x] |
|
- | 179 | adr4000: jmp scendi |
|
- | 180 | ||
- | 181 | adr_30: cmp ah,RIGHT_KEY |
|
- | 182 | jne adr_31 |
|
- | 183 | inc dword [current_block_x] |
|
- | 184 | call check_crash |
|
- | 185 | jz adr3000 |
|
- | 186 | dec dword [current_block_x] |
|
- | 187 | adr3000: jmp scendi |
|
159 | include 'mouse.inc' |
188 | |
- | 189 | adr_31: cmp ah,UP_KEY |
|
- | 190 | jne adr51 |
|
- | 191 | mov edx,[current_block_pointer] |
|
- | 192 | mov edx,[edx+16] |
|
- | 193 | mov esi,[current_block_pointer] |
|
- | 194 | mov [current_block_pointer],edx |
|
- | 195 | call check_crash |
|
- | 196 | jz adr50 |
|
- | 197 | mov [current_block_pointer],esi |
|
- | 198 | adr50: jmp scendi |
|
- | 199 | ||
- | 200 | adr51: cmp ah,DOWN_KEY |
|
Line 160... | Line -... | ||
160 | include 'menu.inc' |
- | |
Line 161... | Line -... | ||
161 | include 'window.inc' |
- | |
162 | include 'block.inc' |
- | |
163 | include 'table.inc' |
- | |
164 | include 'random.inc' |
- | |
165 | include 'score.inc' |
- | |
166 | - | ||
167 | ; DATA AREA |
201 | jne adr61 |
168 | - | ||
169 | include 'blocks.inc' |
202 | mov byte [delay],5 ;!!! 2 |
170 | - | ||
171 | labelt: db 'TETRIS II' |
203 | adr52: jmp scendi |
172 | scoretext: db 'Score:' |
- | |
173 | linestext: db 'Lines:' |
- | |
174 | speedtext: db 'Speed:' |
- | |
175 | leveltext: db 'Level:' |
- | |
176 | startgame: db 'START' |
- | |
177 | instr: db 'INSTRUCTIONS' |
- | |
178 | hist: db 'HISTORY' |
- | |
179 | quit: db 'EXIT' |
- | |
180 | paused: db 'PAUSED' |
- | |
181 | txt_end: |
- | |
182 | - | ||
183 | history: |
- | |
184 | db 'TETRIS for MENUET v2.0 ' |
- | |
185 | db ' ' |
- | |
186 | db ' ' |
- | |
187 | db 'Originally made ' |
- | |
188 | db ' by Paolo Minazzi ' |
204 | |
189 | db ' ' |
205 | adr61: cmp ah,' ' |
190 | db 'Port & framed blocks ' |
- | |
191 | db ' by Ville Turjanmaa ' |
- | |
192 | db ' ' |
- | |
193 | db 'RDTSC replaced ' |
- | |
194 | db ' by quickcode ' |
206 | jne adr62 |
195 | db ' ' |
- | |
196 | db 'New blocks & better random ' |
- | |
197 | db ' by Ivan Poddubny ' |
- | |
198 | db ' ' |
- | |
199 | db 'Better control, logo, menu, pause ' |
- | |
200 | db ' by Jeffrey Amelynck' |
- | |
201 | - | ||
202 | db 'x <- END MARKER, DONT DELETE ' |
- | |
203 | 207 | mov byte [delay],5 ;!!! 2 |
|
204 | instructions: |
- | |
205 | db 'TETRIS for MENUET v2.0 ' |
- | |
206 | db ' ' |
- | |
207 | db 'Controls: ' |
- | |
208 | db ' ' |
208 | adr62: jmp scendi |
209 | db 'Use left & right key to navigate ' |
209 | |
210 | db 'Use up key to turn the block ' |
- | |
211 | db 'Use down key to make block fall ' |
- | |
212 | db 'Use P to pause game ' |
210 | |
213 | db 'Use N to start a new game ' |
- | |
Line -... | Line 211... | ||
- | 211 | button: ; button |
|
214 | db 'Use ESC to go back to menu or exit' |
212 | mov eax,17 |
- | 213 | int 0x40 |
|
Line -... | Line 214... | ||
- | 214 | cmp ah,1 ; button id=1 ? |
|
- | 215 | jz end_program |
|
- | 216 | cmp ah,2 |
|
- | 217 | jz go_new_game |
|
- | 218 | cmp ah,3 ; button id=3 ? ///Wildwest's 'Pause' button |
|
- | 219 | jz pause_program |
|
- | 220 | jmp still |
|
- | 221 | ||
215 | db 'You can also use the mouse to move' |
222 | end_program: |
- | 223 | mov eax,0xffffffff ; close this program |
|
- | 224 | int 0x40 |
|
- | 225 | ||
- | 226 | go_new_game: |
|
- | 227 | jmp new_game |
|
- | 228 | ;//////////////////////////////////////////////////// Wildwest |
|
- | 229 | pause_program: |
|
Line -... | Line 230... | ||
- | 230 | cmp dword [pauses], 0 |
|
- | 231 | je incr |
|
- | 232 | mov dword [pauses], 0 |
|
- | 233 | jmp still |
|
- | 234 | incr: |
|
- | 235 | mov dword [pauses], 1 |
|
- | 236 | jmp still |
|
- | 237 | ;//////////////////////////////////////////////////// |
|
- | 238 | ; ********************************************* |
|
- | 239 | ; ******* WINDOW DEFINITIONS AND DRAW ******** |
|
- | 240 | ; ********************************************* |
|
- | 241 | draw_window: |
|
- | 242 | ||
- | 243 | ||
- | 244 | mov eax,12 ; function 12:tell os about windowdraw |
|
- | 245 | mov ebx,1 ; 1, start of draw |
|
- | 246 | int 0x40 |
|
- | 247 | ||
- | 248 | ; DRAW WINDOW |
|
- | 249 | mov eax,0 ; function 0 : define and draw window |
|
- | 250 | mov ebx,320*65536+(LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2 |
|
- | 251 | mov ecx,25*65536+ (LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION+30 |
|
- | 252 | mov edx,BACKGROUND ; color of work area RRGGBB |
|
- | 253 | mov esi,0x006688ee;99bbff ; color of grab bar RRGGBB,8->col |
|
- | 254 | mov edi,0x007799ff;99bbee ; color of frames RRGGBB |
|
- | 255 | int 0x40 |
|
- | 256 | ||
- | 257 | ; WINDOW LABEL |
|
- | 258 | mov eax,4 ; function 4 : write text to window |
|
- | 259 | mov ebx,8*65536+8 ; [x start] *65536 + [y start] |
|
- | 260 | mov ecx,0x10ffffff ; color of text RRGGBB |
|
- | 261 | mov edx,labelt ; pointer to text beginning |
|
- | 262 | mov esi,labellen-labelt ; text length |
|
- | 263 | int 0x40 |
|
- | 264 | ||
- | 265 | ; CLOSE BUTTON |
|
- | 266 | ; mov eax,8 ; function 8 : define and draw button |
|
- | 267 | ; mov ebx,243*65536+12 ; [x start] *65536 + [x size] |
|
- | 268 | ; mov ecx,5*65536+12 ; [y start] *65536 + [y size] |
|
- | 269 | ; mov edx,1 ; button id |
|
- | 270 | ; mov esi,0x5580cc;22aacc ; button color RRGGBB |
|
- | 271 | ; int 0x40 |
|
- | 272 | ||
- | 273 | mov eax,8 |
|
- | 274 | mov ebx,30*65536+102 |
|
- | 275 | mov ecx,378*65536+18 |
|
- | 276 | mov edx,2 |
|
- | 277 | mov esi,0xA24466;5580cc;22aacc |
|
- | 278 | int 0x40 |
|
- | 279 | ;/////////////////////////////////////////////// Wildwest's 'Pause' button |
|
- | 280 | mov eax,8 |
|
- | 281 | mov ebx,132*65536+102 |
|
- | 282 | mov ecx,378*65536+18 |
|
- | 283 | mov edx,3 |
|
- | 284 | mov esi,0x0FA0F0; |
|
- | 285 | int 0x40 |
|
- | 286 | ||
- | 287 | mov eax,4 ; function 4 : write text to window |
|
- | 288 | mov ebx,164*65536+384 ; [x start] *65536 + [y start] |
|
- | 289 | mov ecx,0x10ffffff ; color of text RRGGBB |
|
- | 290 | mov edx,labe ; pointer to text beginning |
|
- | 291 | mov esi,labelen-labe ; text length |
|
- | 292 | int 0x40 |
|
- | 293 | ;/////////////////////////////////////////////// |
|
- | 294 | mov eax,4 |
|
- | 295 | mov ebx,49*65536+384 |
|
- | 296 | xor ecx,ecx |
|
- | 297 | mov ecx,0x10ffffff |
|
- | 298 | mov edx,game_finished |
|
- | 299 | mov esi,size_of_game_finished-game_finished |
|
- | 300 | int 0x40 |
|
- | 301 | ||
- | 302 | call draw_table |
|
- | 303 | ||
- | 304 | movzx edx,byte [current_block_color] |
|
- | 305 | call draw_block |
|
- | 306 | ||
- | 307 | cld |
|
- | 308 | mov ebx,38*65536+35 ; draw info text with function 4 |
|
- | 309 | mov ecx,0x10ffffff ; color |
|
- | 310 | mov edx,text |
|
- | 311 | mov esi,7 |
|
- | 312 | mov eax,4 |
|
- | 313 | int 0x40 |
|
- | 314 | ||
- | 315 | call write_score |
|
- | 316 | ||
- | 317 | mov eax,12 ; function 12:tell os about windowdraw |
|
- | 318 | mov ebx,2 ; 2, end of draw |
|
- | 319 | int 0x40 |
|
- | 320 | ||
- | 321 | ret |
|
- | 322 | ||
- | 323 | ;------------------------------------------------------------- |
|
- | 324 | ; CHECK CRASH |
|
- | 325 | ; output Z flag => OK |
|
- | 326 | ; NZ flag => NO |
|
- | 327 | ;------------------------------------------------------------- |
|
- | 328 | ||
- | 329 | check_crash: mov ebx,[current_block_pointer] |
|
- | 330 | ||
- | 331 | mov edx,[current_block_y] |
|
- | 332 | imul edx,LEN_X |
|
- | 333 | add edx,[current_block_x] ;find the offset in tetris_t |
|
- | 334 | ||
- | 335 | add edx,table_tetris |
|
- | 336 | ||
- | 337 | mov ecx,4 |
|
- | 338 | xor ax,ax |
|
- | 339 | ||
- | 340 | adr_1: cmp byte [ebx],1 |
|
- | 341 | jne adr_2 |
|
- | 342 | add al,[edx] |
|
- | 343 | adc ah,0 |
|
- | 344 | adr_2: inc ebx |
|
- | 345 | inc edx |
|
- | 346 | ||
- | 347 | cmp byte [ebx],1 |
|
- | 348 | jne adr_3 |
|
- | 349 | add al,[edx] |
|
- | 350 | adc ah,0 |
|
- | 351 | adr_3: inc ebx |
|
- | 352 | inc edx |
|
- | 353 | ||
- | 354 | cmp byte [ebx],1 |
|
- | 355 | jne adr_4 |
|
- | 356 | add al,[edx] |
|
- | 357 | adc ah,0 |
|
- | 358 | adr_4: inc ebx |
|
- | 359 | inc edx |
|
- | 360 | ||
- | 361 | cmp byte [ebx],1 |
|
- | 362 | jne adr_5 |
|
- | 363 | add al,[edx] |
|
- | 364 | adc ah,0 |
|
- | 365 | adr_5: inc ebx |
|
- | 366 | add edx,LEN_X-3 |
|
- | 367 | ||
- | 368 | loop adr_1 |
|
- | 369 | or ax,ax |
|
- | 370 | ret |
|
- | 371 | ;------------------------------------------------------------- |
|
- | 372 | ;NEW BLOCK |
|
- | 373 | ;------------------------------------------------------------- |
|
- | 374 | new_block: mov dword [current_block_y],1 |
|
- | 375 | mov dword [current_block_x],7 |
|
- | 376 | ||
- | 377 | call random |
|
- | 378 | and al,7 |
|
- | 379 | setz ah |
|
- | 380 | add al,ah |
|
- | 381 | mov [current_block_color],al |
|
- | 382 | ||
- | 383 | call random |
|
- | 384 | ;and eax,15 |
|
- | 385 | ; ---- Ivan ---- |
|
- | 386 | and eax,0xff |
|
- | 387 | @@: |
|
- | 388 | cmp eax,_MAXBLOCKS_ |
|
- | 389 | jl @f |
|
- | 390 | add eax,-(_MAXBLOCKS_) |
|
- | 391 | jmp @b |
|
- | 392 | @@: |
|
- | 393 | ; ---- Ivan ---- |
|
- | 394 | mov edx,[block_table+eax*4] |
|
- | 395 | mov [current_block_pointer],edx |
|
- | 396 | ||
- | 397 | mov byte [delay],22 ;19 ;!!! 15 |
|
- | 398 | ret |
|
- | 399 | ;------------------------------------------------------------- |
|
- | 400 | ; FIX BLOCK |
|
- | 401 | ;------------------------------------------------------------- |
|
- | 402 | fix_block: mov ebx,[current_block_pointer] |
|
- | 403 | ||
- | 404 | mov edx,[current_block_y] |
|
- | 405 | imul edx,LEN_X |
|
- | 406 | add edx,[current_block_x] ;find the offset in tetris_t |
|
- | 407 | ||
- | 408 | add edx,table_tetris |
|
- | 409 | ||
- | 410 | mov ecx,4 |
|
- | 411 | mov al,[current_block_color] |
|
- | 412 | ||
- | 413 | adr_21: cmp byte [ebx],1 |
|
- | 414 | jne adr_22 |
|
- | 415 | mov [edx],al |
|
- | 416 | adr_22: inc ebx |
|
- | 417 | inc edx |
|
- | 418 | ||
- | 419 | cmp byte [ebx],1 |
|
- | 420 | jne adr_23 |
|
- | 421 | mov [edx],al |
|
- | 422 | adr_23: inc ebx |
|
- | 423 | inc edx |
|
- | 424 | ||
- | 425 | cmp byte [ebx],1 |
|
- | 426 | jne adr_24 |
|
- | 427 | mov [edx],al |
|
- | 428 | adr_24: inc ebx |
|
- | 429 | inc edx |
|
- | 430 | ||
- | 431 | cmp byte [ebx],1 |
|
- | 432 | jne adr_25 |
|
- | 433 | mov [edx],al |
|
- | 434 | adr_25: inc ebx |
|
- | 435 | add edx,LEN_X-3 |
|
- | 436 | ||
- | 437 | loop adr_21 |
|
- | 438 | ret |
|
- | 439 | ||
- | 440 | ;-------------------------------------------------------------- |
|
- | 441 | ; DRAW_TABLE |
|
- | 442 | ;-------------------------------------------------------------- |
|
- | 443 | draw_table: mov esi,table_tetris+LEN_X*BORDER_TOP+BORDER_LEFT |
|
- | 444 | ||
- | 445 | mov ebx,X_LOCATION*65536+ADOBE_SIZE |
|
- | 446 | mov ecx,Y_LOCATION*65536+ADOBE_SIZE |
|
- | 447 | mov edi,LEN_Y-BORDER_TOP-BORDER_BOTTOM |
|
- | 448 | y_draw: push edi |
|
- | 449 | ||
- | 450 | mov edi,LEN_X-BORDER_LEFT-BORDER_RIGHT |
|
- | 451 | x_draw: push edi |
|
- | 452 | ; pusha |
|
- | 453 | ; mov eax,5 |
|
- | 454 | ; mov ebx,10 |
|
- | 455 | ; int 0x40 |
|
- | 456 | ; popa |
|
- | 457 | mov ax,13 |
|
- | 458 | movzx edx,byte [esi] |
|
- | 459 | mov edx,[color_table+edx*4] |
|
- | 460 | int 0x40 |
|
- | 461 | call draw_frames |
|
- | 462 | inc esi |
|
- | 463 | add ebx,65536*ADOBE_SIZE |
|
- | 464 | pop edi |
|
- | 465 | dec edi |
|
- | 466 | jnz x_draw |
|
- | 467 | ||
- | 468 | add esi,BORDER_LEFT+BORDER_RIGHT |
|
- | 469 | mov ebx,X_LOCATION*65536+ADOBE_SIZE |
|
- | 470 | add ecx,65536*ADOBE_SIZE |
|
- | 471 | pop edi |
|
- | 472 | dec edi |
|
- | 473 | jnz y_draw |
|
- | 474 | ||
- | 475 | ret |
|
- | 476 | ;-------------------------------------------------------------- |
|
- | 477 | ;DRAW BLOCK |
|
- | 478 | ; |
|
- | 479 | ; ebx=x [0..LEN_X-1] |
|
- | 480 | ; ecx=y [0..LEN_Y-1] |
|
- | 481 | ; edi=pointer block |
|
- | 482 | ;-------------------------------------------------------------- |
|
- | 483 | draw_block: |
|
- | 484 | ||
- | 485 | mov eax,13 |
|
- | 486 | mov edx,[color_table+edx*4] |
|
- | 487 | ||
- | 488 | mov ebx,[current_block_x] |
|
- | 489 | mov ecx,[current_block_y] |
|
- | 490 | mov edi,[current_block_pointer] |
|
- | 491 | ||
- | 492 | sub ebx,BORDER_LEFT |
|
- | 493 | imul ebx,ADOBE_SIZE |
|
- | 494 | add ebx,X_LOCATION |
|
- | 495 | shl ebx,16 |
|
- | 496 | mov bx,ADOBE_SIZE |
|
- | 497 | ||
- | 498 | sub ecx,BORDER_TOP |
|
- | 499 | imul ecx,ADOBE_SIZE |
|
- | 500 | add ecx,Y_LOCATION |
|
- | 501 | shl ecx,16 |
|
- | 502 | mov cx,ADOBE_SIZE |
|
- | 503 | ||
- | 504 | mov dword [TMP_1],4 |
|
- | 505 | adr_122: mov dword [TMP_0],4 |
|
- | 506 | adr_121: cmp byte [edi],0 |
|
- | 507 | je adr_120 |
|
- | 508 | ||
- | 509 | int 040h |
|
- | 510 | ||
- | 511 | call draw_frames |
|
- | 512 | ||
- | 513 | adr_120: inc edi |
|
- | 514 | add ebx,ADOBE_SIZE*65536 |
|
- | 515 | dec dword [TMP_0] |
|
- | 516 | jnz adr_121 |
|
- | 517 | sub ebx,4*ADOBE_SIZE*65536 |
|
- | 518 | add ecx,ADOBE_SIZE*65536 |
|
- | 519 | dec dword [TMP_1] |
|
- | 520 | jnz adr_122 |
|
- | 521 | ||
- | 522 | ret |
|
- | 523 | ||
- | 524 | draw_frames: |
|
- | 525 | cmp edx,0 |
|
- | 526 | jne df1 |
|
- | 527 | ret |
|
- | 528 | df1: |
|
- | 529 | pusha |
|
- | 530 | mov bx,1 |
|
- | 531 | add edx,0x282828 |
|
- | 532 | mov eax,13 |
|
- | 533 | int 0x40 |
|
- | 534 | popa |
|
- | 535 | ||
- | 536 | pusha |
|
- | 537 | mov cx,1 |
|
- | 538 | add edx,0x282828 |
|
- | 539 | mov eax,13 |
|
- | 540 | int 0x40 |
|
- | 541 | popa |
|
- | 542 | ||
- | 543 | pusha |
|
- | 544 | push ebx |
|
- | 545 | sub bx,1 |
|
- | 546 | add [esp+2],bx |
|
- | 547 | pop ebx |
|
- | 548 | mov bx,1 |
|
- | 549 | shr edx,1 |
|
- | 550 | and edx,0x7f7f7f |
|
- | 551 | mov eax,13 |
|
- | 552 | int 0x40 |
|
- | 553 | popa |
|
- | 554 | ||
- | 555 | pusha |
|
- | 556 | push ecx |
|
- | 557 | sub cx,1 |
|
- | 558 | add [esp+2],cx |
|
- | 559 | pop ecx |
|
- | 560 | mov cx,1 |
|
- | 561 | shr edx,1 |
|
- | 562 | and edx,0x7f7f7f |
|
- | 563 | mov eax,13 |
|
- | 564 | int 0x40 |
|
- | 565 | popa |
|
- | 566 | ||
- | 567 | ret |
|
- | 568 | ||
- | 569 | ||
- | 570 | ;-------------------------------------------------------------- |
|
- | 571 | clear_table_tetris: |
|
- | 572 | cld |
|
- | 573 | mov al,1 |
|
- | 574 | mov edi,table_tetris |
|
- | 575 | mov ecx,LEN_X*BORDER_TOP |
|
- | 576 | rep stosb |
|
- | 577 | ||
- | 578 | mov edx,LEN_Y-BORDER_TOP-BORDER_BOTTOM |
|
- | 579 | adr300: mov cl,BORDER_LEFT |
|
- | 580 | rep stosb |
|
- | 581 | dec ax ;AL=0 |
|
- | 582 | mov cl,LEN_X-BORDER_LEFT-BORDER_RIGHT |
|
- | 583 | rep stosb |
|
- | 584 | inc ax ;AL=1 |
|
- | 585 | mov cl,BORDER_RIGHT |
|
- | 586 | rep stosb |
|
- | 587 | dec dx |
|
- | 588 | jne adr300 |
|
- | 589 | ||
- | 590 | mov ecx,LEN_X*BORDER_BOTTOM |
|
- | 591 | rep stosb |
|
- | 592 | ret |
|
- | 593 | ;-------------------------------------------------------------- |
|
- | 594 | ;edx = pointer |
|
- | 595 | ;ebx = contatore |
|
- | 596 | check_full_line: |
|
- | 597 | std |
|
- | 598 | mov al,0 |
|
- | 599 | mov edx,table_tetris+LEN_X*(LEN_Y-BORDER_BOTTOM)-1 |
|
- | 600 | mov ebx,(LEN_Y-BORDER_TOP-BORDER_BOTTOM-1)*LEN_X |
|
- | 601 | ||
- | 602 | adr_5000: mov edi,edx |
|
- | 603 | mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT+1;Wildwest's fix for bug |
|
- | 604 | ;(was LEN_X-BORDER_LEFT-BORDER_RIGHT) |
|
- | 605 | repne scasb |
|
- | 606 | jz no_full_line |
|
- | 607 | ||
- | 608 | lea esi,[edx-LEN_X] |
|
- | 609 | mov edi,edx |
|
- | 610 | mov ecx,ebx |
|
- | 611 | rep movsb |
|
- | 612 | sub edi,BORDER_RIGHT |
|
- | 613 | mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT |
|
- | 614 | rep stosb |
|
- | 615 | add dword [score],50 |
|
- | 616 | jmp adr_5000 |
|
- | 617 | ||
- | 618 | no_full_line: sub edx,LEN_X |
|
- | 619 | sub ebx,LEN_X |
|
- | 620 | jnz adr_5000 |
|
- | 621 | ||
- | 622 | ret |
|
- | 623 | ;-------------------------------------------------------------- |
|
- | 624 | random: mov eax,[generator] |
|
- | 625 | add eax,-43ab45b5h |
|
- | 626 | ror eax,1 |
|
- | 627 | xor eax,32c4324fh |
|
- | 628 | ror eax,1 |
|
- | 629 | mov [generator],eax |
|
- | 630 | ; --- IVAN --- |
|
- | 631 | push ebx |
|
- | 632 | mov eax,26 |
|
- | 633 | mov ebx,9 |
|
- | 634 | int 0x40 |
|
- | 635 | pop ebx |
|
- | 636 | xor eax,0xdeadbeef |
|
- | 637 | add eax,[generator] |
|
- | 638 | ; --- IVAN --- |
|
- | 639 | mov [generator],eax ; Halyavin |
|
- | 640 | ret |
|
- | 641 | ;-------------------------------------------------------------- |
|
- | 642 | number_to_str: mov edi,end_number_str-1 |
|
- | 643 | mov ecx,9;size_of_number_str |
|
- | 644 | mov ebx,10 |
|
- | 645 | cld |
|
- | 646 | new_digit: xor edx,edx |
|
- | 647 | div ebx |
|
- | 648 | add dl,'0' |
|
- | 649 | mov [edi],dl |
|
- | 650 | dec edi |
|
- | 651 | loop new_digit |
|
- | 652 | ret |
|
- | 653 | ;-------------------------------------------------------------- |
|
- | 654 | write_score: |
|
- | 655 | mov eax,[score] |
|
- | 656 | call number_to_str |
|
- | 657 | ||
- | 658 | mov ebx,100*65536+100 ;clear box to write new score |
|
- | 659 | mov ecx,35*65536+15 |
|
- | 660 | mov edx,BACKGROUND |
|
- | 661 | mov eax,13 |
|
- | 662 | int 40h |
|
- | 663 | ||
- | 664 | mov ebx,100*65536+35 ; draw info text with function 4 |
|
- | 665 | mov ecx,0xffff00 ; color |
|
- | 666 | mov edx,number_str |
|
- | 667 | mov esi,[size_of_number_str] |
|
- | 668 | mov eax,4 |
|
- | 669 | int 0x40 |
|
- | 670 | ret |
|
- | 671 | ||
- | 672 | ; DATA AREA |
|
- | 673 | ||
- | 674 | ;-------------------------------------------------------------- |
|
- | 675 | ;DEFINITION BLOCKS |
|
- | 676 | ;-------------------------------------------------------------- |
|
- | 677 | t_block_0: db 0,0,0,0 |
|
- | 678 | db 1,1,1,0 |
|
- | 679 | db 0,1,0,0 |
|
- | 680 | db 0,0,0,0 |
|
- | 681 | dd t_block_3 |
|
- | 682 | ||
- | 683 | t_block_1: db 0,1,0,0 |
|
- | 684 | db 1,1,0,0 |
|
- | 685 | db 0,1,0,0 |
|
- | 686 | db 0,0,0,0 |
|
- | 687 | dd t_block_0 |
|
- | 688 | ||
- | 689 | t_block_2: db 0,1,0,0 |
|
- | 690 | db 1,1,1,0 |
|
- | 691 | db 0,0,0,0 |
|
- | 692 | db 0,0,0,0 |
|
- | 693 | dd t_block_1 |
|
- | 694 | ||
- | 695 | t_block_3 db 0,1,0,0 |
|
- | 696 | db 0,1,1,0 |
|
- | 697 | db 0,1,0,0 |
|
- | 698 | db 0,0,0,0 |
|
- | 699 | dd t_block_2 |
|
- | 700 | ;-------------------------------------------------------------- |
|
- | 701 | i_block_0: db 0,1,0,0 |
|
- | 702 | db 0,1,0,0 |
|
- | 703 | db 0,1,0,0 |
|
- | 704 | db 0,1,0,0 |
|
- | 705 | dd i_block_1 |
|
- | 706 | ||
- | 707 | i_block_1: db 0,0,0,0 |
|
- | 708 | db 1,1,1,1 |
|
- | 709 | db 0,0,0,0 |
|
- | 710 | db 0,0,0,0 |
|
- | 711 | dd i_block_0 |
|
- | 712 | ;-------------------------------------------------------------- |
|
- | 713 | q_block_0: db 0,1,1,0 |
|
- | 714 | db 0,1,1,0 |
|
- | 715 | db 0,0,0,0 |
|
- | 716 | db 0,0,0,0 |
|
- | 717 | dd q_block_0 |
|
- | 718 | ;-------------------------------------------------------------- |
|
- | 719 | s_block_0: |
|
- | 720 | db 0,0,0,0 |
|
- | 721 | db 0,1,1,0 |
|
- | 722 | db 1,1,0,0 |
|
- | 723 | db 0,0,0,0 |
|
- | 724 | dd s_block_1 |
|
- | 725 | ||
- | 726 | s_block_1: db 1,0,0,0 |
|
- | 727 | db 1,1,0,0 |
|
- | 728 | db 0,1,0,0 |
|
- | 729 | db 0,0,0,0 |
|
- | 730 | dd s_block_0 |
|
- | 731 | ;-------------------------------------------------------------- |
|
- | 732 | l_block_0: db 0,0,0,0 |
|
- | 733 | db 1,1,1,0 |
|
- | 734 | db 1,0,0,0 |
|
- | 735 | db 0,0,0,0 |
|
- | 736 | dd l_block_3 |
|
- | 737 | ||
- | 738 | l_block_1: db 1,1,0,0 |
|
- | 739 | db 0,1,0,0 |
|
- | 740 | db 0,1,0,0 |
|
- | 741 | db 0,0,0,0 |
|
- | 742 | dd l_block_0 |
|
- | 743 | ||
- | 744 | l_block_2: db 0,0,1,0 |
|
- | 745 | db 1,1,1,0 |
|
- | 746 | db 0,0,0,0 |
|
- | 747 | db 0,0,0,0 |
|
- | 748 | dd l_block_1 |
|
- | 749 | ||
- | 750 | l_block_3: db 0,1,0,0 |
|
- | 751 | db 0,1,0,0 |
|
- | 752 | db 0,1,1,0 |
|
- | 753 | db 0,0,0,0 |
|
- | 754 | dd l_block_2 |
|
- | 755 | ;----------------------------------------------- |
|
- | 756 | ||
- | 757 | g_block_0: |
|
- | 758 | ||
- | 759 | db 0,1,0,0 |
|
- | 760 | db 0,1,0,0 |
|
- | 761 | db 1,1,0,0 |
|
- | 762 | db 0,0,0,0 |
|
- | 763 | dd g_block_1 |
|
- | 764 | ||
- | 765 | g_block_1: |
|
- | 766 | db 0,0,0,0 |
|
- | 767 | db 1,1,1,0 |
|
- | 768 | db 0,0,1,0 |
|
- | 769 | db 0,0,0,0 |
|
- | 770 | dd g_block_2 |
|
- | 771 | ||
- | 772 | g_block_2: |
|
- | 773 | db 0,1,1,0 |
|
- | 774 | db 0,1,0,0 |
|
- | 775 | db 0,1,0,0 |
|
- | 776 | db 0,0,0,0 |
|
- | 777 | dd g_block_3 |
|
- | 778 | ||
- | 779 | g_block_3: |
|
- | 780 | db 1,0,0,0 |
|
- | 781 | db 1,1,1,0 |
|
- | 782 | db 0,0,0,0 |
|
- | 783 | db 0,0,0,0 |
|
- | 784 | dd g_block_0 |
|
- | 785 | ||
- | 786 | ;----------------------------------- |
|
- | 787 | ||
- | 788 | k_block_0: |
|
- | 789 | db 0,0,0,0 |
|
- | 790 | db 1,1,0,0 |
|
- | 791 | db 0,1,1,0 |
|
- | 792 | db 0,0,0,0 |
|
- | 793 | dd k_block_1 |
|
- | 794 | ||
- | 795 | k_block_1: |
|
- | 796 | db 0,1,0,0 |
|
- | 797 | db 1,1,0,0 |
|
- | 798 | db 1,0,0,0 |
|
- | 799 | db 0,0,0,0 |
|
- | 800 | dd k_block_0 |
|
- | 801 | ||
- | 802 | ;----------------------------------- |
|
- | 803 | ||
- | 804 | color_table: dd 00000000h ;black 0 |
|
- | 805 | dd 00cccccch ;white 1 |
|
- | 806 | dd 00cc0000h ;red 2 |
|
- | 807 | dd 0000cc00h ;green 3 |
|
- | 808 | dd 000000cch ;blue 4 |
|
- | 809 | dd 00cccc00h ;yellow 5 |
|
- | 810 | dd 0000cccch ;cyan 6 |
|
- | 811 | dd 00cc00cch ;pink 7 |
|
- | 812 | ||
- | 813 | block_table: |
|
- | 814 | dd t_block_0 ; t |
|
- | 815 | dd t_block_1 |
|
- | 816 | dd t_block_2 |
|
- | 817 | dd t_block_3 |
|
- | 818 | dd i_block_0 ; i |
|
- | 819 | dd i_block_1 |
|
- | 820 | dd i_block_0 |
|
- | 821 | dd i_block_1 |
|
- | 822 | dd q_block_0 ; q |
|
- | 823 | dd q_block_0 |
|
- | 824 | dd q_block_0 |
|
- | 825 | dd q_block_0 |
|
- | 826 | dd s_block_0 ; s |
|
- | 827 | dd s_block_1 |
|
- | 828 | dd s_block_0 |
|
- | 829 | dd s_block_1 |
|
- | 830 | dd l_block_0 ; l |
|
- | 831 | dd l_block_1 |
|
- | 832 | dd l_block_2 |
|
- | 833 | dd l_block_3 |
|
- | 834 | dd g_block_0 ; g |
|
- | 835 | dd g_block_1 |
|
- | 836 | dd g_block_2 |
|
- | 837 | dd g_block_3 |
|
- | 838 | dd k_block_0 ; k |
|
- | 839 | dd k_block_1 |
|
- | 840 | dd k_block_0 |
|
- | 841 | dd k_block_1 |
|
- | 842 | ||
- | 843 | if lang eq ru |
|
- | 844 | ||
- | 845 | labelt: |
|
- | 846 | db ' 1.6 - ' |
|
- | 847 | labellen: |
|
- | 848 | labe: |
|
- | 849 | db '' |
|
- | 850 | labelen: |
|
- | 851 | text: db '窨: ' |
|
- | 852 | game_finished: db ' ' |
|
- | 853 | size_of_game_finished: |
|
- | 854 | ||
- | 855 | else |
|
- | 856 | ||
- | 857 | labelt: |
|
216 | db 'the blocks, left button to let the' |
858 | db 'TETRIS 1.6 - ARROWS & SPACE' |
217 | db 'blocks fall and right button to ' |
- | |
218 | db 'rotate them ' |
- | |
219 | db 'you can pause the game by pressing' |
- | |
220 | db 'both mouse buttons ' |
859 | labellen: |
221 | db ' ' |
860 | labe: |
222 | db 'DONT FORGET: move mouse out of the' |
861 | db 'PAUSE' |
223 | db 'window if you want to use keyboard' |
862 | labelen: |
224 | 863 | text: db 'Score: ' |
|
225 | db 'x <- END MARKER, DONT DELETE ' |
864 | game_finished: db 'NEW GAME' |
226 | 865 | size_of_game_finished: |
|
227 | I_END: |
- | |
228 | - | ||
229 | score: dd 0 |
- | |
230 | level: dd 0 |
- | |
231 | speed: dd 0 |
866 | |
232 | lines: dd 0 |
867 | end if |
233 | TMP_0: dd 0 |
868 | |
234 | TMP_1: dd 0 |
869 | pauses dd 0 ;/// Wildwest |
235 | generator: dd 0 |
- | |
236 | current_block_x: dd 0 |
870 | parallel dd 1 |
Line 237... | Line -... | ||
237 | current_block_y: dd 0 |
- | |
238 | current_block_pointer: dd 0 |
- | |
239 | current_block_color: db 0 |
871 | score: dd 0 |