.386 code segment use16 assume cs:code,ds:code org 100h ;--- INIT --- start: mov ax,1 int 10h mov al,0E7h mov dx,3C2h out dx,al mov dx,3D4h mov ax,200Ah out dx,ax call keyinst progstart: mov ax,0B800h mov es,ax mov ax,ds mov gs,ax call showmenu mov di,13*80+42 call showgametype mov al,0 mov active,al tloop: mov dl,15 call showact call sync mov dl,7 call showact call getkey cmp ax,6 jz testaccept cmp ax,2 jnz nomdown mov al,active cmp al,2 jz tloop inc al mov active,al jmp tloop nomdown: cmp ax,1 jnz tloop mov al,active or al,al jz tloop dec al mov active,al jmp tloop ;--- Show SELECT BAR --- showact: mov al,active shl al,1 add al,11 mov bl,80 mul bl mov cl,40 inc ax mov di,ax mov al,dl saloop: stosb inc di dec cl or cl,cl jnz saloop ret ;--- TEST SELECTED --- testaccept: mov al,active or al,al jz startgame cmp al,2 jz tetrisend mov al,gametype not al mov gametype,al mov di,13*80+42 mov ah,7 call showgametype jmp tloop ;--- Create desktop --- startgame: mov ax,0B800h mov es,ax mov al,gametype or al,al jz settetris ;--- SET MAXTRIS --- mov al,21 mov hsize,al mov al,22 mov byte ptr desktop+6,al mov al,2 mov byte ptr desktop+12,al mov byte ptr desktop+22,al mov al,24 mov byte ptr desktop+19,al mov ax,22 mov subval,ax mov ax,offset vpfield+22 mov compval,ax jmp gstart ;--- SET TETRIS --- settetris: mov al,9 mov hsize,al mov al,10 mov byte ptr desktop+6,al mov al,14 mov byte ptr desktop+12,al mov byte ptr desktop+22,al mov al,12 mov byte ptr desktop+19,al mov ax,10 mov subval,ax mov ax,offset vpfield+10 mov compval,ax gstart: xor eax,eax mov bricksn,eax mov lines,eax mov dx,24 xor cx,cx xor di,di desk1: mov si,offset desktop desk12: lodsb or al,al jz desk2 mov cl,al lodsw rep stosw jmp desk12 desk2: dec dx or dx,dx jnz desk1 desk22: lodsb or al,al jz deskend mov cl,al lodsw rep stosw jmp desk22 deskend: xor ebx,ebx call conv2hex mov si,offset brx mov di,offset 164 call show2 call sshow mov si,offset lin mov di,offset 404 call show2 mov si,offset numhex mov di,484 call show2 mov ax,ds mov es,ax mov di,offset vpfield mov al,24 mov bl,byte ptr subval mul bl mov cx,ax xor al,al rep stosb xor ch,ch mov cl,byte ptr subval mov al,128 rep stosb mov ax,0B800h mov es,ax mov al,45 mov level,al mov downcount,al call setnbrick testloop: call showbrick call sync mov al,downcount dec al mov downcount,al or al,al jnz nodown mov al,fallspeed mov downcount,al inc ch call testbrick or bh,bh jz nodown dec ch call put2vpf call fallbricks call setnbrick call testbrick or bh,bh jnz gameover mov eax,bricksn inc eax mov bricksn,eax mov ebx,eax call conv2hex call sshow mov ebx,lines call conv2hex mov si,offset numhex mov di,484 mov bx,word ptr lines shr bx,4 mov al,45 sub al,bl mov level,al call show2 jmp testloop nodown: call hidebrick stay: call getkey cmp ax,5 jz gameover cmp ax,4 jnz skipleft call moveleft jmp testloop skipleft: cmp ax,3 jnz skipright call moveright jmp testloop skipright: cmp ax,2 jnz skipfall mov al,2 mov fallspeed,al mov al,1 mov downcount,al jmp testloop skipfall: cmp ax,1 jnz testloop call rotatebrick jmp testloop gameover: mov al,hsize inc al sub al,10 shr al,1 xor ah,ah mov di,12*40+15 add di,ax shl di,1 mov si,offset gover mov ah,15 call outtext keywait: call getkey or al,al jz keywait mov cx,2000 xor di,di mov ax,0720h rep stosw jmp progstart tetrisend: call keydeinst mov ax,3 int 10h ret ;--- MOVE RIGHT --- moveright: mov ax,brick mov bx,rotatet mov si,offset bricks shl ax,1 add si,ax lodsw mov si,ax lodsw mul bx add si,ax lodsb add al,cl cmp al,hsize jna movingr ret movingr: inc cl call testbrick or bh,bh jnz nomover ret nomover: dec cl ret ;--- MOVE LEFT --- moveleft: or cl,cl jnz movingl ret movingl: dec cl call testbrick or bh,bh jnz nomovel ret nomovel: inc cl ret ;--- ROTATE BRICK --- rotatebrick: mov si,offset rotations mov ax,brick mov bx,rotatet push cx shl ax,1 add si,ax lodsw mov si,ax shl bx,1 add si,bx lodsw add cl,al add ch,ah cmp cl,hsize ja rerror2 cmp ch,23 ja rerror2 shr bx,1 inc bx and bx,3 mov ax,brick push cx mov si,offset bricks shl ax,1 add si,ax lodsw mov si,ax lodsw mul bx add si,ax lodsw sub ax,101h add cl,al add ch,ah cmp cl,hsize ja rerror cmp ch,23 ja rerror mov rotatet,bx pop cx pop ax ret rerror: pop cx rerror2: pop cx ret ;--- Fall bricx --- fallbricks: push es mov ax,ds mov es,ax mov si,offset vpfield mov ch,24 ftloopm: push si mov cl,byte ptr subval ftloop1: lodsb or al,al jz nofull dec cl or cl,cl jnz ftloop1 pop si jmp mark nofull: pop si jmp nomark mark: mov cl,byte ptr subval mov eax,lines inc eax mov lines,eax mov al,-1 push si ftloop2: mov ds:si,al inc si dec cl or cl,cl jnz ftloop2 pop si nomark: add si,subval dec ch or ch,ch jnz ftloopm mov ax,ds mov es,ax mov si,offset vpfield mov al,24 mov bl,byte ptr subval mul bl add si,ax mov ch,byte ptr subval fvfloop0: xor bx,bx push si fvfloop1: mov al,ds:si cmp al,-1 jnz nofall1 push si push di mov di,si sub di,subval fvfloop2: mov al,es:di mov ds:si,al mov bl,-1 sub di,subval sub si,subval cmp di,compval jnb fvfloop2 xor al,al mov es:di,al pop si pop di nofall1: sub si,subval cmp si,compval jnb fvfloop1 pop si or bx,bx jnz fvfloop0 inc si dec ch or ch,ch jnz fvfloop0 pop es mov di,30 mov si,offset vpfield mov ch,24 sloop0: mov cl,byte ptr subval push di sloop1: lodsb or al,al jz empty add al,8 mov ah,al mov al,219 jmp showit empty: mov ax,32 showit: stosw dec cl or cl,cl jnz sloop1 pop di add di,80 dec ch or ch,ch jnz sloop0 ret ;--- SHOW BRICK --- showbrick: mov ax,brick mov bx,rotatet push cx add cl,15 mov bp,offset brspace mov si,offset bricks push ax shl ax,1 add si,ax lodsw mov si,ax lodsw mul bx add si,ax mov ax,cx mov gs:bp,ax add bp,2 mov al,80 mul ch xor ch,ch shl cx,1 add ax,cx mov di,ax lodsw mov cx,ax mov gs:bp,ax add bp,2 mov bl,cl pop ax mov ah,9 add ah,al vloop: mov cl,bl mov dx,di hloop: lodsb mov gs:bp,ax or al,al jz notrue mov al,es:di inc al mov gs:bp,ax mov al,219 stosw jmp nextt notrue: inc di inc di nextt: inc bp inc bp dec cl or cl,cl jnz hloop mov di,dx add di,80 dec ch or ch,ch jnz vloop pop cx ret ;--- HIDE BRICK --- hidebrick: mov ax,brick mov bx,rotatet push cx mov si,offset brspace lodsw mov cx,ax mov al,80 mul ch xor ch,ch shl cx,1 add ax,cx mov di,ax lodsw mov cx,ax mov bl,cl vhloop: mov cl,bl mov dx,di hhloop: lodsw or al,al jz nohtrue dec al stosw jmp nextht nohtrue: inc di inc di nextht: dec cl or cl,cl jnz hhloop mov di,dx add di,80 dec ch or ch,ch jnz vhloop pop cx ret ;--- TEST BRICK --- testbrick: push es mov ax,ds mov es,ax mov ax,brick mov bx,rotatet push cx mov si,offset bricks shl ax,1 add si,ax lodsw mov si,ax lodsw mul bx add si,ax mov bh,ch mov al,byte ptr subval mul ch xor ch,ch add ax,cx mov di,ax add di,offset vpfield lodsw mov cx,ax dec ah add ah,bh mov bh,-1 cmp ah,23 ja notest mov bl,cl xor bh,bh vtloop: mov cl,bl mov dx,di htloop: lodsb or al,al jz nottrue mov al,es:di or al,al jz nottrue mov bh,-1 nottrue: inc di dec cl or cl,cl jnz htloop mov di,dx add di,subval dec ch or ch,ch jnz vtloop notest: pop cx pop es ret ;--- Put to virtual playfield --- put2vpf: push es mov ax,ds mov es,ax mov ax,brick mov bx,rotatet push cx mov si,offset bricks shl ax,1 add si,ax lodsw mov si,ax lodsw mul bx add si,ax mov al,byte ptr subval mul ch xor ch,ch add ax,cx mov di,ax add di,offset vpfield lodsw mov cx,ax mov bl,cl xor bh,bh vploop: mov cl,bl mov dx,di mov ax,brick mov ah,al hploop: lodsb or al,al jz skipset mov al,ah inc al mov es:di,al skipset: inc di dec cl or cl,cl jnz hploop mov di,dx add di,subval dec ch or ch,ch jnz vploop pop cx pop es ret ;--- Set new brick --- Setnbrick: push es xor ax,ax xor bx,bx mov es,ax mov ax,es:46Ch and ax,7 cmp ax,7 jnz setpos xor ax,ax mov bx,1 setpos: mov brick,ax mov rotatet,bx mov ch,0 mov si,offset bricks shl ax,1 add si,ax lodsw mov si,ax lodsw mul bx add si,ax lodsb mov cl,hsize inc cl sub cl,al shr cl,1 mov al,level mov fallspeed,al pop es ret ;--- Install keyboard --- keyinst: mov ax,3509h int 21h mov oldint,bx mov oldint+2,es mov ax,2509h mov dx,offset keyboard int 21h ret ;--- Deinstall keyboard --- keydeinst: mov dx,oldint mov ax,oldint+2 push ds mov ds,ax mov ax,2509h int 21h pop ds ret ;--- Keyboard handler --- keyboard: cli push ax push ds mov ax,cs mov ds,ax in al,60h cmp al,1 jnz kend1 mov keyesc,al kend1: cmp al,72 jnz kend2 mov keyrotate,al kend2: cmp al,75 jnz kend3 mov keyleft,al kend3: cmp al,77 jnz kend4 mov keyright,al kend4: cmp al,80 jnz kend5 mov keyfall,al kend5: cmp al,28 jnz kend6 mov keyaccept,al kend6: mov al,20h out 20h,al pop ds pop ax iret ;--- Get Key --- getkey: push bx push cx xor bx,bx mov si,offset keyaccept mov cx,6 keytestloop: mov al,ds:si or al,al jz nopressed mov bx,cx xor al,al mov ds:si,al nopressed: inc si dec cx or cx,cx jnz keytestloop mov ax,bx pop cx pop bx ret ;--- Video Synchronization --- sync: mov dx,3DAh sync1: in al,dx test al,8 jz sync1 sync2: in al,dx test al,8 jnz sync2 ret ;--- Conv dword 2 hex --- conv2hex: push cx mov cx,8 mov si,offset numhex+1 c2hl1: rol ebx,4 mov al,bl and al,15 cmp al,9 jna noadd add al,7 noadd: add al,'0' mov ds:si,al inc si dec cx or cx,cx jnz c2hl1 pop cx ret ;--- Show score --- SShow: mov si,offset numhex mov di,244 show2: mov ah,15 sshow2: lodsb or al,al jz endofshow stosw jmp sshow2 endofshow: ret ;--- Show Menu --- showmenu: mov di,4 mov si,offset picture showm2: lodsb or al,al jz showmend mov cl,al lodsw rep stosw jmp showm2 showmend: mov ah,15 mov di,5*80+10 mov si,offset about1 call outtext mov si,offset menu1 mov di,11*80+34 mov ah,7 call outtext mov di,13*80+24 call outtext mov di,15*80+34 call outtext ret ;--- OUT TEXT --- outtext: lodsb or al,al jz outtextend stosw jmp outtext outtextend: ret ;--- Show gametype --- showgametype: mov si,offset tetr mov al,gametype or al,al jz sgt2 mov si,offset maxt sgt2: call outtext mov si,offset tris call outtext ret ;--- Variabiles --- oldint dw 0,0 downcount db 0 brick dw 0 rotatet dw 0 level db 0 fallspeed db 0 bricksn dd 0 lines dd -1 gametype db 0 active db 0 hsize db 9 subval dw 10 compval dw offset vpfield+10 spos dw 0 scnt db 0 keyaccept db 0 keyesc db 0 keyleft db 0 keyright db 0 keyfall db 0 keyrotate db 0 lin db ' Linek ',0 brx db ' Kostek ',0 numhex db ' 00000000 ',0 gover db 'KONEC HRY!',0 picture db 1,213,12,2,205,12,1,209,12,2,205,12,1,184,12 db 1,213,14,5,205,14,1,184,14 db 1,213,13,2,205,13,1,209,13,2,205,13,1,184,13 db 1,209,10,5,205,10,1,184,10 db 1,209,11 db 1,213,9,5,205,9,1,184,9,4,32,9 db 3,32,12,1,179,12,3,32,12 db 1,179,14,5,32,14,1,179,14 db 3,32,13,1,179,13,3,32,13 db 1,179,10,6,32,10 db 1,179,11 db 1,179,9,10,32,9 db 3,32,12,1,179,12,3,32,12 db 1,198,14,5,205,14,1,190,14 db 3,32,13,1,179,13,3,32,13 db 1,179,10,6,32,10 db 1,179,11 db 1,212,9,5,205,9,1,184,9,4,32,9 db 3,32,12,1,179,12,3,32,12 db 1,179,14,6,32,14 db 3,32,13,1,179,13,3,32,13 db 1,179,10,6,32,10 db 1,179,11 db 6,32,9,1,179,9,4,32,9 db 3,32,12,1,207,12,3,32,12 db 1,212,14,5,205,14,1,190,14 db 3,32,13,1,207,13,3,32,13 db 1,207,10,6,32,10 db 1,207,11 db 1,212,9,5,205,9,1,190,9 db 0 about1 db '(C) I997 Jakub Svozil / IïG’Mî',0 menu1 db 'START',0 db 'TYP HRY:',0 db 'KONEC',0 tetr db 'TE',0 maxt db 'MAX',0 tris db 'TRIS ',0 ;--- Tables --- desktop: db 14,32,20h,1,254,070h,10,32,15,1,254,070h,14,32,20h,0 db 14,32,20h,12,254,070h,14,32,20h,0 bricks dw offset type1,offset type2,offset type3,offset type4 dw offset type5,offset type6,offset type7 rotations dw offset rot1,offset rot2,offset rot3,offset rot4 dw offset rot5,offset rot6,offset rot7 ;--- Screen space --- brspace dw 11 dup (-2) ;--- Brick datas --- type1 dw 6 db 1,4,4 dup (1) ;1-1 db 4,1,4 dup (1) ;1-2 db 1,4,4 dup (1) ;1-3 db 4,1,4 dup (1) ;1-4 type2 dw 8 db 3,2,1,1,1,0,1,0 ;2-1 db 2,3,1,0,1,1,1,0 ;2-2 db 3,2,0,1,0,1,1,1 ;2-3 db 2,3,0,1,1,1,0,1 ;2-4 type3 dw 8 db 3,2,0,1,1,1,1,0 db 2,3,1,0,1,1,0,1 db 3,2,0,1,1,1,1,0 db 2,3,1,0,1,1,0,1 type4 dw 8 db 3,2,1,1,0,0,1,1 db 2,3,0,1,1,1,1,0 db 3,2,1,1,0,0,1,1 db 2,3,0,1,1,1,1,0 type5 dw 6 db 4 dup (2,2,1,1,1,1) type6 dw 8 db 2,3,1,0,1,0,1,1 db 3,2,0,0,1,1,1,1 db 2,3,1,1,0,1,0,1 db 3,2,1,1,1,1,0,0 type7 dw 8 db 2,3,0,1,0,1,1,1 db 3,2,1,1,1,0,0,1 db 2,3,1,1,1,0,1,0 db 3,2,1,0,0,1,1,1 ;--- Rotation datas --- rot1 db -1,2,1,-2,-1,2,1,-2 rot2 db 1,-1,-1,0,0,0,0,1 rot3 db 8 dup (0) rot4 db 8 dup (0) rot5 db 8 dup (0) rot6 db -1,0,0,0,0,1,1,-1 rot7 db 0,1,1,-1,-1,0,0,0 ;--- Virtual playfield --- vpfield: ;--- END --- code ends end start