Subversion Repositories Kolibri OS

Rev

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

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