-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSTETRIS.ASM
More file actions
244 lines (230 loc) · 6.12 KB
/
STETRIS.ASM
File metadata and controls
244 lines (230 loc) · 6.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
TITLE SmallTetris
Comment #
Small Tetris
~~~~~~~~~~~~
par FLAMENT Alexandre
commenc‚ le : 24/03/96 v1.0 (290 octets)
21/04/97 v1.1
derniŠre modif : 01/05/97
BH = 0
CX = Tempo
DX = Position de la piŠce (DH,DL)
BP = Rotation de la piŠce
SI = PiŠce
#
JeuDX equ 1 ; Colonne de d‚part du jeu
JeuFX equ 16 ; Colonne de fin du jeu
JeuFY equ 20 ; Ligne de fin du jeu (ligne de d‚but = 0)
Tour equ 'Û' ; CaractŠre du bord du jeu
Piece equ 'þ' ; CaractŠre des piŠces
ColTour equ 9h ; Couleur du bord du jeu
ColPiece equ 7h ; Couleur des piŠces
Tempo equ 5 ; Attente avant la descente = Tempo*1/18.2 s
.MODEL TINY
.386
.CODE
ORG 100H
START:
;** programme principal
;Init de l'‚cran
mov al,3 ; AH d‚j… … 0 <= DOS
int 10h
mov ax,1112h ; 80x50
; xor bl,bl ; BL d‚j… … 0 <= DOS
int 10h
;ES=0B800h, FS=40h
Push 0B800h
pop es
push 40h
pop fs
;Affiche l'‚cran du jeu
;les cot‚s du jeu
; mov di,(JeuDX-1)*2 ; DI=0 <= DOS
xor di,di
mov ax,ColTour*256+Tour
mov cl,JeuFY ; CH=0 <= DOS
b1:
stosw
add di,(JeuFX-JeuDX+1)*2
stosw
add di,160-(JeuFX-JeuDX+3)*2
loop b1
mov cl,JeuFX-JeuDX+3
rep stosw
;le score
mov al,'0'
mov cl,5
rep stosw
;une nouvelle piŠce
newp:
; Score=Score+3
mov cl,3
call shows
; une piŠce au hazard
mov al,fs:[6Ch]
and ax,7
mov si,ax
; xor bp,bp
; position = en haut au milieu
mov dx,8+1*256
;init du compteur de temp
bmain_tempo:
mov cl,Tempo
bmain:
; Affiche la piŠce
mov ax,Piece
call ShowP
; Attend une touche ou un 1/18.2 seconde
hlt
; Efface la piŠce
mov al,' ' ; ah = 0 <- mov ax,Piece
call ShowP
mov ah,1
int 16h
jz attendre
xor ax,ax
int 16h
cmp al,'8'
jne pas8
inc bp
call testp
jnc bmain
dec bp
; jmp bmain
pas8:
cmp al,'5'
je downp
sub al,'4'
cmp al,2
ja pas46
push dx
dec al
add dl,al
call testp
jc pasbon
pop di
push dx
pasbon:
pop dx
; jmp bmain
pas46:
cmp al,27-'4'
jne bmain
finprg:
ret
;boucle d'attente
attendre:
loop bmain
downp:
inc dh
call testp
jnc bmain_tempo
;La piŠce est en haut ? oui -> perdu
fini:
dec dh
mov ax,Piece
call ShowP
dec dh
je finprg
;Test s'il y a des lignes
mov dh,JeuFY-1
b2_0:
mov dl,JeuDX-1
b2:
inc dl
mov ah,2h
int 10h
mov ah,8h
int 10h
cmp al,Piece
jne pasdeligne
cmp dl,JeuFX
jb b2
; Une ligne de trouv‚e
mov ax,0701h
mov bh,7
mov cl,JeuDX ; CH tjrs … 0
int 10h
xor bh,bh ; BH = 0 pour le reste du prog
inc dh
mov cl,7 ; Une ligne = 7 points
call shows
pasdeligne:
dec dh
jnz b2_0
jmp newp ; Saut long <= Delta = 149
;** codage des piŠces
t db 00001011b ;4
carre db 01001110b ;0
ld db 00010111b ;2
ld2 db 00010111b ;2 pour avoir 7 possibilit‚es
zg db 01000111b ;6
zd db 01100111b ;5
lg db 10010111b ;3
;barre db 11111101b ;1 cod‚ dans le STD de ShowS
;** Ajout CL au score et l'affiche
ShowS proc near
std
ssb:
mov di,(JeuFY)*160+(JeuFX+6)*2
mov si,di
ssb2:
lods word ptr es:[si]
cmp al,'9'
jne nooverf
mov al,'0'
stosw
jmp ssb2
nooverf:
inc byte ptr es:[di]
loop ssb
ret
ShowS endp
;** Test si la piŠce peut s'afficher
TestP proc near
mov ah,6
TestP endp
;** Affiche ou test la piŠce CurP,CurR en (DL,DH) avec le caractŠre AL
ShowP proc near
pusha
mov saut,ah
mov bl,ds:[si+t]
mov cl,5
bsp:
;positione le curseur
mov ah,02h
int 10h
;calcul le d‚placement
push ax
mov al,bl
add ax,bp
and al,3
shl al,2
add al,0C2h
mov ctm,al
pop ax
shr bl,2
db 0EBh
saut db 00h
;Affichage du caractŠre dans AL
on_aff:
mov ah,0Eh
int 10h
jmp next
;Test si la piŠce peut s'afficher
on_test:
mov ah,08h
int 10h
cmp al,' ' ; AL d‚truit mais pas important pour le test
stc
jne cantdoit
;effectue le d‚placement
next: db 0FEh ; Code pour Inc/Dec dl/dh
ctm db 0C2h ; C2:Droite, C6:Bas, CA:Gauche, CE:Haut
loop bsp
clc
cantdoit:
popa
ret
ShowP endp
END START