Subversion Repositories Kolibri OS

Rev

Rev 205 | Rev 551 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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