Commit | Line | Data |
---|---|---|
2da74194 AT |
1 | #ifndef WUMP_UI |
2 | #define WUMP_UI | |
3 | ||
4 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
5 | @ This files contains user interface functions for Hunt the Wumpus. | |
6 | @ (c) 2019 Aaron Taylor <ataylor at subgeniuskitty dot com> | |
7 | @ See LICENSE.txt file for copyright and license details. | |
8 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
9 | ||
10 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
11 | @ Name: | |
12 | @ seed_rng | |
13 | @ Description: | |
14 | @ Generate seed from keyboard input. | |
15 | @ Call Stack: | |
16 | @ <empty> | |
17 | @ Return Stack: | |
18 | @ <empty> | |
19 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
20 | #include <logic.pvvs> | |
21 | NSSVTSSSSSTTN | MARK: 10000011 (seed_rng) | |
22 | ||
23 | SSSTSSSSN | PUSH 16 (loop counter) | |
24 | SSSSN | PUSH 0 (rng seed) | |
25 | ||
26 | NSSVTSSSSSTTSSSSSSSSN | MARK: 10000011 00000000 (seed_rng:main loop) | |
27 | @ Get character from user and print ASCII '.' as feedback. | |
28 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
29 | TNTS | GETCHAR | |
30 | SSSTSTTTSN | PUSH ASCII '.' | |
31 | TNSS | PUTCHAR | |
32 | @ Left shift the seed by 4 bits. | |
33 | SSSTSSN | PUSH 4 (shift count) | |
34 | NSTTSTTSTN | JSR > 101101 (lshift) | |
35 | @ XOR seed with character from user. | |
36 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
37 | TTT | LOAD | |
38 | NSTTSTSTTN | JSR > 101011 (xor) | |
39 | @ Decrement counter | |
40 | SNT | SWAP | |
41 | SSSTN | PUSH +1 | |
42 | TSST | SUBTRACT | |
43 | @ Test for loop completion | |
44 | SNS | DUP | |
45 | NTSTSSSSSTTSSSSSSSTN | BRZ > 10000011 00000001 (seed_rng:cleanup and return) | |
46 | SNT | SWAP | |
47 | NSNTSSSSSTTSSSSSSSSN | JMP > 10000011 00000000 (seed_rng:main loop) | |
48 | ||
49 | @ Store seed, clean up and return. | |
50 | NSSVTSSSSSTTSSSSSSSTN | MARK: 10000011 00000001 (seed_rng:cleanup and return) | |
51 | SNN | DROP | |
52 | SSSSN | PUSH 0 (seed address) | |
53 | SNT | SWAP | |
54 | TTS | STORE | |
55 | SSSTSTSN | PUSH ASCII '\n' | |
56 | SSSTSTSN | PUSH ASCII '\n' | |
57 | TNSS | PUTCHAR | |
58 | TNSS | PUTCHAR | |
59 | NTN | RTS | |
60 | ||
28a945f7 AT |
61 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
62 | @ Name: | |
63 | @ is_room_adjacent | |
64 | @ Description: | |
65 | @ Checks if 'room_number' is adjacent to the player's current room. | |
66 | @ Call Stack: | |
67 | @ room_number <-- TOS | |
68 | @ Return Stack: | |
69 | @ (1 or 0) for true/false <-- TOS | |
70 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
71 | #include <stack.pvvs> | |
72 | NSSVTSTSSTSSN | MARK: 10100100 (is_room_adjacent) | |
73 | ||
74 | SSSTSSSSSSSSSSTTN | PUSH 0x1003 (ptr to number_of_tunnels_per_room) | |
75 | TTT | LOAD | |
76 | SSSTN | PUSH +1 | |
77 | TSST | SUBTRACT | |
78 | ||
79 | @ TOS> tunnel_index, destination_room_num | |
80 | NSSVTSTSSTSSSSSSSSSSN | MARK: 10100100 00000000 (is_room_adjacent:main_loop) | |
81 | SSSTSN | PUSH +2 | |
82 | NSTTTSSN | JSR > 1100 (deepdup) | |
83 | SSSTSN | PUSH +2 | |
84 | NSTTTSSN | JSR > 1100 (deepdup) | |
85 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player_location) | |
86 | TTT | LOAD | |
87 | NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination) | |
88 | TSST | SUBTRACT | |
89 | NTSTSTSSTSSSSSSSSSTN | BRZ > 10100100 00000001 (is_room_adjacent:found_tunnel) | |
90 | SSSTN | PUSH +1 | |
91 | TSST | SUBTRACT | |
92 | SNS | DUP | |
93 | NTTTSTSSTSSSSSSSSTSN | BMI > 10100100 00000010 (is_room_adjacent:no_match) | |
94 | NSNTSTSSTSSSSSSSSSSN | JMP > 10100100 00000000 (is_room_adjacent:main_loop) | |
95 | ||
96 | NSSVTSTSSTSSSSSSSSSTN | MARK: 10100100 00000001 (is_room_adjacent:found_tunnel) | |
97 | SNN | DROP | |
98 | SNN | DROP | |
99 | SSSTN | PUSH +1 | |
100 | NTN | RTS | |
101 | ||
102 | NSSVTSTSSTSSSSSSSSTSN | MARK: 10100100 00000010 (is_room_adjacent:no_match) | |
103 | SNN | DROP | |
104 | SNN | DROP | |
105 | SSSSN | PUSH 0 | |
106 | NTN | RTS | |
107 | ||
108 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
109 | @ Name: | |
110 | @ move_player | |
111 | @ Description: | |
112 | @ Prompts the player for a room number. Moves to that room, checking the new | |
113 | @ environment and executing consequences (fell in a pit, etc) as appropriate. | |
114 | @ Call Stack: | |
115 | @ <empty> | |
116 | @ Return Stack: | |
117 | @ <empty> | |
118 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
119 | #include <stdio.pvvs> | |
120 | #include <convert.pvvs> | |
121 | #include <math.pvvs> | |
00ec7afc | 122 | #include <string.pvvs> |
28a945f7 AT |
123 | NSSVTSTSSSTTN | MARK: 10100011 (move_player) |
124 | ||
125 | A"To which room do you wish to move?\n" | |
126 | SSSSN | PUSH 0 (number of string substitutions) | |
127 | NSTTSSSN | JSR > 1000 (printf) | |
00ec7afc AT |
128 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (buffer address) |
129 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (buffer size) | |
130 | NSTTSSSTSN | JSR > 100010 (get_user_string) | |
28a945f7 AT |
131 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) |
132 | NSTTTSSSSN | JSR > 110000 (atoi) | |
133 | SNN | DROP | |
134 | ||
135 | @ The desired room number is now on the TOS. Verify that it is valid. | |
136 | SNS | DUP | |
137 | NSTTSTSSTSSN | JSR > 10100100 (is_room_adjacent) | |
138 | NTSTSTSSSTTSSSSSSSTN | BRZ > 10100011 00000001 (invalid room number) | |
139 | NSNTSTSSSTTSSSSSSSSN | JMP > 10100011 00000000 (valid room number) | |
140 | ||
141 | NSSVTSTSSSTTSSSSSSSTN | MARK: 10100011 00000001 (invalid room number) | |
142 | @ TOS> room_number | |
143 | SNN | DROP | |
144 | A"*Oof!* (you hit the wall)\n" | |
145 | SSSSN | PUSH 0 (number of string substitutions) | |
146 | NSTTSSSN | JSR > 1000 (printf) | |
147 | NSTTSSSSN | JSR > 10000 (random) | |
148 | SSSTTSN | PUSH 6 (chance) | |
149 | TSTT | MODULO | |
150 | NTSTSTSSSTTSSSSSSTSN | BRZ > 10100011 00000010 (woke the wumpus) | |
151 | NTN | RTS | |
152 | NSSVTSTSSSTTSSSSSSTSN | MARK: 10100011 00000010 (woke the wumpus) | |
153 | A"Your colorful comments awaken the wumpus!\n" | |
154 | SSSSN | PUSH 0 (number of string substitutions) | |
155 | NSTTSSSN | JSR > 1000 (printf) | |
156 | NSTTSSSSN | JSR > 10000 (random) | |
157 | SSSTSSSSSSSSSSTTN | PUSH 0x1003 (ptr to number of tunnels per room) | |
158 | TSTT | MODULO | |
159 | SSSTSSSSSSSSSTTTN | PUSH 0x1007 (ptr to wumpus location) | |
160 | TTT | LOAD | |
161 | NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination) | |
162 | SSSTSSSSSSSSSTTTN | PUSH 0x1007 (ptr to wumpus location) | |
163 | SNT | SWAP | |
164 | TTS | STORE | |
165 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location) | |
166 | TTT | LOAD | |
167 | NSTTSTSSSSSN | JSR > 10100000 (room_has_wumpus) | |
168 | NTSTSTSSSTTSSSSSSTTN | BRZ > 10100011 00000011 (wumpus did not move to player) | |
169 | NSTTTTTTTTTSSSSSSSSN | JSR > 11111111 00000000 (wump_kill) | |
170 | SSSSN | PUSH 0 (number of string substitutions) | |
171 | NSTTSSSN | JSR > 1000 (printf) | |
172 | NNN | DIE | |
173 | NSSVTSTSSSTTSSSSSSTTN | MARK: 10100011 00000011 (wumpus did not move to player) | |
174 | NTN | RTS | |
175 | ||
176 | NSSVTSTSSSTTSSSSSSSSN | MARK: 10100011 00000000 (valid room number) | |
177 | @ TOS> room_number | |
178 | @ Move player to new room | |
179 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location) | |
180 | SNT | SWAP | |
181 | TTS | STORE | |
182 | @ Check for wumpus in new player location | |
183 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location) | |
184 | TTT | LOAD | |
185 | NSTTSTSSSSSN | JSR > 10100000 (room_has_wumpus) | |
186 | NTSTSTSSSTTSSSSSTSSN | BRZ > 10100011 00000100 (no wumpus in new room) | |
187 | NSTTTTTTTTTSSSSSSSSN | JSR > 11111111 00000000 (wump_kill) | |
188 | SSSSN | PUSH 0 (number of string substitutions) | |
189 | NSTTSSSN | JSR > 1000 (printf) | |
190 | NNN | DIE | |
191 | NSSVTSTSSSTTSSSSSTSSN | MARK: 10100011 00000100 (no wumpus in new room) | |
192 | @ Check for pits in new player location | |
193 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location) | |
194 | TTT | LOAD | |
195 | NSTTSSSTTSTN | JSR > 10001101 (room_has_pits) | |
196 | NTSTSTSSSTTSSSSSTSTN | BRZ > 10100011 00000101 (no pits in new room) | |
197 | NSTTSSSSN | JSR > 10000 (random) | |
198 | SSSTTSN | PUSH 6 (chance) | |
199 | TSTT | MODULO | |
200 | NTSTSTSSSTTSSSSSTTSN | BRZ > 10100011 00000110 (survived the pits) | |
201 | NSTTTTTTTTTSSSSSTSTN | JSR > 11111111 00000101 (pit_kill) | |
202 | SSSSN | PUSH 0 (number of string substitutions) | |
203 | NSTTSSSN | JSR > 1000 (printf) | |
204 | NNN | DIE | |
205 | NSSVTSTSSSTTSSSSSTTSN | MARK: 10100011 00000110 (survived the pits) | |
206 | NSTTTTTTTTTSSSSSTTSN | JSR > 11111111 00000110 (pit_survive) | |
207 | SSSSN | PUSH 0 (number of string substitutions) | |
208 | NSTTSSSN | JSR > 1000 (printf) | |
209 | NSSVTSTSSSTTSSSSSTSTN | MARK: 10100011 00000101 (no pits in new room) | |
210 | @ Check for bats in new player location | |
211 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location) | |
212 | TTT | LOAD | |
213 | NSTTSSSTTSSN | JSR > 10001100 (room_has_bats) | |
214 | NTSTSTSSSTTSSSSSTTSN | BRZ > 10100011 00000110 (no bats in new room) | |
215 | A"*flap* *flap* *flap* (humongous bats pick you up and move you!)\n" | |
216 | SSSSN | PUSH 0 (number of string substitutions) | |
217 | NSTTSSSN | JSR > 1000 (printf) | |
218 | NSTTSSSSN | JSR > 10000 (random) | |
219 | SSSTSSSSSSSSSSTTN | PUSH 0x1003 (ptr to number of tunnels per room) | |
220 | TSTT | MODULO | |
221 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location) | |
222 | TTT | LOAD | |
223 | NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination) | |
224 | NSNTSTSSSTTSSSSSSSSN | JMP > 10100011 00000000 (valid room number) | |
225 | NSSVTSTSSSTTSSSSSTTSN | MARK: 10100011 00000110 (no bats in new room) | |
226 | NTN | RTS | |
227 | ||
f0e3023d AT |
228 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
229 | @ Name: | |
230 | @ move_or_shoot | |
231 | @ Description: | |
232 | @ Parse user input, branching to the appropriate subroutine to move or shoot. | |
233 | @ This function does not perform any boundary checks/limits. | |
234 | @ Call Stack: | |
235 | @ <empty> | |
236 | @ Return Stack: | |
237 | @ <empty> | |
238 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
239 | #include <stdio.pvvs> | |
00ec7afc | 240 | #include <string.pvvs> |
f0e3023d AT |
241 | NSSVTSTSSSTSN | MARK: 10100010 (move_or_shoot) |
242 | ||
00ec7afc AT |
243 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (buffer address) |
244 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (buffer size) | |
245 | NSTTSSSTSN | JSR > 100010 (get_user_string) | |
f0e3023d AT |
246 | |
247 | @ Examine the first character of the user input buffer for 'm' or 's'. | |
248 | @ If character is something else, prompt user to try again. | |
249 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
250 | TTT | LOAD | |
251 | SSSSTTSTTSTN | PUSH 109 (ASCII 'm') | |
252 | TSST | SUBTRACT | |
253 | NTSTSTSSSTSSSSSSSSSN | BRZ > 10100010 00000000 (move) | |
254 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
255 | TTT | LOAD | |
256 | SSSSTTTSSTTN | PUSH 115 (ASCII 's') | |
257 | TSST | SUBTRACT | |
258 | NTSTSTSSSTSSSSSSSSTN | BRZ > 10100010 00000001 (shoot) | |
259 | NSTTTTTTTTTSSSSTSSSN | JSR > 11111111 00001000 (problem_with_input) | |
260 | SSSSN | PUSH 0 (number of string substitutions) | |
261 | NSTTSSSN | JSR > 1000 (printf) | |
262 | NSNTSTSSSTSN | JMP > 10100010 (move_or_shoot) | |
263 | ||
264 | @ User typed 'm' | |
265 | NSSVTSTSSSTSSSSSSSSSN | MARK: 10100010 00000000 (move) | |
28a945f7 | 266 | NSTTSTSSSTTN | JSR > 10100011 (move_player) |
f0e3023d AT |
267 | NTN | RTS |
268 | ||
269 | @ User typed 's' | |
270 | NSSVTSTSSSTSSSSSSSSTN | MARK: 10100010 00000001 (shoot) | |
271 | @ TODO: JSR shoot | |
272 | NTN | RTS | |
273 | ||
2da74194 AT |
274 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
275 | @ Name: | |
276 | @ get_answer | |
277 | @ Description: | |
278 | @ Parse user input, returning 0 if user string started with 'n' or 1 if 'y'. | |
279 | @ This function does not perform any boundary checks/limits. | |
280 | @ Call Stack: | |
281 | @ <empty> | |
282 | @ Return Stack: | |
283 | @ (1 or 0 for True/False) <--- TOS | |
284 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
285 | #include <stdio.pvvs> | |
00ec7afc | 286 | #include <string.pvvs> |
2da74194 AT |
287 | NSSVTSSTTSSSN | MARK: 10011000 (get_answer) |
288 | ||
289 | @ TODO: Consider extending the GETCHAR instruction in VVS to indicate an empty | |
290 | @ buffer instead of blocking. This would allow a character by character | |
291 | @ check without printing a slew of retry messages if the buffer is | |
292 | @ non-empty. | |
00ec7afc AT |
293 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (buffer address) |
294 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (buffer size) | |
295 | NSTTSSSTSN | JSR > 100010 (get_user_string) | |
2da74194 AT |
296 | |
297 | @ Examine the first character of the user input buffer for 'y' or 'n'. | |
298 | @ If character is something else, prompt user to try again. | |
299 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
300 | TTT | LOAD | |
301 | SSSSTTTTSSTN | PUSH 121 (ASCII 'y') | |
302 | TSST | SUBTRACT | |
303 | NTSTSSTTSSSSSSSSSSSN | BRZ > 10011000 00000000 (answer: yes) | |
304 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
305 | TTT | LOAD | |
306 | SSSSTTSTTTSN | PUSH 110 (ASCII 'n') | |
307 | TSST | SUBTRACT | |
308 | NTSTSSTTSSSSSSSSSSTN | BRZ > 10011000 00000001 (answer: no) | |
f0e3023d | 309 | NSTTTTTTTTTSSSSTSSSN | JSR > 11111111 00001000 (problem_with_input) |
2da74194 AT |
310 | SSSSN | PUSH 0 (number of string substitutions) |
311 | NSTTSSSN | JSR > 1000 (printf) | |
312 | NSNTSSTTSSSN | JMP > 10011000 (get_answer) | |
313 | ||
314 | @ User typed 'y' | |
315 | NSSVTSSTTSSSSSSSSSSSN | MARK: 10011000 00000000 (answer: yes) | |
316 | SSSTN | PUSH 1 | |
317 | NTN | RTS | |
318 | ||
319 | @ User typed 'n' | |
320 | NSSVTSSTTSSSSSSSSSSTN | MARK: 10011000 00000001 (answer: no) | |
321 | SSSSN | PUSH 0 | |
322 | NTN | RTS | |
323 | ||
2da74194 AT |
324 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
325 | @ Name: | |
326 | @ print_cave_description | |
327 | @ Description: | |
328 | @ Prints information about the cave (number of rooms, etc). | |
329 | @ Call Stack: | |
330 | @ <empty> | |
331 | @ Return Stack: | |
332 | @ <empty> | |
333 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
334 | #include <stdio.pvvs> | |
335 | NSSVTSSTTSTTN | MARK: 10011011 (print_cave_description) | |
336 | NSTTTTTTTTTSSSSTSTSN | JSR > 11111111 00001010 (cave_description) | |
337 | SSSTSSSSSSSSSTSTN | PUSH 0x1005 (number_of_arrows address) | |
338 | TTT | LOAD | |
339 | SSSTSSSSSSSSSSSTN | PUSH 0x1001 (number_of_pits address) | |
340 | TTT | LOAD | |
341 | SSSTSSSSSSSSSSTSN | PUSH 0x1002 (number_of_bats address) | |
342 | TTT | LOAD | |
343 | SSSTSSSSSSSSSSTTN | PUSH 0x1003 (number_of_tunnels address) | |
344 | TTT | LOAD | |
345 | SSSTSSSSSSSSSSSSN | PUSH 0x1000 (number_of_rooms address) | |
346 | TTT | LOAD | |
347 | SSSTSTN | PUSH 5 (number of substitions) | |
348 | NSTTSSSN | JSR > 1000 (printf) | |
349 | NTN | RTS | |
350 | ||
351 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
352 | @ Name: | |
353 | @ print_room_stats | |
354 | @ Description: | |
355 | @ Prints information about current room and hints about nearby rooms. | |
356 | @ Call Stack: | |
357 | @ <empty> | |
358 | @ Return Stack: | |
359 | @ <empty> | |
360 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
361 | #include <wump_game.pvvs> | |
362 | #include <stdio.pvvs> | |
363 | #include <stack.pvvs> | |
364 | NSSVTSTSSSSTN | MARK: 10100001 (print_room_stats) | |
365 | ||
366 | @ Print location and arrow quantity remaining. | |
367 | A"You are in room %u of the cave and have %u arrows remaining.\n" | |
368 | SSSTSSSSSSSSSTSTN | PUSH 0x1005 (number_of_arrows address) | |
369 | TTT | LOAD | |
370 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address) | |
371 | TTT | LOAD | |
372 | SSSTSN | PUSH 2 (number of substitutions) | |
373 | NSTTSSSN | JSR > 1000 (printf) | |
374 | ||
375 | @ Print if bats/pits/wumpus nearby. | |
376 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address) | |
377 | TTT | LOAD | |
378 | SNS | DUP | |
379 | NSTTSSTTTSSN | JSR > 10011100 (are_bats_near) | |
380 | NTSTSTSSSSTSSSSSSSSN | BRZ > 10100001 00000000 (no_bats) | |
381 | A"*rustle* (Bats must be nearby.)\n" | |
382 | SSSSN | PUSH 0 (number of substitutions) | |
383 | NSTTSSSN | JSR > 1000 (printf) | |
384 | NSSVTSTSSSSTSSSSSSSSN | MARK: 10100001 00000000 (no_bats) | |
385 | SNS | DUP | |
386 | NSTTSSTTTSTN | JSR > 10011101 (are_pits_near) | |
387 | NTSTSTSSSSTSSSSSSSTN | BRZ > 10100001 00000001 (no_pits) | |
388 | A"*whoosh* (You feel a draft from nearby pits.)\n" | |
389 | SSSSN | PUSH 0 (number of substitutions) | |
390 | NSTTSSSN | JSR > 1000 (printf) | |
391 | NSSVTSTSSSSTSSSSSSSTN | MARK: 10100001 00000001 (no_pits) | |
392 | NSTTSSTTTTSN | JSR > 10011110 (is_wumpus_near) | |
393 | NTSTSTSSSSTSSSSSSTSN | BRZ > 10100001 00000010 (no_wumpus) | |
394 | A"*sniff* (You smell the evil Wumpus nearby!)\n" | |
395 | SSSSN | PUSH 0 (number of substitutions) | |
396 | NSTTSSSN | JSR > 1000 (printf) | |
397 | NSSVTSTSSSSTSSSSSSTSN | MARK: 10100001 00000010 (no_wumpus) | |
398 | ||
399 | @ Print a list of nearby rooms. | |
400 | A"This room contains tunnels to the following rooms:" | |
401 | SSSSN | PUSH 0 (number of substitutions) | |
402 | NSTTSSSN | JSR > 1000 (printf) | |
403 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address) | |
404 | TTT | LOAD | |
405 | SSSTSSSSSSSSSSTTN | PUSH 0x1003 (number_of_links_per_room address) | |
406 | TTT | LOAD | |
407 | SSSTN | PUSH 1 | |
408 | TSST | SUBTRACT | |
409 | @ Print one room on each pass through this loop. | |
410 | @ TOS> tunnel_index, room_number | |
411 | NSSVTSTSSSSTSSSSSSTTN | MARK: 10100001 00000011 (print_room_list_loop) | |
412 | A" %u" | |
413 | SSSTSTN | PUSH 5 | |
414 | NSTTTSSN | JSR > 1100 (deepdup) | |
415 | SSSTTTN | PUSH 7 | |
416 | NSTTTSSN | JSR > 1100 (deepdup) | |
417 | NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination) | |
418 | SSSTN | PUSH 1 (number of substitutions) | |
419 | NSTTSSSN | JSR > 1000 (printf) | |
420 | @ Test for end of loop | |
421 | SNS | DUP | |
422 | NTSTSTSSSSTSSSSSTSSN | BRZ > 10100001 00000100 (print_room_list_loop_end) | |
423 | SSSTN | PUSH 1 | |
424 | TSST | SUBTRACT | |
425 | NSNTSTSSSSTSSSSSSTTN | JMP > 10100001 00000011 (print_room_list_loop) | |
426 | @ Clean up and return. | |
427 | NSSVTSTSSSSTSSSSSTSSN | MARK: 10100001 00000100 (print_room_list_loop_end) | |
428 | SSSTSTSN | PUSH 10 (ASCII '\n') | |
429 | TNSS | PUTCHAR | |
430 | SNN | DROP | |
431 | SNN | DROP | |
432 | NTN | RTS | |
433 | ||
434 | #endif |