ASM Tetroid


I seem to have a record of making tetris games, because they're fun (but mostly because I know how.) This is yet-another tetris clone, only remarkable because it was created with assembly language and runs under Windows (95 ... XP) using OpenGL.

Here is a zip file containing the program and source.

Here are a few flowcharts describing program operation: I can tell you're not impressed, so here is a sample of the source code with comments stripped for maximum obfuscation.

RotatePieceCW PROC

	LOCAL srcX:dword, srcY:dword, destX:dword, destY:dword, i:sdword, j:sdword, cell:byte

	MOV EAX, currentPieceSize
	MOV i, EAX
	DEC i

	.WHILE (i >= 0)

		MOV EAX, currentPieceSize
		MOV j, EAX
		DEC j

		.WHILE (j >= 0)

			invoke GetPiece, currentPiece, currentPieceSize, i, j, ADDR cell

			.IF (cell == 1)

				MOV EAX, pieceX
				ADD EAX, currentPieceSize
				SUB EAX, 1
				SUB EAX, j
				MOV destX, EAX

				MOV EAX, pieceY
				ADD EAX, i
				MOV destY, EAX

				invoke GetBoard, destX, destY, ADDR cell

			    .IF (cell == 99)
					JMP Failed
				.ENDIF

				.IF (destX < 0) || (destX >= 10)
					JMP Failed
				.ENDIF

				.IF (destY < 0) || (destY >= 20)
					JMP Failed
				.ENDIF

			.ENDIF

			MOV cell, 0

			DEC j
		.ENDW

		DEC i
	.ENDW

	MOV EAX, currentPieceSize
	MOV j, EAX
	DEC j

	.WHILE (j >= 0)
	 
		MOV EAX, currentPieceSize
		MOV i, EAX
		DEC i

		.WHILE (i >= 0)

			MOV destX, 0
			MOV destY, 0

			MOV EAX, pieceX
			ADD EAX, i

			MOV destX, EAX

			MOV EAX, pieceY
			ADD EAX, j

			MOV destY, EAX

			invoke GetBoard, destX, destY, ADDR cell

			.IF (cell == 1)
				invoke SetBoard, destX, destY, 0
			.ENDIF
		 
			DEC i
		.ENDW

		DEC j
	.ENDW

	MOV EAX, currentPieceSize
	MOV i, EAX
	DEC i

	.WHILE (i >= 0)

		MOV EAX, currentPieceSize
		MOV j, EAX
		DEC j

		.WHILE (j >= 0)

			MOV EAX, i
			MOV EDX, j

			invoke GetPiece, currentPiece, currentPieceSize, i, j, ADDR cell

			.IF (cell == 1)

				MOV EAX, pieceX
				ADD EAX, currentPieceSize
				SUB EAX, 1
				SUB EAX, j
				MOV destX, EAX

				MOV EAX, pieceY
				ADD EAX, i
				MOV destY, EAX

				invoke SetBoard, destX, destY, 1
				
			.ENDIF

			MOV destX, 0
			MOV destY, 0

			MOV EAX, currentPieceSize
			SUB EAX, 1
			SUB EAX, j
			MOV destX, EAX

			MOV EAX, i
			MOV destY, EAX


			MOV ECX, 0
			MOV CL, cell

			invoke SetPiece, currentPiece, i, j, 0
            
			.IF (cell == 1)
				LEA EAX, tempCurrentPieceMatrix
				invoke SetPiece, ADDR tempCurrentPieceMatrix, destX, destY, 1
			.ENDIF

			MOV cell, 0

			DEC j
		.ENDW

		DEC i
	.ENDW

	MOV EAX, 4
	MOV i, EAX
	DEC i

	.WHILE (i >= 0)

		MOV EAX, 4
		MOV j, EAX
		DEC j

		.WHILE (j >= 0)

			MOV EAX, j
			MOV EDX, 4

			MUL DX

			ADD EAX, i
			MOV ESI, EAX

			LEA EAX, tempCurrentPieceMatrix

			ADD EAX, ESI
			MOV DL, [EAX]
			MOV BL, 0

			MOV [EAX], BL

			LEA EAX, currentPieceMatrix
			ADD EAX, ESI
			MOV [EAX], DL

			DEC j
		.ENDW

		DEC i
	.ENDW

	JMP Success

Failed:
	MOV EAX, 0
	ret

Success:
	MOV EAX, 1
	ret
RotatePieceCW ENDP