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> | |
122 | NSSVTSTSSSTTN | MARK: 10100011 (move_player) | |
123 | ||
124 | A"To which room do you wish to move?\n" | |
125 | SSSSN | PUSH 0 (number of string substitutions) | |
126 | NSTTSSSN | JSR > 1000 (printf) | |
127 | NSTTSSTTSSTN | JSR > 10011001 (get_line) | |
128 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
129 | NSTTTSSSSN | JSR > 110000 (atoi) | |
130 | SNN | DROP | |
131 | ||
132 | @ The desired room number is now on the TOS. Verify that it is valid. | |
133 | SNS | DUP | |
134 | NSTTSTSSTSSN | JSR > 10100100 (is_room_adjacent) | |
135 | NTSTSTSSSTTSSSSSSSTN | BRZ > 10100011 00000001 (invalid room number) | |
136 | NSNTSTSSSTTSSSSSSSSN | JMP > 10100011 00000000 (valid room number) | |
137 | ||
138 | NSSVTSTSSSTTSSSSSSSTN | MARK: 10100011 00000001 (invalid room number) | |
139 | @ TOS> room_number | |
140 | SNN | DROP | |
141 | A"*Oof!* (you hit the wall)\n" | |
142 | SSSSN | PUSH 0 (number of string substitutions) | |
143 | NSTTSSSN | JSR > 1000 (printf) | |
144 | NSTTSSSSN | JSR > 10000 (random) | |
145 | SSSTTSN | PUSH 6 (chance) | |
146 | TSTT | MODULO | |
147 | NTSTSTSSSTTSSSSSSTSN | BRZ > 10100011 00000010 (woke the wumpus) | |
148 | NTN | RTS | |
149 | NSSVTSTSSSTTSSSSSSTSN | MARK: 10100011 00000010 (woke the wumpus) | |
150 | A"Your colorful comments awaken the wumpus!\n" | |
151 | SSSSN | PUSH 0 (number of string substitutions) | |
152 | NSTTSSSN | JSR > 1000 (printf) | |
153 | NSTTSSSSN | JSR > 10000 (random) | |
154 | SSSTSSSSSSSSSSTTN | PUSH 0x1003 (ptr to number of tunnels per room) | |
155 | TSTT | MODULO | |
156 | SSSTSSSSSSSSSTTTN | PUSH 0x1007 (ptr to wumpus location) | |
157 | TTT | LOAD | |
158 | NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination) | |
159 | SSSTSSSSSSSSSTTTN | PUSH 0x1007 (ptr to wumpus location) | |
160 | SNT | SWAP | |
161 | TTS | STORE | |
162 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location) | |
163 | TTT | LOAD | |
164 | NSTTSTSSSSSN | JSR > 10100000 (room_has_wumpus) | |
165 | NTSTSTSSSTTSSSSSSTTN | BRZ > 10100011 00000011 (wumpus did not move to player) | |
166 | NSTTTTTTTTTSSSSSSSSN | JSR > 11111111 00000000 (wump_kill) | |
167 | SSSSN | PUSH 0 (number of string substitutions) | |
168 | NSTTSSSN | JSR > 1000 (printf) | |
169 | NNN | DIE | |
170 | NSSVTSTSSSTTSSSSSSTTN | MARK: 10100011 00000011 (wumpus did not move to player) | |
171 | NTN | RTS | |
172 | ||
173 | NSSVTSTSSSTTSSSSSSSSN | MARK: 10100011 00000000 (valid room number) | |
174 | @ TOS> room_number | |
175 | @ Move player to new room | |
176 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location) | |
177 | SNT | SWAP | |
178 | TTS | STORE | |
179 | @ Check for wumpus in new player location | |
180 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location) | |
181 | TTT | LOAD | |
182 | NSTTSTSSSSSN | JSR > 10100000 (room_has_wumpus) | |
183 | NTSTSTSSSTTSSSSSTSSN | BRZ > 10100011 00000100 (no wumpus in new room) | |
184 | NSTTTTTTTTTSSSSSSSSN | JSR > 11111111 00000000 (wump_kill) | |
185 | SSSSN | PUSH 0 (number of string substitutions) | |
186 | NSTTSSSN | JSR > 1000 (printf) | |
187 | NNN | DIE | |
188 | NSSVTSTSSSTTSSSSSTSSN | MARK: 10100011 00000100 (no wumpus in new room) | |
189 | @ Check for pits in new player location | |
190 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location) | |
191 | TTT | LOAD | |
192 | NSTTSSSTTSTN | JSR > 10001101 (room_has_pits) | |
193 | NTSTSTSSSTTSSSSSTSTN | BRZ > 10100011 00000101 (no pits in new room) | |
194 | NSTTSSSSN | JSR > 10000 (random) | |
195 | SSSTTSN | PUSH 6 (chance) | |
196 | TSTT | MODULO | |
197 | NTSTSTSSSTTSSSSSTTSN | BRZ > 10100011 00000110 (survived the pits) | |
198 | NSTTTTTTTTTSSSSSTSTN | JSR > 11111111 00000101 (pit_kill) | |
199 | SSSSN | PUSH 0 (number of string substitutions) | |
200 | NSTTSSSN | JSR > 1000 (printf) | |
201 | NNN | DIE | |
202 | NSSVTSTSSSTTSSSSSTTSN | MARK: 10100011 00000110 (survived the pits) | |
203 | NSTTTTTTTTTSSSSSTTSN | JSR > 11111111 00000110 (pit_survive) | |
204 | SSSSN | PUSH 0 (number of string substitutions) | |
205 | NSTTSSSN | JSR > 1000 (printf) | |
206 | NSSVTSTSSSTTSSSSSTSTN | MARK: 10100011 00000101 (no pits in new room) | |
207 | @ Check for bats in new player location | |
208 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location) | |
209 | TTT | LOAD | |
210 | NSTTSSSTTSSN | JSR > 10001100 (room_has_bats) | |
211 | NTSTSTSSSTTSSSSSTTSN | BRZ > 10100011 00000110 (no bats in new room) | |
212 | A"*flap* *flap* *flap* (humongous bats pick you up and move you!)\n" | |
213 | SSSSN | PUSH 0 (number of string substitutions) | |
214 | NSTTSSSN | JSR > 1000 (printf) | |
215 | NSTTSSSSN | JSR > 10000 (random) | |
216 | SSSTSSSSSSSSSSTTN | PUSH 0x1003 (ptr to number of tunnels per room) | |
217 | TSTT | MODULO | |
218 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location) | |
219 | TTT | LOAD | |
220 | NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination) | |
221 | NSNTSTSSSTTSSSSSSSSN | JMP > 10100011 00000000 (valid room number) | |
222 | NSSVTSTSSSTTSSSSSTTSN | MARK: 10100011 00000110 (no bats in new room) | |
223 | NTN | RTS | |
224 | ||
f0e3023d AT |
225 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
226 | @ Name: | |
227 | @ move_or_shoot | |
228 | @ Description: | |
229 | @ Parse user input, branching to the appropriate subroutine to move or shoot. | |
230 | @ This function does not perform any boundary checks/limits. | |
231 | @ Call Stack: | |
232 | @ <empty> | |
233 | @ Return Stack: | |
234 | @ <empty> | |
235 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
236 | #include <stdio.pvvs> | |
237 | NSSVTSTSSSTSN | MARK: 10100010 (move_or_shoot) | |
238 | ||
239 | NSTTSSTTSSTN | JSR > 10011001 (get_line) | |
240 | ||
241 | @ Examine the first character of the user input buffer for 'm' or 's'. | |
242 | @ If character is something else, prompt user to try again. | |
243 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
244 | TTT | LOAD | |
245 | SSSSTTSTTSTN | PUSH 109 (ASCII 'm') | |
246 | TSST | SUBTRACT | |
247 | NTSTSTSSSTSSSSSSSSSN | BRZ > 10100010 00000000 (move) | |
248 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
249 | TTT | LOAD | |
250 | SSSSTTTSSTTN | PUSH 115 (ASCII 's') | |
251 | TSST | SUBTRACT | |
252 | NTSTSTSSSTSSSSSSSSTN | BRZ > 10100010 00000001 (shoot) | |
253 | NSTTTTTTTTTSSSSTSSSN | JSR > 11111111 00001000 (problem_with_input) | |
254 | SSSSN | PUSH 0 (number of string substitutions) | |
255 | NSTTSSSN | JSR > 1000 (printf) | |
256 | NSNTSTSSSTSN | JMP > 10100010 (move_or_shoot) | |
257 | ||
258 | @ User typed 'm' | |
259 | NSSVTSTSSSTSSSSSSSSSN | MARK: 10100010 00000000 (move) | |
28a945f7 | 260 | NSTTSTSSSTTN | JSR > 10100011 (move_player) |
f0e3023d AT |
261 | NTN | RTS |
262 | ||
263 | @ User typed 's' | |
264 | NSSVTSTSSSTSSSSSSSSTN | MARK: 10100010 00000001 (shoot) | |
265 | @ TODO: JSR shoot | |
266 | NTN | RTS | |
267 | ||
2da74194 AT |
268 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
269 | @ Name: | |
270 | @ get_answer | |
271 | @ Description: | |
272 | @ Parse user input, returning 0 if user string started with 'n' or 1 if 'y'. | |
273 | @ This function does not perform any boundary checks/limits. | |
274 | @ Call Stack: | |
275 | @ <empty> | |
276 | @ Return Stack: | |
277 | @ (1 or 0 for True/False) <--- TOS | |
278 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
279 | #include <stdio.pvvs> | |
280 | NSSVTSSTTSSSN | MARK: 10011000 (get_answer) | |
281 | ||
282 | @ TODO: Consider extending the GETCHAR instruction in VVS to indicate an empty | |
283 | @ buffer instead of blocking. This would allow a character by character | |
284 | @ check without printing a slew of retry messages if the buffer is | |
285 | @ non-empty. | |
286 | NSTTSSTTSSTN | JSR > 10011001 (get_line) | |
287 | ||
288 | @ Examine the first character of the user input buffer for 'y' or 'n'. | |
289 | @ If character is something else, prompt user to try again. | |
290 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
291 | TTT | LOAD | |
292 | SSSSTTTTSSTN | PUSH 121 (ASCII 'y') | |
293 | TSST | SUBTRACT | |
294 | NTSTSSTTSSSSSSSSSSSN | BRZ > 10011000 00000000 (answer: yes) | |
295 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
296 | TTT | LOAD | |
297 | SSSSTTSTTTSN | PUSH 110 (ASCII 'n') | |
298 | TSST | SUBTRACT | |
299 | NTSTSSTTSSSSSSSSSSTN | BRZ > 10011000 00000001 (answer: no) | |
f0e3023d | 300 | NSTTTTTTTTTSSSSTSSSN | JSR > 11111111 00001000 (problem_with_input) |
2da74194 AT |
301 | SSSSN | PUSH 0 (number of string substitutions) |
302 | NSTTSSSN | JSR > 1000 (printf) | |
303 | NSNTSSTTSSSN | JMP > 10011000 (get_answer) | |
304 | ||
305 | @ User typed 'y' | |
306 | NSSVTSSTTSSSSSSSSSSSN | MARK: 10011000 00000000 (answer: yes) | |
307 | SSSTN | PUSH 1 | |
308 | NTN | RTS | |
309 | ||
310 | @ User typed 'n' | |
311 | NSSVTSSTTSSSSSSSSSSTN | MARK: 10011000 00000001 (answer: no) | |
312 | SSSSN | PUSH 0 | |
313 | NTN | RTS | |
314 | ||
315 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
316 | @ Name: | |
317 | @ get_line | |
318 | @ Description: | |
319 | @ Read one line of user input and store in buffer. | |
320 | @ Appends null terminator to end of string. | |
321 | @ This function does not perform any boundary checks/limits. | |
322 | @ Call Stack: | |
323 | @ <empty> | |
324 | @ Return Stack: | |
325 | @ <empty> | |
326 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
327 | NSSVTSSTTSSTN | MARK: 10011001 (get_line) | |
328 | ||
329 | @ Get one character from user on each pass through this loop. | |
330 | @ Terminate loop when line break character is received. | |
331 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
332 | NSSVTSSTTSSTSSSSSSSSN | MARK: 10011001 00000000 (input loop) | |
333 | SNS | DUP | |
334 | SNS | DUP | |
335 | TNTS | GETCHAR | |
336 | TTT | LOAD | |
337 | SNS | DUP | |
338 | TNSS | PUTCHAR | |
339 | SSSTSTSN | PUSH 10 (ASCII '\n') | |
340 | TSST | SUBTRACT | |
341 | NTSTSSTTSSTSSSSSSSTN | BRZ > 10011001 00000001 (input loop:terminate) | |
342 | @ Character was not ENTER. Increment buffer pointer and loop again. | |
343 | SSSTN | PUSH 1 | |
344 | TSSS | ADD | |
345 | NSNTSSTTSSTSSSSSSSSN | JMP > 10011001 00000000 (input loop) | |
346 | @ Character was ENTER. Overwrite the line feed with a null term and return. | |
347 | NSSVTSSTTSSTSSSSSSSTN | MARK: 10011001 00000001 (input loop:terminate) | |
348 | SSSSN | PUSH 0 (ASCII '\0') | |
349 | TTS | STORE | |
350 | NTN | RTS | |
351 | ||
352 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
353 | @ Name: | |
354 | @ print_cave_description | |
355 | @ Description: | |
356 | @ Prints information about the cave (number of rooms, etc). | |
357 | @ Call Stack: | |
358 | @ <empty> | |
359 | @ Return Stack: | |
360 | @ <empty> | |
361 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
362 | #include <stdio.pvvs> | |
363 | NSSVTSSTTSTTN | MARK: 10011011 (print_cave_description) | |
364 | NSTTTTTTTTTSSSSTSTSN | JSR > 11111111 00001010 (cave_description) | |
365 | SSSTSSSSSSSSSTSTN | PUSH 0x1005 (number_of_arrows address) | |
366 | TTT | LOAD | |
367 | SSSTSSSSSSSSSSSTN | PUSH 0x1001 (number_of_pits address) | |
368 | TTT | LOAD | |
369 | SSSTSSSSSSSSSSTSN | PUSH 0x1002 (number_of_bats address) | |
370 | TTT | LOAD | |
371 | SSSTSSSSSSSSSSTTN | PUSH 0x1003 (number_of_tunnels address) | |
372 | TTT | LOAD | |
373 | SSSTSSSSSSSSSSSSN | PUSH 0x1000 (number_of_rooms address) | |
374 | TTT | LOAD | |
375 | SSSTSTN | PUSH 5 (number of substitions) | |
376 | NSTTSSSN | JSR > 1000 (printf) | |
377 | NTN | RTS | |
378 | ||
379 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
380 | @ Name: | |
381 | @ print_room_stats | |
382 | @ Description: | |
383 | @ Prints information about current room and hints about nearby rooms. | |
384 | @ Call Stack: | |
385 | @ <empty> | |
386 | @ Return Stack: | |
387 | @ <empty> | |
388 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
389 | #include <wump_game.pvvs> | |
390 | #include <stdio.pvvs> | |
391 | #include <stack.pvvs> | |
392 | NSSVTSTSSSSTN | MARK: 10100001 (print_room_stats) | |
393 | ||
394 | @ Print location and arrow quantity remaining. | |
395 | A"You are in room %u of the cave and have %u arrows remaining.\n" | |
396 | SSSTSSSSSSSSSTSTN | PUSH 0x1005 (number_of_arrows address) | |
397 | TTT | LOAD | |
398 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address) | |
399 | TTT | LOAD | |
400 | SSSTSN | PUSH 2 (number of substitutions) | |
401 | NSTTSSSN | JSR > 1000 (printf) | |
402 | ||
403 | @ Print if bats/pits/wumpus nearby. | |
404 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address) | |
405 | TTT | LOAD | |
406 | SNS | DUP | |
407 | NSTTSSTTTSSN | JSR > 10011100 (are_bats_near) | |
408 | NTSTSTSSSSTSSSSSSSSN | BRZ > 10100001 00000000 (no_bats) | |
409 | A"*rustle* (Bats must be nearby.)\n" | |
410 | SSSSN | PUSH 0 (number of substitutions) | |
411 | NSTTSSSN | JSR > 1000 (printf) | |
412 | NSSVTSTSSSSTSSSSSSSSN | MARK: 10100001 00000000 (no_bats) | |
413 | SNS | DUP | |
414 | NSTTSSTTTSTN | JSR > 10011101 (are_pits_near) | |
415 | NTSTSTSSSSTSSSSSSSTN | BRZ > 10100001 00000001 (no_pits) | |
416 | A"*whoosh* (You feel a draft from nearby pits.)\n" | |
417 | SSSSN | PUSH 0 (number of substitutions) | |
418 | NSTTSSSN | JSR > 1000 (printf) | |
419 | NSSVTSTSSSSTSSSSSSSTN | MARK: 10100001 00000001 (no_pits) | |
420 | NSTTSSTTTTSN | JSR > 10011110 (is_wumpus_near) | |
421 | NTSTSTSSSSTSSSSSSTSN | BRZ > 10100001 00000010 (no_wumpus) | |
422 | A"*sniff* (You smell the evil Wumpus nearby!)\n" | |
423 | SSSSN | PUSH 0 (number of substitutions) | |
424 | NSTTSSSN | JSR > 1000 (printf) | |
425 | NSSVTSTSSSSTSSSSSSTSN | MARK: 10100001 00000010 (no_wumpus) | |
426 | ||
427 | @ Print a list of nearby rooms. | |
428 | A"This room contains tunnels to the following rooms:" | |
429 | SSSSN | PUSH 0 (number of substitutions) | |
430 | NSTTSSSN | JSR > 1000 (printf) | |
431 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address) | |
432 | TTT | LOAD | |
433 | SSSTSSSSSSSSSSTTN | PUSH 0x1003 (number_of_links_per_room address) | |
434 | TTT | LOAD | |
435 | SSSTN | PUSH 1 | |
436 | TSST | SUBTRACT | |
437 | @ Print one room on each pass through this loop. | |
438 | @ TOS> tunnel_index, room_number | |
439 | NSSVTSTSSSSTSSSSSSTTN | MARK: 10100001 00000011 (print_room_list_loop) | |
440 | A" %u" | |
441 | SSSTSTN | PUSH 5 | |
442 | NSTTTSSN | JSR > 1100 (deepdup) | |
443 | SSSTTTN | PUSH 7 | |
444 | NSTTTSSN | JSR > 1100 (deepdup) | |
445 | NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination) | |
446 | SSSTN | PUSH 1 (number of substitutions) | |
447 | NSTTSSSN | JSR > 1000 (printf) | |
448 | @ Test for end of loop | |
449 | SNS | DUP | |
450 | NTSTSTSSSSTSSSSSTSSN | BRZ > 10100001 00000100 (print_room_list_loop_end) | |
451 | SSSTN | PUSH 1 | |
452 | TSST | SUBTRACT | |
453 | NSNTSTSSSSTSSSSSSTTN | JMP > 10100001 00000011 (print_room_list_loop) | |
454 | @ Clean up and return. | |
455 | NSSVTSTSSSSTSSSSSTSSN | MARK: 10100001 00000100 (print_room_list_loop_end) | |
456 | SSSTSTSN | PUSH 10 (ASCII '\n') | |
457 | TNSS | PUTCHAR | |
458 | SNN | DROP | |
459 | SNN | DROP | |
460 | NTN | RTS | |
461 | ||
462 | #endif |