汇编版俄罗斯方块

得知汇编语言之母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

 

posted @ 2022-10-30 18:08  fairychild  阅读(231)  评论(0)    收藏  举报