汇编版俄罗斯方块
得知汇编语言之母Kathleen Booth,在加拿大去世,享年100岁。发一篇17年前的汇编语言作品,以表悼念!🙏
SCAN MACRO FUHAO, A1
PUSH AX
PUSH CX
PUSH DX
PUSH DI
CALL CLEAR
MOV DI, A1
FUHAO A1, NUM1
MOV AH, 0DH
CALL BOX
MOV A1, DI
CALL DRAW
POP DI
POP DX
POP CX
POP AX
ENDM
;-------------------------
DATA SEGMENT
ORG 0000H
BOX1 DW 33H, 0
ORG 000AH
BOX2 DW 132H, 63H, 0
ORG 0014H
BOX3 DW 1111H, 0FH, 0
ORG 001EH
BOX4 DW 231H, 36H, 0
ORG 0028H
BOX5 DW 72H, 131H, 27H, 232H, 0
ORG 0032H
BOX6 DW 113H, 47H, 322H, 71H, 0
ORG 003CH
BOX7 DW 223H, 74H, 311H, 17H, 0
ORG 0046H
BOX8 DW 33H, 0
ORG 0050H
BOX9 DW 132H, 63H, 0
TABLE DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH
BUFFC DW ?
BUFFD DW ?
ADDR1 DW ?
ADDR2 DW ?
NEXTADR DW ?
LINE DB ?
SCORE DW 0
GRAMODE DW ?
NUM1 DW 7
NUM2 DW 6
NUM3 DW 28
SHAPE DB ?
LCD DB ?
HTOD DB 4 DUP (?)
TIME DW ?
SPEED DW 600
DATA ENDS
;-----------------------------------------
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV AH, 0FH
INT 10H
MOV AH, 0
MOV GRAMODE, AX
MOV AL, 13H
INT 10H
MOV AH, 0CH
MOV AL, 01
MOV BH, 0
MOV CX, 82
MOV DX, 04
MOV SI, 191
LAB1: INT 10H
INC DX
DEC SI
JNZ LAB1
MOV SI, 128
LAB2: INT 10H
INC CX
DEC SI
JNZ LAB2
MOV SI, 191
LAB3: INT 10H
DEC DX
DEC SI
JNZ LAB3
MOV SI, 128
LAB4: INT 10H
DEC CX
DEC SI
JNZ LAB4
;----------------------------------
CALL RANDOM
B1: MOV NUM1, 7
MOV NUM2, 6
MOV NUM3, 28
MOV SI, NEXTADR
MOV ADDR1, SI
MOV ADDR2, SI
MOV BP, [SI]
MOV CX, 243
MOV DX, 40
CALL CLEAR
CALL RANDOM
MOV BP, [SI]
CALL DRAW
MOV SI, ADDR2
MOV BP, [SI]
MOV CX, 140 ;start columns
MOV DX, 06 ;start rows
CALL DRAW
CALL LINESCAN
CMP BL, 0
JNE EXIT
B2: MOV AH, 01
INT 16H
JZ NEXT
C2: MOV BUFFC, CX
MOV BUFFD, DX
CALL HOTKEY
CALL CLEAR
MOV CX, BUFFC
MOV DX, BUFFD
MOV SI, ADDR2
MOV BP, WORD PTR [SI]
CALL DRAW
JMP B2
NEXT: CALL LINESCAN
CMP BL, 0
JNE J1
CALL CLEAR
ADD DX, NUM1
CALL DRAW
MOV SI, 50
C1: CALL DELAY
MOV AH, 01
INT 16H
JNZ C2
DEC SI
JNZ C1
CALL LINESCAN
CMP BL, 0
JE B2
J1: CALL FULLINE
CALL GETSCO
JMP B1
EXIT: CALL CLRKEY
MOV AX, GRAMODE
INT 10H
MOV AH, 4CH
INT 21H
;---------------------------------
RANDOM PROC NEAR
PUSH AX
PUSH BX
PUSH CX
XOR AX, AX
IN AL, 40H
MOV BL, AL
XOR AX, AX
MOV CX, 8
L1: ROR BL, 1
ADC AL, 0
LOOP L1
MOV CL, 10
MUL CL
MOV SI, AX
MOV NEXTADR, SI
POP CX
POP BX
POP AX
RET
RANDOM ENDP
GETSCO PROC NEAR
CMP LINE, 0
JE K10
XOR AX, AX
MOV AL, LINE
MUL LINE
ADD AX, SCORE
CMP AL, 100
JL K11
SUB AL, 100
INC AH
K11: MOV SCORE, AX
MOV BX, AX
MOV DL, 10
MOV CX, 9
K1: CMP BL, DL
JL K2
ADD AL, 6
ADD DL, 10
LOOP K1
K2: MOV CX, 9
MOV DL, 10
K7: CMP BH, DL
JL K8
ADD AH, 6
ADD DL, 10
LOOP K7
K8: MOV BX, AX
MOV CH, 4
MOV CL, 4
LEA DI, HTOD
JMP K3
K10: JMP K9
K3: ROL BX, CL
MOV AL, BL
AND AL, 0FH
MOV [DI], AL
INC DI
DEC CH
JNZ K3
MOV CX, 223
MOV DX, 130
LEA BX, TABLE
LEA SI, HTOD
MOV LCD, 0
MOV DI, 4
K6: MOV AL, [SI]
CMP LCD, 0
JNE K5
CMP AL, 0
JE K4
K5: XLAT
MOV SHAPE, AL
CALL DISPLAY
INC LCD
ADD CX, 20
K4: INC SI
DEC DI
JNZ K6
K9: RET
GETSCO ENDP
DISPLAY PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH BP
XOR BX, BX
MOV NUM1, 4
MOV NUM2, 3
MOV NUM3, 16
MOV AH, 0CH
MOV AL, 0
ROR SHAPE, 1
JNC H1
MOV AL, 02
H1: MOV BP, 06H
CALL BOX
ADD CX, 12
MOV AL, 0
ROR SHAPE, 1
JNC H2
MOV AL, 02
H2: MOV BP, 110H
CALL BOX
ADD DX, 16
MOV AL, 0
ROR SHAPE, 1
JNC H3
MOV AL, 02
H3: MOV BP, 11H
CALL BOX
ADD DX, 8
SUB CX, 12
MOV AL, 0
ROR SHAPE, 1
JNC H4
MOV AL, 02
H4: MOV BP, 06H
CALL BOX
SUB DX, 8
MOV AL, 0
ROR SHAPE, 1
JNC H5
MOV AL, 02
H5: MOV BP, 11H
CALL BOX
SUB DX, 16
MOV AL, 0
ROR SHAPE, 1
JNC H6
MOV AL, 02
H6: MOV BP, 110H
CALL BOX
ADD DX, 12
MOV AL, 0
ROR SHAPE, 1
JNC H7
MOV AL, 02
H7: MOV BP, 06H
CALL BOX
POP BP
POP DX
POP CX
POP BX
POP AX
RET
DISPLAY ENDP
FULLINE PROC NEAR
MOV BYTE PTR LINE, 0
MOV CX, 84
MOV BH, 0
MOV AH, 0DH
MOV DI, 4
E3: MOV SI, 18
E1: INT 10H
CMP AL, 0
JE E2
ADD CX, NUM1
DEC SI
JNZ E1
CALL XIAO
CALL SHIFDOW
INC LINE
E2: MOV CX, 84
ADD DX, NUM1
CMP DX, 195
JE E4
DEC DI
JNZ E3
E4: RET
FULLINE ENDP
SHIFDOW PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
MOV BL, 0
G2: MOV CX, 84
MOV SI, 18
G1: MOV AH, 0DH
SUB DX, NUM1
INT 10H
ADD DX, NUM1
MOV AH, 0CH
CALL RWPIX
ADD CX, NUM1
DEC SI
JNZ G1
SUB DX, NUM1
CMP DX, 06
JNE G2
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
SHIFDOW ENDP
EXIT1: JMP EXIT
XIAO PROC NEAR
PUSH SI
PUSH DI
MOV BP, 01
MOV CX, 84
MOV SI, 18
F1: CALL CLEAR
ADD CX, NUM1
DEC SI
JNZ F1
POP DI
POP SI
RET
XIAO ENDP
LINESCAN PROC NEAR
SCAN ADD, DX
RET
LINESCAN ENDP
CLEAR PROC NEAR
PUSH AX
PUSH BX
MOV AH, 0CH
MOV AL, 0
CALL BOX
POP BX
POP AX
RET
CLEAR ENDP
DRAW PROC NEAR
PUSH BX
MOV AH, 0CH
MOV AL, 01
CALL BOX
POP BX
RET
DRAW ENDP
HOTKEY PROC NEAR
CMP AH, 01 ;ESC
JE EXIT1
CMP AH, 1CH ;ENTER
JE B3
CMP AH, 48H ;UP
JE B4
CMP AH, 4BH ;LEFT
JE B5
CMP AH, 4DH ;RIGHT
JE B6
CMP AH, 50H ;DOWN
JE B7
JMP EXITP
B3: CALL PAUSE
JMP EXITP
B4: CALL ROTAGE
JMP EXITP
B5: CALL LEFT
JMP EXITP
B6: CALL RIGHT
JMP EXITP
B7: CALL GODOWN
EXITP: CALL CLRKEY
RET
HOTKEY ENDP
PAUSE PROC NEAR
CALL CLRKEY
B8: MOV AH, 0
INT 16H
CMP AH, 1CH
JNE B8
RET
PAUSE ENDP
ROTAGE PROC NEAR
PUSH AX
PUSH BP
CALL CLEAR
MOV SI, ADDR2
MOV BP, WORD PTR [SI+2]
CMP BP, 0
JE D2
MOV AH, 0DH
CALL BOX
CMP BL, 0
JNE D1
ADD ADDR2, 2
D1: CALL CLRKEY
POP BP
POP AX
RET
D2: MOV SI, ADDR1
MOV BP, WORD PTR [SI]
MOV AH, 0DH
CALL BOX
CMP BL, 0
JNE D1
MOV ADDR2, SI
JMP D1
ROTAGE ENDP
LEFT PROC NEAR
SCAN SUB, CX
CMP BL, 0
JNE B9
SUB BUFFC, 7
B9: CALL CLRKEY
RET
LEFT ENDP
RIGHT PROC NEAR
SCAN ADD, CX
CMP BL, 0
JNE B10
ADD BUFFC, 7
B10: CALL CLRKEY
RET
RIGHT ENDP
GODOWN PROC NEAR
PUSH DX
B12: SCAN ADD, DX
CMP BL, 0
JNE B11
CALL CLEAR
ADD DX, 7
ADD BUFFD, 7
JMP B12
B11: CALL CLRKEY
POP DX
RET
GODOWN ENDP
CLRKEY PROC NEAR
PUSH DX
PUSH SI
MOV DX, 0040H
MOV ES, DX
MOV SI, WORD PTR ES:[001AH]
MOV WORD PTR ES:[001CH], SI
POP SI
POP DX
RET
CLRKEY ENDP
BOX PROC NEAR
PUSH AX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP
XOR BL, BL
MOV DI, 4
A3: MOV SI, 4
A1: ROR BP, 1
JNC A2
CALL RWPIX
CMP BL, 0
JNE A4
A2: ADD CX, NUM1
DEC SI
JNZ A1
SUB CX, NUM3
ADD DX, NUM1
DEC DI
JNZ A3
A4: POP BP
POP DI
POP SI
POP DX
POP CX
POP AX
RET
BOX ENDP
RWPIX PROC NEAR
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP
MOV DI, NUM2
MOV BP, CX
A5: MOV CX, BP
MOV SI, NUM2
A6: INT 10H
CMP AH, 0DH
JNE A10
CMP AL, 0
JNE A8
A10: INC CX
DEC SI
JNZ A6
INC DX
DEC DI
JNZ A5
A7: POP BP
POP DI
POP SI
POP DX
POP CX
RET
A8: INC BL
JMP A7
RWPIX ENDP
DELAY PROC NEAR
PUSH AX
PUSH CX
MOV CX, SPEED
LAB: IN AL, 61H
AND AL, 10H
CMP AL, AH
JE LAB
MOV AH, AL
LOOP LAB
POP CX
POP AX
RET
DELAY ENDP
CODE ENDS
END START