Subversion Repositories Kolibri OS

Rev

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