-
Notifications
You must be signed in to change notification settings - Fork 0
/
pacman.asm
166 lines (152 loc) · 3.09 KB
/
pacman.asm
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
;Packman
pacx .EQU 8100H
pacy .EQU 8101H
pacCDir .EQU 8102H ;Pacmans current direction
pacNDir .EQU 8103H ;Pacman next direction (from key press)
pacLives .EQU 8105H ;Pacman next direction (from key press)
initPacx .EQU 14
initPacy .EQU 14
initLives .EQU 4
pPelletTics .EQU 20H ;Power Pellet last time
pPActive .EQU 8104H ;Power Pellet Timer
initPacman:
LD HL, 0H
LD (score), HL
LD HL, 1H
LD (level), HL
LD a,initLives
LD (pacLives),a
LD a,0
LD (fruits),a
resetPacMan: LD a, initPacx ;set Pacman Pos
LD (pacx),a
LD a, initPacy
LD (pacy),a
LD a, 'D' ;Set start direction
LD (pacCDir),A
LD (pacNDir),A
LD a,0
LD (pPActive),A
RET
clearPM:
LD A, (pacx) ;Push X to stack
LD C,A
LD A, (pacy) ;Push Y to stack
LD B,A
CALL printMapAt
RET
printPM:
LD A, (pacx) ;Push X to stack
INC A
LD C,A
LD A, (pacy) ;Push Y to stack
INC A
LD B,A
CALL moveCursor
LD HL, pacman
CALL print
RET
getPMMapData:
LD A, (pacx)
LD C,A
LD A, (pacy)
LD B,A
CALL getMapAddress
LD A,(HL)
ret
eatPellet: ;Eat pellet at packman location
CALL getPMMapData
BIT pelletBit,A
JR NZ,eatSPellet
BIT powerPBit,A
JR NZ,eatPPellet
BIT sfBit,A
JR NZ,eatFruit
RET
eatFruit:
PUSH HL
LD HL,(score)
LD BC,50
ADD HL,BC
LD (score),HL
LD A,(fruits)
INC A
LD (fruits),A
POP HL
RES sfBit,(HL)
RET
eatSPellet:
PUSH HL
LD HL,(score)
INC HL
LD (score),HL
POP HL
RES pelletBit,(HL)
RET
eatPPellet:
LD A,pPelletTics
LD (pPActive),A
RES powerPBit,(HL)
RET
getMove: ;Sets the current move var
CALL getPMMapData
LD D,A
LD A,(pacNDir) ;Is the next move valid
CALL isMoveValid
JR NZ,nextMoveValid
LD A,(pacCDir) ;Is the current move valid
CALL isMoveValid
RET NZ
JR calcNextMove
nextMoveValid:
LD (pacCDir),A
LD (pacNDir),A
RET
calcNextMove:
CP 'A'
JR Z,checkV
CP 'D'
JR Z,checkV
JR checkH
checkH:
LD A,'A'
CALL isMoveValid
JR NZ,nextMoveValid
LD A,'D'
CALL isMoveValid
JR NZ,nextMoveValid
checkV:
LD A,'W'
CALL isMoveValid
JR NZ,nextMoveValid
LD A,'S'
CALL isMoveValid
JR NZ,nextMoveValid
JR checkH
;Move
movePM:
LD A,(pPActive)
OR A
JP Z,movePMA
DEC A
LD (pPActive),A
movePMA: LD A,(pacCDir)
LD DE,pacx
LD BC,pacy
JP move
killPacman:
POP HL
POP HL
LD A,(pacLives)
DEC A
OR A
JP Z,displayGameOver
LD (pacLives),A
CALL resetPacMan
CALL initGhost
CALL countdown
LD HL, home ;Go home
CALL print
CALL printMap
JP gameLoop
pacman: .BYTE 1BH,"[93mC",1BH,"[0m",0