Subversion Repositories Kolibri OS

Rev

Rev 1728 | Rev 3932 | 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:
686 gluk 19
; 30.12.2007 - cleaning keybuffer before reading an key - Gluk
131 diamond 20
; 09.11.2005 - fix for work under MeosDebug & better random - Andrey Halyavin
21
; 23.09.2005 - fixed bug, when 011111111111111-like sequence interpreted
22
;              as _11111111111111 in check_full_line - Sergey Kuzmin aka Wildwest
23
; 18.09.2005 - added 'Pause' button and made appropriate code and interface redesign
24
;              BTW, you can MOVE and ROTATE block during Pause ;)  - Sergey Kuzmin aka Wildwest
25
; 03.11.2003 - added new blocks & random - Ivan Poddubny
26
; 31.10.2001 - rdtsc replaced            - quickcode 
31 halyavin 27
; 28.06.2001 - fasm port & framed blocks - Ville Turjanmaa
131 diamond 28
;
31 halyavin 29
;
30
 
131 diamond 31
LEN_X equ 19  ;width of table
32
LEN_Y equ 29  ; height of table
33
BORDER_LEFT equ 1
34
BORDER_RIGHT equ 1
31 halyavin 35
BORDER_TOP equ 1
36
BORDER_BOTTOM equ 1
37
ADOBE_SIZE equ 12
131 diamond 38
 
39
X_LOCATION equ 30 ; distance to table from left side
40
Y_LOCATION equ 50 ; distance to table from header
41
 
42
UP_KEY equ 130+48
43
DOWN_KEY equ 129+48
44
LEFT_KEY equ 128+48
45
RIGHT_KEY equ 131+48
180 heavyiron 46
;BACKGROUND equ 03000080h
131 diamond 47
 
31 halyavin 48
_MAXBLOCKS_ = 7*4
49
 
50
use32
51
 
131 diamond 52
                org     0x0
31 halyavin 53
 
131 diamond 54
                db      'MENUET01'    ; 8 byte id
55
                dd      0x01          ; header version
56
                dd      START         ; program start
57
                dd      I_END         ; program image size
58
                dd      I_END+1024    ; reguired amount of memory
59
                dd      I_END+1024    ; esp
60
                dd      0x0,0x0       ; I_PARAM, I_ICON
31 halyavin 61
include 'lang.inc'
685 gluk 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
685 gluk 71
    int   0x40
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
685 gluk 91
    int  0x40
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]
685 gluk 129
                int   0x40
1756 dunkaist 130
                mov   [force_down],	1
131 diamond 131
                jmp   still
31 halyavin 132
 
131 diamond 133
block_crash:    dec dword [current_block_y]
134
                movzx edx,byte [current_block_color]
135
                call draw_block
136
                call fix_block
137
                call check_full_line
138
                call draw_table
139
                call new_block
140
                inc dword [score]
141
                call write_score
142
                call check_crash
143
                jz adr400
144
aspetta:        mov eax,10
685 gluk 145
                int 0x40
131 diamond 146
                cmp eax,1
147
                jne adr10000
148
                call draw_window
149
adr10000:       cmp eax,3
150
                jne aspetta
151
new_game:       mov eax,17
685 gluk 152
                int 0x40
131 diamond 153
                cmp ah,1
154
                jnz adr401
155
                jmp end_program
156
adr401:
157
;///////////////////////////////////////////////////// Wildwest
158
                mov dword [pauses], 0
159
;////////////////////////////////////////////////////
160
                mov dword [score],0
161
                call clear_table_tetris
162
                call new_block
163
                call draw_window
31 halyavin 164
 
131 diamond 165
adr400:         movzx edx,byte [current_block_color]
166
                call draw_block
167
                mov eax,5
168
                movzx ebx,byte [delay]
685 gluk 169
                int 0x40
131 diamond 170
                jmp still
31 halyavin 171
 
686 gluk 172
key:            mov  eax,2 ; Gluk
685 gluk 173
                int  0x40
174
				cmp eax,1
175
				jne getkeyi
176
				mov ah,dh
177
				jmp adr32
31 halyavin 178
 
686 gluk 179
getkeyi:		mov dh,ah ; Gluk
685 gluk 180
				jmp key
181
 
131 diamond 182
adr32:          cmp ah,LEFT_KEY
183
                jne adr_30
184
                dec dword [current_block_x]
185
                call check_crash
186
                jz adr4000
187
                inc dword [current_block_x]
188
adr4000:        jmp scendi
31 halyavin 189
 
131 diamond 190
adr_30:         cmp ah,RIGHT_KEY
191
                jne adr_31
192
                inc dword [current_block_x]
193
                call check_crash
194
                jz adr3000
195
                dec dword [current_block_x]
196
adr3000:        jmp scendi
31 halyavin 197
 
131 diamond 198
adr_31:         cmp ah,UP_KEY
199
                jne adr51
200
                mov edx,[current_block_pointer]
201
                mov edx,[edx+16]
202
                mov esi,[current_block_pointer]
203
                mov [current_block_pointer],edx
204
                call check_crash
205
                jz adr50
206
                mov [current_block_pointer],esi
207
adr50:          jmp scendi
31 halyavin 208
 
131 diamond 209
adr51:          cmp ah,DOWN_KEY
210
                jne adr61
1756 dunkaist 211
                cmp [force_down], 1
212
                 jne scendi
131 diamond 213
                mov byte [delay],5  ;!!! 2
214
adr52:          jmp scendi
215
 
216
adr61:          cmp ah,' '
217
                jne adr62
1756 dunkaist 218
                cmp [force_down], 1
219
                 jne scendi
131 diamond 220
                mov byte [delay],5  ;!!! 2
221
adr62:          jmp scendi
222
 
223
 
224
button:                       ; button
225
    mov  eax,17
685 gluk 226
    int  0x40
131 diamond 227
    cmp  ah,1                   ; button id=1 ?
228
    jz  end_program
229
    cmp ah,2
230
    jz go_new_game
231
    cmp  ah,3                   ; button id=3 ? ///Wildwest's  'Pause' button
232
    jz  pause_program
233
    jmp still
234
 
235
end_program:
205 heavyiron 236
    or   eax,-1                ; close this program
685 gluk 237
    int  0x40
131 diamond 238
 
239
go_new_game:
240
    jmp new_game
241
;//////////////////////////////////////////////////// Wildwest
242
pause_program:
243
cmp dword [pauses], 0
244
je incr
245
mov dword [pauses], 0
246
 jmp still
247
incr:
248
mov dword [pauses], 1
249
jmp still
250
;////////////////////////////////////////////////////
251
;   *********************************************
252
;   *******  WINDOW DEFINITIONS AND DRAW ********
253
;   *********************************************
254
draw_window:
255
 
256
 
180 heavyiron 257
    mov  eax,48
258
    mov  ebx,3
259
    mov  ecx,sc
260
    mov  edx,sizeof.system_colors
685 gluk 261
    int  0x40
180 heavyiron 262
 
131 diamond 263
    mov  eax,12                    ; function 12:tell os about windowdraw
264
    mov  ebx,1                     ; 1, start of draw
685 gluk 265
    int  0x40
131 diamond 266
 
267
                                 ; DRAW WINDOW
180 heavyiron 268
  xor  eax,eax                   ; function 0 : define and draw window
131 diamond 269
  mov  ebx,320*65536+(LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2
270
  mov  ecx,25*65536+ (LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION+30
180 heavyiron 271
  mov  edx,[sc.work]             ; color of work area RRGGBB
685 gluk 272
  or   edx,0x13000000
1728 clevermous 273
  mov  edi,title                 ; WINDOW LABEL
685 gluk 274
  int  0x40
131 diamond 275
 
180 heavyiron 276
 
131 diamond 277
    mov eax,8
180 heavyiron 278
    mov ebx,30*65536+100
131 diamond 279
    mov ecx,378*65536+18
280
    mov edx,2
180 heavyiron 281
    mov esi,[sc.work_button]
685 gluk 282
    int 0x40
131 diamond 283
;/////////////////////////////////////////////// Wildwest's  'Pause' button
180 heavyiron 284
    ;mov eax,8
131 diamond 285
    mov ebx,132*65536+102
286
    mov ecx,378*65536+18
287
    mov edx,3
180 heavyiron 288
    mov esi,[sc.work_button];
685 gluk 289
    int 0x40
131 diamond 290
 
291
    mov  eax,4                      ; function 4 : write text to window
180 heavyiron 292
    mov  ebx,164*65536+384          ; [x start] *65536 + [y start]
293
    mov  ecx,[sc.work_button_text]  ; color of text RRGGBB
294
    or   ecx,0x90000000
295
    mov  edx,labe                   ; pointer to text
685 gluk 296
    int  0x40
131 diamond 297
;///////////////////////////////////////////////
180 heavyiron 298
    ;mov eax,4
131 diamond 299
    mov ebx,49*65536+384
300
    mov edx,game_finished
685 gluk 301
    int 0x40
131 diamond 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
180 heavyiron 309
    mov  ecx,[sc.work_text]              ; color
310
    or   ecx,0x90000000
131 diamond 311
    mov  edx,text
312
    mov  eax,4
685 gluk 313
    int  0x40
131 diamond 314
 
315
    call write_score
316
 
317
    mov  eax,12                    ; function 12:tell os about windowdraw
318
    mov  ebx,2                     ; 2, end of draw
685 gluk 319
    int  0x40
131 diamond 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
 
1756 dunkaist 377
				mov   [force_down],	0				; allow fast falling _after_ first game step
378
 
131 diamond 379
                call random
380
                and al,7
381
                setz ah
382
                add al,ah
383
                mov [current_block_color],al
384
 
385
                call random
386
                ;and eax,15
387
            ; ---- Ivan ----
388
                and eax,0xff
389
              @@:
390
                cmp eax,_MAXBLOCKS_
391
                jl  @f
392
                add eax,-(_MAXBLOCKS_)
393
                jmp @b
394
              @@:
395
            ; ---- Ivan ----
396
                mov edx,[block_table+eax*4]
397
                mov [current_block_pointer],edx
398
 
399
                mov byte [delay],22 ;19 ;!!! 15
400
                ret
401
;-------------------------------------------------------------
402
; FIX BLOCK
403
;-------------------------------------------------------------
404
fix_block:      mov ebx,[current_block_pointer]
405
 
406
                mov edx,[current_block_y]
407
                imul edx,LEN_X
408
                add edx,[current_block_x]       ;find the offset in tetris_t
409
 
410
                add edx,table_tetris
411
 
412
                mov ecx,4
413
                mov al,[current_block_color]
414
 
415
adr_21:         cmp byte [ebx],1
416
                jne adr_22
417
                mov [edx],al
418
adr_22:         inc ebx
419
                inc edx
420
 
421
                cmp byte [ebx],1
422
                jne adr_23
423
                mov [edx],al
424
adr_23:         inc ebx
425
                inc edx
426
 
427
                cmp byte [ebx],1
428
                jne adr_24
429
                mov [edx],al
430
adr_24:         inc ebx
431
                inc edx
432
 
433
                cmp byte [ebx],1
434
                jne adr_25
435
                mov [edx],al
436
adr_25:         inc ebx
437
                add edx,LEN_X-3
438
 
439
                loop adr_21
440
                ret
441
 
442
;--------------------------------------------------------------
443
; DRAW_TABLE
444
;--------------------------------------------------------------
445
draw_table:     mov esi,table_tetris+LEN_X*BORDER_TOP+BORDER_LEFT
446
 
447
                mov ebx,X_LOCATION*65536+ADOBE_SIZE
448
                mov ecx,Y_LOCATION*65536+ADOBE_SIZE
449
                mov edi,LEN_Y-BORDER_TOP-BORDER_BOTTOM
450
y_draw:         push edi
451
 
452
                mov edi,LEN_X-BORDER_LEFT-BORDER_RIGHT
453
x_draw:         push edi
454
              ;  pusha
455
              ;  mov eax,5
456
              ;  mov ebx,10
685 gluk 457
              ;  int 0x40
131 diamond 458
              ;  popa
180 heavyiron 459
                mov eax,13
131 diamond 460
                movzx edx,byte [esi]
461
                mov edx,[color_table+edx*4]
685 gluk 462
                int 0x40
131 diamond 463
                call draw_frames
464
                inc esi
465
                add ebx,65536*ADOBE_SIZE
466
                pop edi
467
                dec edi
468
                jnz x_draw
469
 
470
                add esi,BORDER_LEFT+BORDER_RIGHT
471
                mov ebx,X_LOCATION*65536+ADOBE_SIZE
472
                add ecx,65536*ADOBE_SIZE
473
                pop edi
474
                dec edi
475
                jnz y_draw
476
 
477
                ret
478
;--------------------------------------------------------------
479
;DRAW BLOCK
480
;
481
; ebx=x [0..LEN_X-1]
482
; ecx=y [0..LEN_Y-1]
483
; edi=pointer block
484
;--------------------------------------------------------------
485
draw_block:
486
 
487
                mov eax,13
488
                mov edx,[color_table+edx*4]
489
 
490
                mov ebx,[current_block_x]
491
                mov ecx,[current_block_y]
492
                mov edi,[current_block_pointer]
493
 
494
                sub ebx,BORDER_LEFT
495
                imul ebx,ADOBE_SIZE
496
                add ebx,X_LOCATION
497
                shl ebx,16
498
                mov bx,ADOBE_SIZE
499
 
500
                sub ecx,BORDER_TOP
501
                imul ecx,ADOBE_SIZE
502
                add ecx,Y_LOCATION
503
                shl ecx,16
504
                mov cx,ADOBE_SIZE
505
 
506
                mov dword [TMP_1],4
507
adr_122:        mov dword [TMP_0],4
508
adr_121:        cmp byte [edi],0
509
                je adr_120
510
 
685 gluk 511
                int 040h
131 diamond 512
 
513
                call draw_frames
514
 
515
adr_120:        inc edi
516
                add ebx,ADOBE_SIZE*65536
517
                dec dword [TMP_0]
518
                jnz adr_121
519
                sub ebx,4*ADOBE_SIZE*65536
520
                add ecx,ADOBE_SIZE*65536
521
                dec dword [TMP_1]
522
                jnz adr_122
523
 
524
                ret
525
 
526
draw_frames:
527
                 cmp edx,0
528
                 jne df1
529
                 ret
530
             df1:
531
                 pusha
532
                 mov bx,1
533
                 add edx,0x282828
534
                 mov eax,13
685 gluk 535
                 int 0x40
131 diamond 536
                 popa
537
 
538
                 pusha
539
                 mov cx,1
540
                 add edx,0x282828
541
                 mov eax,13
685 gluk 542
                 int 0x40
131 diamond 543
                 popa
544
 
545
                 pusha
546
                 push ebx
547
                 sub  bx,1
548
                 add  [esp+2],bx
549
                 pop  ebx
550
                 mov  bx,1
551
                 shr  edx,1
552
                 and  edx,0x7f7f7f
553
                 mov  eax,13
685 gluk 554
                 int  0x40
131 diamond 555
                 popa
556
 
557
                 pusha
558
                 push ecx
559
                 sub  cx,1
560
                 add  [esp+2],cx
561
                 pop  ecx
562
                 mov  cx,1
563
                 shr  edx,1
564
                 and  edx,0x7f7f7f
565
                 mov  eax,13
685 gluk 566
                 int  0x40
131 diamond 567
                 popa
568
 
569
                 ret
570
 
571
 
572
;--------------------------------------------------------------
573
clear_table_tetris:
574
                cld
575
                mov al,1
576
                mov edi,table_tetris
577
                mov ecx,LEN_X*BORDER_TOP
578
                rep stosb
579
 
580
                mov edx,LEN_Y-BORDER_TOP-BORDER_BOTTOM
581
adr300:         mov cl,BORDER_LEFT
582
                rep stosb
583
                dec ax  ;AL=0
584
                mov cl,LEN_X-BORDER_LEFT-BORDER_RIGHT
585
                rep stosb
586
                inc ax  ;AL=1
587
                mov cl,BORDER_RIGHT
588
                rep stosb
589
                dec dx
590
                jne adr300
591
 
592
                mov ecx,LEN_X*BORDER_BOTTOM
593
                rep stosb
594
                ret
595
;--------------------------------------------------------------
596
;edx = pointer
597
;ebx = contatore
598
check_full_line:
599
                std
600
                mov al,0
601
                mov edx,table_tetris+LEN_X*(LEN_Y-BORDER_BOTTOM)-1
602
                mov ebx,(LEN_Y-BORDER_TOP-BORDER_BOTTOM-1)*LEN_X
603
 
604
adr_5000:       mov edi,edx
605
                mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT+1;Wildwest's fix for bug
606
                                 ;(was LEN_X-BORDER_LEFT-BORDER_RIGHT)
607
                repne scasb
608
                jz no_full_line
609
 
610
                lea esi,[edx-LEN_X]
611
                mov edi,edx
612
                mov ecx,ebx
613
                rep movsb
614
                sub edi,BORDER_RIGHT
615
                mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT
616
                rep stosb
617
                add dword [score],50
618
                jmp adr_5000
619
 
620
no_full_line:   sub edx,LEN_X
621
                sub ebx,LEN_X
622
                jnz adr_5000
623
 
624
                ret
625
;--------------------------------------------------------------
626
random:         mov eax,[generator]
627
                add eax,-43ab45b5h
628
                ror eax,1
629
                xor eax,32c4324fh
630
                ror eax,1
631
                mov [generator],eax
632
                ; --- IVAN ---
633
                push ebx
634
                mov eax,26
635
                mov ebx,9
685 gluk 636
                int 0x40
131 diamond 637
                pop ebx
638
                xor eax,0xdeadbeef
639
                add eax,[generator]
640
                ; --- IVAN ---
641
                mov [generator],eax ; Halyavin
642
                ret
643
;--------------------------------------------------------------
644
number_to_str:  mov edi,end_number_str-1
645
                mov ecx,9;size_of_number_str
646
                mov ebx,10
647
                cld
648
new_digit:      xor edx,edx
649
                div ebx
650
                add dl,'0'
651
                mov [edi],dl
652
                dec edi
653
                loop new_digit
654
                ret
655
;--------------------------------------------------------------
656
write_score:
657
    mov  eax,[score]
658
    call number_to_str
659
 
180 heavyiron 660
    mov  ebx,90*65536+35          ; draw info text with function 4
661
    mov  ecx,[sc.work_text]        ; color
662
    or   ecx,0x50000000
131 diamond 663
    mov  edx,number_str
664
    mov  esi,[size_of_number_str]
180 heavyiron 665
    mov  edi,[sc.work]
131 diamond 666
    mov  eax,4
685 gluk 667
    int  0x40
131 diamond 668
    ret
669
 
31 halyavin 670
; DATA AREA
671
 
131 diamond 672
;--------------------------------------------------------------
673
;DEFINITION BLOCKS
674
;--------------------------------------------------------------
675
t_block_0:  db 0,0,0,0
676
                db 1,1,1,0
677
                db 0,1,0,0
678
                db 0,0,0,0
679
                dd t_block_3
31 halyavin 680
 
131 diamond 681
t_block_1:  db 0,1,0,0
682
                db 1,1,0,0
683
                db 0,1,0,0
684
                db 0,0,0,0
685
                dd t_block_0
31 halyavin 686
 
131 diamond 687
t_block_2:  db 0,1,0,0
688
                db 1,1,1,0
689
                db 0,0,0,0
690
                db 0,0,0,0
691
                dd t_block_1
31 halyavin 692
 
131 diamond 693
t_block_3   db 0,1,0,0
694
                db 0,1,1,0
695
                db 0,1,0,0
696
                db 0,0,0,0
697
                dd t_block_2
698
;--------------------------------------------------------------
699
i_block_0:  db 0,1,0,0
700
                db 0,1,0,0
701
                db 0,1,0,0
702
                db 0,1,0,0
703
                dd i_block_1
31 halyavin 704
 
131 diamond 705
i_block_1:  db 0,0,0,0
706
                db 1,1,1,1
707
                db 0,0,0,0
708
                db 0,0,0,0
709
                dd i_block_0
710
;--------------------------------------------------------------
711
q_block_0: db 0,1,1,0
712
                db 0,1,1,0
713
                db 0,0,0,0
714
                db 0,0,0,0
715
                dd q_block_0
716
;--------------------------------------------------------------
717
s_block_0:
718
      db 0,0,0,0
719
      db 0,1,1,0
720
      db 1,1,0,0
721
      db 0,0,0,0
722
      dd s_block_1
31 halyavin 723
 
131 diamond 724
s_block_1: db 1,0,0,0
725
                db 1,1,0,0
726
                db 0,1,0,0
727
                db 0,0,0,0
728
                dd s_block_0
729
;--------------------------------------------------------------
730
l_block_0:  db 0,0,0,0
731
                db 1,1,1,0
732
                db 1,0,0,0
733
                db 0,0,0,0
734
                dd l_block_3
31 halyavin 735
 
131 diamond 736
l_block_1:  db 1,1,0,0
737
                db 0,1,0,0
738
                db 0,1,0,0
739
                db 0,0,0,0
740
                dd l_block_0
31 halyavin 741
 
131 diamond 742
l_block_2:  db 0,0,1,0
743
                db 1,1,1,0
744
                db 0,0,0,0
745
                db 0,0,0,0
746
                dd l_block_1
747
 
748
l_block_3:  db 0,1,0,0
749
                db 0,1,0,0
750
                db 0,1,1,0
751
                db 0,0,0,0
752
                dd l_block_2
753
;-----------------------------------------------
754
 
755
g_block_0:
756
 
757
db 0,1,0,0
758
db 0,1,0,0
759
db 1,1,0,0
760
db 0,0,0,0
761
dd g_block_1
762
 
763
g_block_1:
764
db 0,0,0,0
765
db 1,1,1,0
766
db 0,0,1,0
767
db 0,0,0,0
768
dd g_block_2
769
 
770
g_block_2:
771
db 0,1,1,0
772
db 0,1,0,0
773
db 0,1,0,0
774
db 0,0,0,0
775
dd g_block_3
776
 
777
g_block_3:
778
db 1,0,0,0
779
db 1,1,1,0
780
db 0,0,0,0
781
db 0,0,0,0
782
dd g_block_0
783
 
784
;-----------------------------------
785
 
786
k_block_0:
787
      db 0,0,0,0
788
      db 1,1,0,0
789
      db 0,1,1,0
790
      db 0,0,0,0
791
      dd k_block_1
792
 
793
k_block_1:
794
      db 0,1,0,0
795
      db 1,1,0,0
796
      db 1,0,0,0
797
      db 0,0,0,0
798
      dd k_block_0
799
 
800
;-----------------------------------
801
 
802
color_table: dd 00000000h    ;black      0
803
                  dd 00cccccch    ;white      1
804
                  dd 00cc0000h    ;red         2
805
                  dd 0000cc00h    ;green     3
806
                  dd 000000cch    ;blue        4
807
                  dd 00cccc00h    ;yellow     5
808
                  dd 0000cccch    ;cyan      6
809
                  dd 00cc00cch    ;pink        7
810
 
811
block_table:
812
    dd t_block_0 ; t
813
    dd t_block_1
814
    dd t_block_2
815
    dd t_block_3
816
    dd i_block_0 ; i
817
    dd i_block_1
818
    dd i_block_0
819
    dd i_block_1
820
    dd q_block_0 ; q
821
    dd q_block_0
822
    dd q_block_0
823
    dd q_block_0
824
    dd s_block_0 ; s
825
    dd s_block_1
826
    dd s_block_0
827
    dd s_block_1
828
    dd l_block_0 ; l
829
    dd l_block_1
830
    dd l_block_2
831
    dd l_block_3
832
    dd g_block_0 ; g
833
    dd g_block_1
834
    dd g_block_2
835
    dd g_block_3
836
    dd k_block_0 ; k
837
    dd k_block_1
838
    dd k_block_0
839
    dd k_block_1
840
 
841
if lang eq ru
842
 
1728 clevermous 843
  title          db ' 1.61 -   ',0
180 heavyiron 844
  labe           db '',0
845
  text           db '窨:',0
846
  game_finished: db '',0
131 diamond 847
 
848
else
849
 
1728 clevermous 850
  title          db 'TETRIS 1.61 - ARROWS & SPACE',0
180 heavyiron 851
  labe           db 'PAUSE',0
852
  text           db 'Score:',0
853
  game_finished: db 'NEW GAME',0
131 diamond 854
 
855
end if
856
 
857
pauses dd 0  ;/// Wildwest
858
parallel dd 1
859
score:                  dd 0
860
TMP_0:                  dd 0
861
TMP_1:                  dd 0
862
generator:              dd 0
863
current_block_x:        dd 0
864
current_block_y:        dd 0
865
current_block_pointer:  dd 0
866
current_block_color:    db 0
867
number_str:             db 0,0,0,0,0,0,0,0,0
31 halyavin 868
end_number_str:
131 diamond 869
size_of_number_str      dd 9
870
delay:                  db 40
1756 dunkaist 871
force_down				dd 1
180 heavyiron 872
sc     system_colors
131 diamond 873
table_tetris:
31 halyavin 874
 
131 diamond 875
I_END:
180 heavyiron 876