Subversion Repositories Kolibri OS

Rev

Rev 4605 | 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'
2679 leency 62
include '../../../macros.inc'
31 halyavin 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
685 gluk 70
    int   0x40
131 diamond 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
685 gluk 90
    int  0x40
31 halyavin 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]
685 gluk 128
                int   0x40
1756 dunkaist 129
                mov   [force_down],	1
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
685 gluk 144
                int 0x40
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
685 gluk 151
                int 0x40
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]
685 gluk 168
                int 0x40
131 diamond 169
                jmp still
31 halyavin 170
 
686 gluk 171
key:            mov  eax,2 ; Gluk
685 gluk 172
                int  0x40
173
				cmp eax,1
174
				jne getkeyi
175
				mov ah,dh
176
				jmp adr32
31 halyavin 177
 
686 gluk 178
getkeyi:		mov dh,ah ; Gluk
685 gluk 179
				jmp key
180
 
4609 dnivra 181
adr32:          cmp [pauses], 1 ; If game is paused, disable all actions
182
                je scendi
183
                cmp ah,LEFT_KEY
131 diamond 184
                jne adr_30
185
                dec dword [current_block_x]
186
                call check_crash
187
                jz adr4000
188
                inc dword [current_block_x]
189
adr4000:        jmp scendi
31 halyavin 190
 
131 diamond 191
adr_30:         cmp ah,RIGHT_KEY
192
                jne adr_31
193
                inc dword [current_block_x]
194
                call check_crash
195
                jz adr3000
196
                dec dword [current_block_x]
197
adr3000:        jmp scendi
31 halyavin 198
 
131 diamond 199
adr_31:         cmp ah,UP_KEY
200
                jne adr51
201
                mov edx,[current_block_pointer]
202
                mov edx,[edx+16]
203
                mov esi,[current_block_pointer]
204
                mov [current_block_pointer],edx
205
                call check_crash
206
                jz adr50
207
                mov [current_block_pointer],esi
208
adr50:          jmp scendi
31 halyavin 209
 
131 diamond 210
adr51:          cmp ah,DOWN_KEY
211
                jne adr61
1756 dunkaist 212
                cmp [force_down], 1
213
                 jne scendi
131 diamond 214
                mov byte [delay],5  ;!!! 2
215
adr52:          jmp scendi
216
 
217
adr61:          cmp ah,' '
218
                jne adr62
1756 dunkaist 219
                cmp [force_down], 1
220
                 jne scendi
131 diamond 221
                mov byte [delay],5  ;!!! 2
222
adr62:          jmp scendi
223
 
224
 
225
button:                       ; button
226
    mov  eax,17
685 gluk 227
    int  0x40
131 diamond 228
    cmp  ah,1                   ; button id=1 ?
229
    jz  end_program
230
    cmp ah,2
231
    jz go_new_game
232
    cmp  ah,3                   ; button id=3 ? ///Wildwest's  'Pause' button
233
    jz  pause_program
234
    jmp still
235
 
236
end_program:
205 heavyiron 237
    or   eax,-1                ; close this program
685 gluk 238
    int  0x40
131 diamond 239
 
240
go_new_game:
241
    jmp new_game
242
;//////////////////////////////////////////////////// Wildwest
243
pause_program:
244
cmp dword [pauses], 0
245
je incr
246
mov dword [pauses], 0
247
 jmp still
248
incr:
249
mov dword [pauses], 1
250
jmp still
251
;////////////////////////////////////////////////////
252
;   *********************************************
253
;   *******  WINDOW DEFINITIONS AND DRAW ********
254
;   *********************************************
255
draw_window:
256
 
257
 
180 heavyiron 258
    mov  eax,48
259
    mov  ebx,3
260
    mov  ecx,sc
261
    mov  edx,sizeof.system_colors
685 gluk 262
    int  0x40
180 heavyiron 263
 
131 diamond 264
    mov  eax,12                    ; function 12:tell os about windowdraw
265
    mov  ebx,1                     ; 1, start of draw
685 gluk 266
    int  0x40
131 diamond 267
 
268
                                 ; DRAW WINDOW
180 heavyiron 269
  xor  eax,eax                   ; function 0 : define and draw window
131 diamond 270
  mov  ebx,320*65536+(LEN_X-BORDER_LEFT-BORDER_RIGHT)*ADOBE_SIZE+X_LOCATION*2
271
  mov  ecx,25*65536+ (LEN_Y-BORDER_TOP-BORDER_BOTTOM)*ADOBE_SIZE+Y_LOCATION+30
180 heavyiron 272
  mov  edx,[sc.work]             ; color of work area RRGGBB
685 gluk 273
  or   edx,0x13000000
1728 clevermous 274
  mov  edi,title                 ; WINDOW LABEL
685 gluk 275
  int  0x40
131 diamond 276
 
180 heavyiron 277
 
131 diamond 278
    mov eax,8
180 heavyiron 279
    mov ebx,30*65536+100
131 diamond 280
    mov ecx,378*65536+18
281
    mov edx,2
180 heavyiron 282
    mov esi,[sc.work_button]
685 gluk 283
    int 0x40
131 diamond 284
;/////////////////////////////////////////////// Wildwest's  'Pause' button
180 heavyiron 285
    ;mov eax,8
131 diamond 286
    mov ebx,132*65536+102
287
    mov ecx,378*65536+18
288
    mov edx,3
180 heavyiron 289
    mov esi,[sc.work_button];
685 gluk 290
    int 0x40
131 diamond 291
 
292
    mov  eax,4                      ; function 4 : write text to window
180 heavyiron 293
    mov  ebx,164*65536+384          ; [x start] *65536 + [y start]
294
    mov  ecx,[sc.work_button_text]  ; color of text RRGGBB
295
    or   ecx,0x90000000
296
    mov  edx,labe                   ; pointer to text
685 gluk 297
    int  0x40
131 diamond 298
;///////////////////////////////////////////////
180 heavyiron 299
    ;mov eax,4
131 diamond 300
    mov ebx,49*65536+384
301
    mov edx,game_finished
685 gluk 302
    int 0x40
131 diamond 303
    call draw_table
304
 
305
    movzx edx,byte [current_block_color]
306
    call draw_block
307
 
308
    cld
309
    mov  ebx,38*65536+35           ; draw info text with function 4
180 heavyiron 310
    mov  ecx,[sc.work_text]              ; color
311
    or   ecx,0x90000000
131 diamond 312
    mov  edx,text
313
    mov  eax,4
685 gluk 314
    int  0x40
131 diamond 315
 
316
    call write_score
317
 
318
    mov  eax,12                    ; function 12:tell os about windowdraw
319
    mov  ebx,2                     ; 2, end of draw
685 gluk 320
    int  0x40
131 diamond 321
 
322
    ret
323
 
324
;-------------------------------------------------------------
325
; CHECK CRASH
326
; output        Z  flag => OK
327
;               NZ flag => NO
328
;-------------------------------------------------------------
329
 
330
check_crash:    mov ebx,[current_block_pointer]
331
 
332
                mov edx,[current_block_y]
333
                imul edx,LEN_X
334
                add edx,[current_block_x]          ;find the offset in tetris_t
335
 
336
                add edx,table_tetris
337
 
338
                mov ecx,4
339
                xor ax,ax
340
 
341
adr_1:          cmp byte [ebx],1
342
                jne adr_2
343
                add al,[edx]
344
                adc ah,0
345
adr_2:          inc ebx
346
                inc edx
347
 
348
                cmp byte [ebx],1
349
                jne adr_3
350
                add al,[edx]
351
                adc ah,0
352
adr_3:          inc ebx
353
                inc edx
354
 
355
                cmp byte [ebx],1
356
                jne adr_4
357
                add al,[edx]
358
                adc ah,0
359
adr_4:          inc ebx
360
                inc edx
361
 
362
                cmp byte [ebx],1
363
                jne adr_5
364
                add al,[edx]
365
                adc ah,0
366
adr_5:          inc ebx
367
                add edx,LEN_X-3
368
 
369
                loop adr_1
370
                or ax,ax
371
                ret
372
;-------------------------------------------------------------
373
;NEW BLOCK
374
;-------------------------------------------------------------
375
new_block:      mov dword [current_block_y],1
376
                mov dword [current_block_x],7
377
 
1756 dunkaist 378
				mov   [force_down],	0				; allow fast falling _after_ first game step
379
 
131 diamond 380
                call random
381
                and al,7
382
                setz ah
383
                add al,ah
384
                mov [current_block_color],al
385
 
386
                call random
387
                ;and eax,15
388
            ; ---- Ivan ----
389
                and eax,0xff
390
              @@:
391
                cmp eax,_MAXBLOCKS_
392
                jl  @f
393
                add eax,-(_MAXBLOCKS_)
394
                jmp @b
395
              @@:
396
            ; ---- Ivan ----
397
                mov edx,[block_table+eax*4]
398
                mov [current_block_pointer],edx
399
 
400
                mov byte [delay],22 ;19 ;!!! 15
401
                ret
402
;-------------------------------------------------------------
403
; FIX BLOCK
404
;-------------------------------------------------------------
405
fix_block:      mov ebx,[current_block_pointer]
406
 
407
                mov edx,[current_block_y]
408
                imul edx,LEN_X
409
                add edx,[current_block_x]       ;find the offset in tetris_t
410
 
411
                add edx,table_tetris
412
 
413
                mov ecx,4
414
                mov al,[current_block_color]
415
 
416
adr_21:         cmp byte [ebx],1
417
                jne adr_22
418
                mov [edx],al
419
adr_22:         inc ebx
420
                inc edx
421
 
422
                cmp byte [ebx],1
423
                jne adr_23
424
                mov [edx],al
425
adr_23:         inc ebx
426
                inc edx
427
 
428
                cmp byte [ebx],1
429
                jne adr_24
430
                mov [edx],al
431
adr_24:         inc ebx
432
                inc edx
433
 
434
                cmp byte [ebx],1
435
                jne adr_25
436
                mov [edx],al
437
adr_25:         inc ebx
438
                add edx,LEN_X-3
439
 
440
                loop adr_21
441
                ret
442
 
443
;--------------------------------------------------------------
444
; DRAW_TABLE
445
;--------------------------------------------------------------
446
draw_table:     mov esi,table_tetris+LEN_X*BORDER_TOP+BORDER_LEFT
447
 
448
                mov ebx,X_LOCATION*65536+ADOBE_SIZE
449
                mov ecx,Y_LOCATION*65536+ADOBE_SIZE
450
                mov edi,LEN_Y-BORDER_TOP-BORDER_BOTTOM
451
y_draw:         push edi
452
 
453
                mov edi,LEN_X-BORDER_LEFT-BORDER_RIGHT
454
x_draw:         push edi
455
              ;  pusha
456
              ;  mov eax,5
457
              ;  mov ebx,10
685 gluk 458
              ;  int 0x40
131 diamond 459
              ;  popa
180 heavyiron 460
                mov eax,13
131 diamond 461
                movzx edx,byte [esi]
462
                mov edx,[color_table+edx*4]
685 gluk 463
                int 0x40
131 diamond 464
                call draw_frames
465
                inc esi
466
                add ebx,65536*ADOBE_SIZE
467
                pop edi
468
                dec edi
469
                jnz x_draw
470
 
471
                add esi,BORDER_LEFT+BORDER_RIGHT
472
                mov ebx,X_LOCATION*65536+ADOBE_SIZE
473
                add ecx,65536*ADOBE_SIZE
474
                pop edi
475
                dec edi
476
                jnz y_draw
477
 
478
                ret
479
;--------------------------------------------------------------
480
;DRAW BLOCK
481
;
482
; ebx=x [0..LEN_X-1]
483
; ecx=y [0..LEN_Y-1]
484
; edi=pointer block
485
;--------------------------------------------------------------
486
draw_block:
487
 
488
                mov eax,13
489
                mov edx,[color_table+edx*4]
490
 
491
                mov ebx,[current_block_x]
492
                mov ecx,[current_block_y]
493
                mov edi,[current_block_pointer]
494
 
495
                sub ebx,BORDER_LEFT
496
                imul ebx,ADOBE_SIZE
497
                add ebx,X_LOCATION
498
                shl ebx,16
499
                mov bx,ADOBE_SIZE
500
 
501
                sub ecx,BORDER_TOP
502
                imul ecx,ADOBE_SIZE
503
                add ecx,Y_LOCATION
504
                shl ecx,16
505
                mov cx,ADOBE_SIZE
506
 
507
                mov dword [TMP_1],4
508
adr_122:        mov dword [TMP_0],4
509
adr_121:        cmp byte [edi],0
510
                je adr_120
511
 
685 gluk 512
                int 040h
131 diamond 513
 
514
                call draw_frames
515
 
516
adr_120:        inc edi
517
                add ebx,ADOBE_SIZE*65536
518
                dec dword [TMP_0]
519
                jnz adr_121
520
                sub ebx,4*ADOBE_SIZE*65536
521
                add ecx,ADOBE_SIZE*65536
522
                dec dword [TMP_1]
523
                jnz adr_122
524
 
525
                ret
526
 
527
draw_frames:
528
                 cmp edx,0
529
                 jne df1
530
                 ret
531
             df1:
532
                 pusha
533
                 mov bx,1
534
                 add edx,0x282828
535
                 mov eax,13
685 gluk 536
                 int 0x40
131 diamond 537
                 popa
538
 
539
                 pusha
540
                 mov cx,1
541
                 add edx,0x282828
542
                 mov eax,13
685 gluk 543
                 int 0x40
131 diamond 544
                 popa
545
 
546
                 pusha
547
                 push ebx
548
                 sub  bx,1
549
                 add  [esp+2],bx
550
                 pop  ebx
551
                 mov  bx,1
552
                 shr  edx,1
553
                 and  edx,0x7f7f7f
554
                 mov  eax,13
685 gluk 555
                 int  0x40
131 diamond 556
                 popa
557
 
558
                 pusha
559
                 push ecx
560
                 sub  cx,1
561
                 add  [esp+2],cx
562
                 pop  ecx
563
                 mov  cx,1
564
                 shr  edx,1
565
                 and  edx,0x7f7f7f
566
                 mov  eax,13
685 gluk 567
                 int  0x40
131 diamond 568
                 popa
569
 
570
                 ret
571
 
572
 
573
;--------------------------------------------------------------
574
clear_table_tetris:
575
                cld
576
                mov al,1
577
                mov edi,table_tetris
578
                mov ecx,LEN_X*BORDER_TOP
579
                rep stosb
580
 
581
                mov edx,LEN_Y-BORDER_TOP-BORDER_BOTTOM
582
adr300:         mov cl,BORDER_LEFT
583
                rep stosb
584
                dec ax  ;AL=0
585
                mov cl,LEN_X-BORDER_LEFT-BORDER_RIGHT
586
                rep stosb
587
                inc ax  ;AL=1
588
                mov cl,BORDER_RIGHT
589
                rep stosb
590
                dec dx
591
                jne adr300
592
 
593
                mov ecx,LEN_X*BORDER_BOTTOM
594
                rep stosb
595
                ret
596
;--------------------------------------------------------------
597
;edx = pointer
598
;ebx = contatore
599
check_full_line:
600
                std
601
                mov al,0
602
                mov edx,table_tetris+LEN_X*(LEN_Y-BORDER_BOTTOM)-1
603
                mov ebx,(LEN_Y-BORDER_TOP-BORDER_BOTTOM-1)*LEN_X
604
 
605
adr_5000:       mov edi,edx
606
                mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT+1;Wildwest's fix for bug
607
                                 ;(was LEN_X-BORDER_LEFT-BORDER_RIGHT)
608
                repne scasb
609
                jz no_full_line
610
 
611
                lea esi,[edx-LEN_X]
612
                mov edi,edx
613
                mov ecx,ebx
614
                rep movsb
615
                sub edi,BORDER_RIGHT
616
                mov ecx,LEN_X-BORDER_LEFT-BORDER_RIGHT
617
                rep stosb
618
                add dword [score],50
619
                jmp adr_5000
620
 
621
no_full_line:   sub edx,LEN_X
622
                sub ebx,LEN_X
623
                jnz adr_5000
624
 
625
                ret
626
;--------------------------------------------------------------
627
random:         mov eax,[generator]
628
                add eax,-43ab45b5h
629
                ror eax,1
630
                xor eax,32c4324fh
631
                ror eax,1
632
                mov [generator],eax
633
                ; --- IVAN ---
634
                push ebx
635
                mov eax,26
636
                mov ebx,9
685 gluk 637
                int 0x40
131 diamond 638
                pop ebx
639
                xor eax,0xdeadbeef
640
                add eax,[generator]
641
                ; --- IVAN ---
642
                mov [generator],eax ; Halyavin
643
                ret
644
;--------------------------------------------------------------
645
number_to_str:  mov edi,end_number_str-1
646
                mov ecx,9;size_of_number_str
647
                mov ebx,10
648
                cld
649
new_digit:      xor edx,edx
650
                div ebx
651
                add dl,'0'
652
                mov [edi],dl
653
                dec edi
654
                loop new_digit
655
                ret
656
;--------------------------------------------------------------
657
write_score:
658
    mov  eax,[score]
659
    call number_to_str
660
 
180 heavyiron 661
    mov  ebx,90*65536+35          ; draw info text with function 4
662
    mov  ecx,[sc.work_text]        ; color
663
    or   ecx,0x50000000
131 diamond 664
    mov  edx,number_str
665
    mov  esi,[size_of_number_str]
180 heavyiron 666
    mov  edi,[sc.work]
131 diamond 667
    mov  eax,4
685 gluk 668
    int  0x40
131 diamond 669
    ret
670
 
31 halyavin 671
; DATA AREA
672
 
131 diamond 673
;--------------------------------------------------------------
674
;DEFINITION BLOCKS
675
;--------------------------------------------------------------
676
t_block_0:  db 0,0,0,0
677
                db 1,1,1,0
678
                db 0,1,0,0
679
                db 0,0,0,0
680
                dd t_block_3
31 halyavin 681
 
131 diamond 682
t_block_1:  db 0,1,0,0
683
                db 1,1,0,0
684
                db 0,1,0,0
685
                db 0,0,0,0
686
                dd t_block_0
31 halyavin 687
 
131 diamond 688
t_block_2:  db 0,1,0,0
689
                db 1,1,1,0
690
                db 0,0,0,0
691
                db 0,0,0,0
692
                dd t_block_1
31 halyavin 693
 
131 diamond 694
t_block_3   db 0,1,0,0
695
                db 0,1,1,0
696
                db 0,1,0,0
697
                db 0,0,0,0
698
                dd t_block_2
699
;--------------------------------------------------------------
700
i_block_0:  db 0,1,0,0
701
                db 0,1,0,0
702
                db 0,1,0,0
703
                db 0,1,0,0
704
                dd i_block_1
31 halyavin 705
 
131 diamond 706
i_block_1:  db 0,0,0,0
707
                db 1,1,1,1
708
                db 0,0,0,0
709
                db 0,0,0,0
710
                dd i_block_0
711
;--------------------------------------------------------------
712
q_block_0: db 0,1,1,0
713
                db 0,1,1,0
714
                db 0,0,0,0
715
                db 0,0,0,0
716
                dd q_block_0
717
;--------------------------------------------------------------
718
s_block_0:
719
      db 0,0,0,0
720
      db 0,1,1,0
721
      db 1,1,0,0
722
      db 0,0,0,0
723
      dd s_block_1
31 halyavin 724
 
131 diamond 725
s_block_1: db 1,0,0,0
726
                db 1,1,0,0
727
                db 0,1,0,0
728
                db 0,0,0,0
729
                dd s_block_0
730
;--------------------------------------------------------------
731
l_block_0:  db 0,0,0,0
732
                db 1,1,1,0
733
                db 1,0,0,0
734
                db 0,0,0,0
735
                dd l_block_3
31 halyavin 736
 
131 diamond 737
l_block_1:  db 1,1,0,0
738
                db 0,1,0,0
739
                db 0,1,0,0
740
                db 0,0,0,0
741
                dd l_block_0
31 halyavin 742
 
131 diamond 743
l_block_2:  db 0,0,1,0
744
                db 1,1,1,0
745
                db 0,0,0,0
746
                db 0,0,0,0
747
                dd l_block_1
748
 
749
l_block_3:  db 0,1,0,0
750
                db 0,1,0,0
751
                db 0,1,1,0
752
                db 0,0,0,0
753
                dd l_block_2
754
;-----------------------------------------------
755
 
756
g_block_0:
757
 
758
db 0,1,0,0
759
db 0,1,0,0
760
db 1,1,0,0
761
db 0,0,0,0
762
dd g_block_1
763
 
764
g_block_1:
765
db 0,0,0,0
766
db 1,1,1,0
767
db 0,0,1,0
768
db 0,0,0,0
769
dd g_block_2
770
 
771
g_block_2:
772
db 0,1,1,0
773
db 0,1,0,0
774
db 0,1,0,0
775
db 0,0,0,0
776
dd g_block_3
777
 
778
g_block_3:
779
db 1,0,0,0
780
db 1,1,1,0
781
db 0,0,0,0
782
db 0,0,0,0
783
dd g_block_0
784
 
785
;-----------------------------------
786
 
787
k_block_0:
788
      db 0,0,0,0
789
      db 1,1,0,0
790
      db 0,1,1,0
791
      db 0,0,0,0
792
      dd k_block_1
793
 
794
k_block_1:
795
      db 0,1,0,0
796
      db 1,1,0,0
797
      db 1,0,0,0
798
      db 0,0,0,0
799
      dd k_block_0
800
 
801
;-----------------------------------
802
 
803
color_table: dd 00000000h    ;black      0
804
                  dd 00cccccch    ;white      1
805
                  dd 00cc0000h    ;red         2
806
                  dd 0000cc00h    ;green     3
807
                  dd 000000cch    ;blue        4
808
                  dd 00cccc00h    ;yellow     5
809
                  dd 0000cccch    ;cyan      6
810
                  dd 00cc00cch    ;pink        7
811
 
812
block_table:
813
    dd t_block_0 ; t
814
    dd t_block_1
815
    dd t_block_2
816
    dd t_block_3
817
    dd i_block_0 ; i
818
    dd i_block_1
819
    dd i_block_0
820
    dd i_block_1
821
    dd q_block_0 ; q
822
    dd q_block_0
823
    dd q_block_0
824
    dd q_block_0
825
    dd s_block_0 ; s
826
    dd s_block_1
827
    dd s_block_0
828
    dd s_block_1
829
    dd l_block_0 ; l
830
    dd l_block_1
831
    dd l_block_2
832
    dd l_block_3
833
    dd g_block_0 ; g
834
    dd g_block_1
835
    dd g_block_2
836
    dd g_block_3
837
    dd k_block_0 ; k
838
    dd k_block_1
839
    dd k_block_0
840
    dd k_block_1
841
 
842
if lang eq ru
843
 
1728 clevermous 844
  title          db '’…’ˆ‘ 1.61 - ‘’…‹Šˆ ˆ Ž…‹',0
180 heavyiron 845
  labe           db '€“‡€',0
846
  text           db 'Žçª¨:',0
2679 leency 847
  game_finished: db '  Ž‚€Ÿ',0
131 diamond 848
 
3932 kaitz 849
else if lang eq et
850
 
851
  title          db 'TETRIS 1.61 - NOOLED & TÜHIK',0
852
  labe           db 'PAUS',0
853
  text           db 'Tulemus:',0
854
  game_finished: db 'UUS MÄNG',0
855
 
131 diamond 856
else
857
 
1728 clevermous 858
  title          db 'TETRIS 1.61 - ARROWS & SPACE',0
180 heavyiron 859
  labe           db 'PAUSE',0
860
  text           db 'Score:',0
861
  game_finished: db 'NEW GAME',0
131 diamond 862
 
863
end if
864
 
865
pauses dd 0  ;/// Wildwest
866
parallel dd 1
867
score:                  dd 0
868
TMP_0:                  dd 0
869
TMP_1:                  dd 0
870
generator:              dd 0
871
current_block_x:        dd 0
872
current_block_y:        dd 0
873
current_block_pointer:  dd 0
874
current_block_color:    db 0
875
number_str:             db 0,0,0,0,0,0,0,0,0
31 halyavin 876
end_number_str:
131 diamond 877
size_of_number_str      dd 9
878
delay:                  db 40
1756 dunkaist 879
force_down				dd 1
180 heavyiron 880
sc     system_colors
131 diamond 881
table_tetris:
31 halyavin 882
 
131 diamond 883
I_END:
180 heavyiron 884