⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pingpong.asm

📁 一个微型操作系统源码
💻 ASM
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Project 		: 	FDOS 0.0.8
;; Author 		: 	Stefan Tappertzhofen (tappertzhofen@t-online.de)
;; Webpage 		: 	http://www.visual-opal.de
;; Date 		: 	2. September 2003
;; Info		 	: 	Ping Pong Game Example
;; Filename 		: 	pingpong.asm
;; Compile Syntax 	: 	nasm pingpong.asm -f bin -o pingpong.bin
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


	MOV AX, CS				; Load Segment Registers
        MOV DS, AX
        MOV ES, AX


Begin:

	; Welcome

        MOV AH, 4                               ; CLS
        INT 21h

	MOV SI, MSG_Welcome
	MOV AH, 1
	INT 21h

	XOR AH, AH
	INT 16h

	CMP AL, '0'
	JE SHORT End_Program
	
	CMP AL, '1'
	JE SHORT StartGame1

	CMP AL, '2'
	JE SHORT StartGame2

	CMP AL, '3'
	JE SHORT StartGame3

	JMP SHORT Begin

End_Program:

        MOV AH, 4                               ; CLS
        INT 21h

	MOV AH, 0
	INT 21h

StartGame1:

	MOV AX, 1
	MOV [Speed], AX
	JMP SHORT StartGame

StartGame2:

	MOV AX, 2
	MOV [Speed], AX
	JMP SHORT StartGame

StartGame3:

	MOV AX, 3
	MOV [Speed], AX
	JMP SHORT StartGame

StartGame

	MOV AH, 1
	MOV CX, 10280				; Disable Coursor
	INT 10h


	; Init Player 1 Position

	MOV BYTE [PosPlayer1], 9
	MOV BYTE [LastPlayer1], 9

	; Init Player 2 Position

	MOV BYTE [PosPlayer2], 9
	MOV BYTE [LastPlayer2], 9


	; Init Ball Position

	MOV BYTE [XPos], 39
	MOV BYTE [LastX], 39
	
	MOV BYTE [YPos], 12
	MOV BYTE [LastY], 12

	; Init Direction of Ball


	MOV BYTE [DirectionX], 1
	MOV BYTE [DirectionY], 1


        MOV AH, 4                               ; CLS
        INT 21h

	; Print Game Screen


	CALL PrintPlayer1
	CALL PrintPlayer2
	CALL PrintBall


	DoGame:

		PUSH CX

	.IfX:


		MOV AL, [XPos]
		CMP AL, 4
		JB NEAR .CheckPlayer1
		CMP AL, 75
		JA NEAR .CheckPlayer2

	.IfY:

		MOV AL, [YPos]
		CMP AL, 2
		JB NEAR .PosYDirection
		CMP AL, 21
		JA NEAR .NegYDirection


	.PrintTheBall:


		; Check If any Player pressed a key:

		mov ah, 01h
		int 16h
		jz .DoPrint

		xor ah, ah
		int 16h



		CMP AL, 'w'
		JE .SubPlayer1
		CMP AL, 's'
		JE .AddPlayer1

		CMP AL, 'o'
		JE .SubPlayer2
		CMP AL, 'l'
		JE .AddPlayer2

		JMP .DoPrint

	
	.AddPlayer1:




		MOV AL, [PosPlayer1]

		CMP AL, 17
		JE SHORT .DoPrint

		ADD AL, 1
		MOV [PosPlayer1], AL 
		JMP SHORT .DoPrint


	.SubPlayer1:

		MOV AL, [PosPlayer1]

		CMP AL, 0
		JE SHORT .DoPrint

		SUB AL, 1
		MOV [PosPlayer1], AL 
		JMP SHORT .DoPrint

	.AddPlayer2:

		MOV AL, [PosPlayer2]

		CMP AL, 17
		JE SHORT .DoPrint

		ADD AL, 1
		MOV [PosPlayer2], AL
		JMP SHORT .DoPrint 


	.SubPlayer2:

		MOV AL, [PosPlayer2]

		CMP AL, 0
		JE SHORT .DoPrint

		SUB AL, 1
		MOV [PosPlayer2], AL
		JMP SHORT .DoPrint 

		
	.DoPrint:

		MOV AX, [XPos]
		ADD AX, [DirectionX]
		MOV [XPos], AX 

		MOV AX, [YPos]
		ADD AX, [DirectionY]
		MOV [YPos], AX 


		CALL PrintScreen			; Print Game Screen
		CALL PrintPlayer1
		CALL PrintPlayer2
		CALL PrintBall


		CALL WaitTime


		JMP ResumeGame

	 .PosXDirection:
			
		MOV BYTE [DirectionX], 1
		JMP NEAR .IfY

	 .NegXDirection:
			
		MOV BYTE [DirectionX], -1
		JMP NEAR .IfY
	
	 .PosYDirection:
			
		MOV BYTE [DirectionY], 1
		JMP NEAR .PrintTheBall

	 .NegYDirection:
			
		MOV BYTE [DirectionY], -1
		JMP NEAR .PrintTheBall

	.CheckPlayer1:

		MOV AL, [YPos]
		MOV BL, [PosPlayer1]

		CMP AL, BL
		JE .PosXDirection

		MOV AL, [YPos]
		MOV BL, [PosPlayer1]
		ADD BL, 1

		CMP AL, BL
		JE .PosXDirection

		MOV AL, [YPos]
		MOV BL, [PosPlayer1]
		ADD BL, 2

		CMP AL, BL
		JE .PosXDirection

		MOV AL, [YPos]
		MOV BL, [PosPlayer1]
		ADD BL, 3

		CMP AL, BL
		JE .PosXDirection

		MOV AL, [YPos]
		MOV BL, [PosPlayer1]
		ADD BL, 4

		CMP AL, BL
		JE .PosXDirection

		MOV AL, [YPos]
		MOV BL, [PosPlayer1]
		ADD BL, 5

		CMP AL, BL
		JE .PosXDirection

		MOV AL, [YPos]
		MOV BL, [PosPlayer1]
		ADD BL, 5

		CMP AL, BL
		JE .PosXDirection

		JMP .Player1Lost

	.CheckPlayer2:

		MOV AL, [YPos]
		MOV BL, [PosPlayer2]

		CMP AL, BL
		JE .NegXDirection

		MOV AL, [YPos]
		MOV BL, [PosPlayer2]
		ADD BL, 1

		CMP AL, BL
		JE .NegXDirection

		MOV AL, [YPos]
		MOV BL, [PosPlayer2]
		ADD BL, 2

		CMP AL, BL
		JE .NegXDirection

		MOV AL, [YPos]
		MOV BL, [PosPlayer2]
		ADD BL, 3

		CMP AL, BL
		JE .NegXDirection

		MOV AL, [YPos]
		MOV BL, [PosPlayer2]
		ADD BL, 4

		CMP AL, BL
		JE .NegXDirection

		MOV AL, [YPos]
		MOV BL, [PosPlayer2]
		ADD BL, 5

		CMP AL, BL
		JE .NegXDirection

		MOV AL, [YPos]
		MOV BL, [PosPlayer2]
		ADD BL, 6

		CMP AL, BL
		JE .NegXDirection

		JMP .Player2Lost

	.Player2Lost:

		MOV AH, 4                               ; CLS
        	INT 21h

		MOV CX, 3085
		MOV CX, 1543
		MOV AH, 1
		INT 10h

		MOV SI, MSG_Player2_Lost
		MOV AH, 1
		INT 21h

		MOV AH, 0
		INT 21h

	.Player1Lost:

        	MOV AH, 4                               ; CLS
        	INT 21h

		MOV CX, 3085
		MOV CX, 1543
		MOV AH, 1
		INT 10h

		MOV SI, MSG_Player1_Lost
		MOV AH, 1
		INT 21h

		MOV AH, 0
		INT 21h



	ResumeGame:


		POP CX

		JMP DoGame





	MOV AH, 4                               ; CLS
        INT 21h

	MOV AH, 0
	INT 21h


WaitTime:

	XOR AH, AH
	INT 1Ah

	MOV BX, DX


	.GetNewTime:

		PUSH BX
		XOR AH, AH
		INT 1Ah
		POP BX

		SUB DX, BX
		MOV AX, [Speed]
		CMP DX, AX
		JB SHORT .GetNewTime
	
	JMP ResumeGame






	

PrintScreen:

	MOV DL, [XPos]
	MOV DH, [YPos]
	CALL LocateXY
	CALL PrintDummy



	MOV DL, [XPos]
	MOV DH, [YPos]
	SUB DL, 1
	SUB DH, 1
	CALL LocateXY
	CALL PrintDummy

	MOV DL, [XPos]
	MOV DH, [YPos]
	SUB DL, 1
	CALL LocateXY
	CALL PrintDummy



	MOV DL, [XPos]
	MOV DH, [YPos]
	SUB DH, 1
	CALL LocateXY
	CALL PrintDummy



	MOV DL, [XPos]
	MOV DH, [YPos]
	ADD DH, 1
	CALL LocateXY
	CALL PrintDummy



	MOV DL, [XPos]
	MOV DH, [YPos]
	ADD DL, 1
	CALL LocateXY
	CALL PrintDummy




	MOV DL, [XPos]
	MOV DH, [YPos]
	ADD DL, 1
	ADD DH, 1
	CALL LocateXY
	CALL PrintDummy

	MOV DL, [XPos]
	MOV DH, [YPos]
	ADD DL, 1
	SUB DH, 1
	CALL LocateXY
	CALL PrintDummy

	MOV DL, [XPos]
	MOV DH, [YPos]
	SUB DL, 1
	ADD DH, 1
	CALL LocateXY
	CALL PrintDummy





	RETN




PrintPlayer1:


	; Clear Last Position of Player

	MOV DH, [LastPlayer1]
	MOV DL, 3

	CALL LocateXY

	MOV CX, 6

	.ClearOldPos:

		CALL PrintSpace
		CALL PrintSpace

		INC DH
		MOV DL, 3

		CALL LocateXY
		LOOPNZ .ClearOldPos

	; Print Player


	MOV DH, [PosPlayer1]
	MOV DL, 3

	CALL LocateXY

	MOV CX, 6
	.PrintPos:

		CALL PrintBlock
		CALL PrintBlock

		INC DH
		MOV DL, 3

		CALL LocateXY
		LOOPNZ .PrintPos

	MOV AL, [PosPlayer1]
	MOV [LastPlayer1], AL

	RETN
	


PrintPlayer2:


	; Clear Last Position of Player

	MOV DH, [LastPlayer2]
	MOV DL, 76

	CALL LocateXY

	MOV CX, 6

	.ClearOldPos:

		CALL PrintSpace
		CALL PrintSpace

		INC DH
		MOV DL, 76

		CALL LocateXY
		LOOPNZ .ClearOldPos

	; Print Player


	MOV DH, [PosPlayer2]
	MOV DL, 76

	CALL LocateXY

	MOV CX, 6

	.PrintPos:

		CALL PrintBlock
		CALL PrintBlock

		INC DH
		MOV DL, 76

		CALL LocateXY
		LOOPNZ .PrintPos


	MOV AL, [PosPlayer2]
	MOV [LastPlayer2], AL

	RETN


PrintBall:


	; Clear Last Position of Ball

	MOV AL, [XPos]
	MOV [LastX], AL

	MOV AL, [YPos]
	MOV [LastY], AL

	; Print New Ball

	MOV DL, [XPos]
	MOV DH, [YPos]

	CALL LocateXY
	CALL PrintB		

	RETN



PrintSpace:

	MOV AH, 11
	MOV AL, ' '
	INT 21h
	RETN

PrintDummy:

	MOV AH, 11
	MOV AL, ' '
	INT 21h
	RETN

PrintBlock:

	MOV AH, 11
	MOV AL, '

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -