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 | ||
f0e3023d AT |
61 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
62 | @ Name: | |
63 | @ move_or_shoot | |
64 | @ Description: | |
65 | @ Parse user input, branching to the appropriate subroutine to move or shoot. | |
66 | @ This function does not perform any boundary checks/limits. | |
67 | @ Call Stack: | |
68 | @ <empty> | |
69 | @ Return Stack: | |
70 | @ <empty> | |
71 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
72 | #include <stdio.pvvs> | |
73 | NSSVTSTSSSTSN | MARK: 10100010 (move_or_shoot) | |
74 | ||
75 | NSTTSSTTSSTN | JSR > 10011001 (get_line) | |
76 | ||
77 | @ Examine the first character of the user input buffer for 'm' or 's'. | |
78 | @ If character is something else, prompt user to try again. | |
79 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
80 | TTT | LOAD | |
81 | SSSSTTSTTSTN | PUSH 109 (ASCII 'm') | |
82 | TSST | SUBTRACT | |
83 | NTSTSTSSSTSSSSSSSSSN | BRZ > 10100010 00000000 (move) | |
84 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
85 | TTT | LOAD | |
86 | SSSSTTTSSTTN | PUSH 115 (ASCII 's') | |
87 | TSST | SUBTRACT | |
88 | NTSTSTSSSTSSSSSSSSTN | BRZ > 10100010 00000001 (shoot) | |
89 | NSTTTTTTTTTSSSSTSSSN | JSR > 11111111 00001000 (problem_with_input) | |
90 | SSSSN | PUSH 0 (number of string substitutions) | |
91 | NSTTSSSN | JSR > 1000 (printf) | |
92 | NSNTSTSSSTSN | JMP > 10100010 (move_or_shoot) | |
93 | ||
94 | @ User typed 'm' | |
95 | NSSVTSTSSSTSSSSSSSSSN | MARK: 10100010 00000000 (move) | |
96 | @ TODO: JSR move | |
97 | NTN | RTS | |
98 | ||
99 | @ User typed 's' | |
100 | NSSVTSTSSSTSSSSSSSSTN | MARK: 10100010 00000001 (shoot) | |
101 | @ TODO: JSR shoot | |
102 | NTN | RTS | |
103 | ||
2da74194 AT |
104 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
105 | @ Name: | |
106 | @ get_answer | |
107 | @ Description: | |
108 | @ Parse user input, returning 0 if user string started with 'n' or 1 if 'y'. | |
109 | @ This function does not perform any boundary checks/limits. | |
110 | @ Call Stack: | |
111 | @ <empty> | |
112 | @ Return Stack: | |
113 | @ (1 or 0 for True/False) <--- TOS | |
114 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
115 | #include <stdio.pvvs> | |
116 | NSSVTSSTTSSSN | MARK: 10011000 (get_answer) | |
117 | ||
118 | @ TODO: Consider extending the GETCHAR instruction in VVS to indicate an empty | |
119 | @ buffer instead of blocking. This would allow a character by character | |
120 | @ check without printing a slew of retry messages if the buffer is | |
121 | @ non-empty. | |
122 | NSTTSSTTSSTN | JSR > 10011001 (get_line) | |
123 | ||
124 | @ Examine the first character of the user input buffer for 'y' or 'n'. | |
125 | @ If character is something else, prompt user to try again. | |
126 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
127 | TTT | LOAD | |
128 | SSSSTTTTSSTN | PUSH 121 (ASCII 'y') | |
129 | TSST | SUBTRACT | |
130 | NTSTSSTTSSSSSSSSSSSN | BRZ > 10011000 00000000 (answer: yes) | |
131 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
132 | TTT | LOAD | |
133 | SSSSTTSTTTSN | PUSH 110 (ASCII 'n') | |
134 | TSST | SUBTRACT | |
135 | NTSTSSTTSSSSSSSSSSTN | BRZ > 10011000 00000001 (answer: no) | |
f0e3023d | 136 | NSTTTTTTTTTSSSSTSSSN | JSR > 11111111 00001000 (problem_with_input) |
2da74194 AT |
137 | SSSSN | PUSH 0 (number of string substitutions) |
138 | NSTTSSSN | JSR > 1000 (printf) | |
139 | NSNTSSTTSSSN | JMP > 10011000 (get_answer) | |
140 | ||
141 | @ User typed 'y' | |
142 | NSSVTSSTTSSSSSSSSSSSN | MARK: 10011000 00000000 (answer: yes) | |
143 | SSSTN | PUSH 1 | |
144 | NTN | RTS | |
145 | ||
146 | @ User typed 'n' | |
147 | NSSVTSSTTSSSSSSSSSSTN | MARK: 10011000 00000001 (answer: no) | |
148 | SSSSN | PUSH 0 | |
149 | NTN | RTS | |
150 | ||
151 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
152 | @ Name: | |
153 | @ get_line | |
154 | @ Description: | |
155 | @ Read one line of user input and store in buffer. | |
156 | @ Appends null terminator to end of string. | |
157 | @ This function does not perform any boundary checks/limits. | |
158 | @ Call Stack: | |
159 | @ <empty> | |
160 | @ Return Stack: | |
161 | @ <empty> | |
162 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
163 | NSSVTSSTTSSTN | MARK: 10011001 (get_line) | |
164 | ||
165 | @ Get one character from user on each pass through this loop. | |
166 | @ Terminate loop when line break character is received. | |
167 | SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address) | |
168 | NSSVTSSTTSSTSSSSSSSSN | MARK: 10011001 00000000 (input loop) | |
169 | SNS | DUP | |
170 | SNS | DUP | |
171 | TNTS | GETCHAR | |
172 | TTT | LOAD | |
173 | SNS | DUP | |
174 | TNSS | PUTCHAR | |
175 | SSSTSTSN | PUSH 10 (ASCII '\n') | |
176 | TSST | SUBTRACT | |
177 | NTSTSSTTSSTSSSSSSSTN | BRZ > 10011001 00000001 (input loop:terminate) | |
178 | @ Character was not ENTER. Increment buffer pointer and loop again. | |
179 | SSSTN | PUSH 1 | |
180 | TSSS | ADD | |
181 | NSNTSSTTSSTSSSSSSSSN | JMP > 10011001 00000000 (input loop) | |
182 | @ Character was ENTER. Overwrite the line feed with a null term and return. | |
183 | NSSVTSSTTSSTSSSSSSSTN | MARK: 10011001 00000001 (input loop:terminate) | |
184 | SSSSN | PUSH 0 (ASCII '\0') | |
185 | TTS | STORE | |
186 | NTN | RTS | |
187 | ||
188 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
189 | @ Name: | |
190 | @ print_cave_description | |
191 | @ Description: | |
192 | @ Prints information about the cave (number of rooms, etc). | |
193 | @ Call Stack: | |
194 | @ <empty> | |
195 | @ Return Stack: | |
196 | @ <empty> | |
197 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
198 | #include <stdio.pvvs> | |
199 | NSSVTSSTTSTTN | MARK: 10011011 (print_cave_description) | |
200 | NSTTTTTTTTTSSSSTSTSN | JSR > 11111111 00001010 (cave_description) | |
201 | SSSTSSSSSSSSSTSTN | PUSH 0x1005 (number_of_arrows address) | |
202 | TTT | LOAD | |
203 | SSSTSSSSSSSSSSSTN | PUSH 0x1001 (number_of_pits address) | |
204 | TTT | LOAD | |
205 | SSSTSSSSSSSSSSTSN | PUSH 0x1002 (number_of_bats address) | |
206 | TTT | LOAD | |
207 | SSSTSSSSSSSSSSTTN | PUSH 0x1003 (number_of_tunnels address) | |
208 | TTT | LOAD | |
209 | SSSTSSSSSSSSSSSSN | PUSH 0x1000 (number_of_rooms address) | |
210 | TTT | LOAD | |
211 | SSSTSTN | PUSH 5 (number of substitions) | |
212 | NSTTSSSN | JSR > 1000 (printf) | |
213 | NTN | RTS | |
214 | ||
215 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
216 | @ Name: | |
217 | @ print_room_stats | |
218 | @ Description: | |
219 | @ Prints information about current room and hints about nearby rooms. | |
220 | @ Call Stack: | |
221 | @ <empty> | |
222 | @ Return Stack: | |
223 | @ <empty> | |
224 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
225 | #include <wump_game.pvvs> | |
226 | #include <stdio.pvvs> | |
227 | #include <stack.pvvs> | |
228 | NSSVTSTSSSSTN | MARK: 10100001 (print_room_stats) | |
229 | ||
230 | @ Print location and arrow quantity remaining. | |
231 | A"You are in room %u of the cave and have %u arrows remaining.\n" | |
232 | SSSTSSSSSSSSSTSTN | PUSH 0x1005 (number_of_arrows address) | |
233 | TTT | LOAD | |
234 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address) | |
235 | TTT | LOAD | |
236 | SSSTSN | PUSH 2 (number of substitutions) | |
237 | NSTTSSSN | JSR > 1000 (printf) | |
238 | ||
239 | @ Print if bats/pits/wumpus nearby. | |
240 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address) | |
241 | TTT | LOAD | |
242 | SNS | DUP | |
243 | NSTTSSTTTSSN | JSR > 10011100 (are_bats_near) | |
244 | NTSTSTSSSSTSSSSSSSSN | BRZ > 10100001 00000000 (no_bats) | |
245 | A"*rustle* (Bats must be nearby.)\n" | |
246 | SSSSN | PUSH 0 (number of substitutions) | |
247 | NSTTSSSN | JSR > 1000 (printf) | |
248 | NSSVTSTSSSSTSSSSSSSSN | MARK: 10100001 00000000 (no_bats) | |
249 | SNS | DUP | |
250 | NSTTSSTTTSTN | JSR > 10011101 (are_pits_near) | |
251 | NTSTSTSSSSTSSSSSSSTN | BRZ > 10100001 00000001 (no_pits) | |
252 | A"*whoosh* (You feel a draft from nearby pits.)\n" | |
253 | SSSSN | PUSH 0 (number of substitutions) | |
254 | NSTTSSSN | JSR > 1000 (printf) | |
255 | NSSVTSTSSSSTSSSSSSSTN | MARK: 10100001 00000001 (no_pits) | |
256 | NSTTSSTTTTSN | JSR > 10011110 (is_wumpus_near) | |
257 | NTSTSTSSSSTSSSSSSTSN | BRZ > 10100001 00000010 (no_wumpus) | |
258 | A"*sniff* (You smell the evil Wumpus nearby!)\n" | |
259 | SSSSN | PUSH 0 (number of substitutions) | |
260 | NSTTSSSN | JSR > 1000 (printf) | |
261 | NSSVTSTSSSSTSSSSSSTSN | MARK: 10100001 00000010 (no_wumpus) | |
262 | ||
263 | @ Print a list of nearby rooms. | |
264 | A"This room contains tunnels to the following rooms:" | |
265 | SSSSN | PUSH 0 (number of substitutions) | |
266 | NSTTSSSN | JSR > 1000 (printf) | |
267 | SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address) | |
268 | TTT | LOAD | |
269 | SSSTSSSSSSSSSSTTN | PUSH 0x1003 (number_of_links_per_room address) | |
270 | TTT | LOAD | |
271 | SSSTN | PUSH 1 | |
272 | TSST | SUBTRACT | |
273 | @ Print one room on each pass through this loop. | |
274 | @ TOS> tunnel_index, room_number | |
275 | NSSVTSTSSSSTSSSSSSTTN | MARK: 10100001 00000011 (print_room_list_loop) | |
276 | A" %u" | |
277 | SSSTSTN | PUSH 5 | |
278 | NSTTTSSN | JSR > 1100 (deepdup) | |
279 | SSSTTTN | PUSH 7 | |
280 | NSTTTSSN | JSR > 1100 (deepdup) | |
281 | NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination) | |
282 | SSSTN | PUSH 1 (number of substitutions) | |
283 | NSTTSSSN | JSR > 1000 (printf) | |
284 | @ Test for end of loop | |
285 | SNS | DUP | |
286 | NTSTSTSSSSTSSSSSTSSN | BRZ > 10100001 00000100 (print_room_list_loop_end) | |
287 | SSSTN | PUSH 1 | |
288 | TSST | SUBTRACT | |
289 | NSNTSTSSSSTSSSSSSTTN | JMP > 10100001 00000011 (print_room_list_loop) | |
290 | @ Clean up and return. | |
291 | NSSVTSTSSSSTSSSSSTSSN | MARK: 10100001 00000100 (print_room_list_loop_end) | |
292 | SSSTSTSN | PUSH 10 (ASCII '\n') | |
293 | TNSS | PUTCHAR | |
294 | SNN | DROP | |
295 | SNN | DROP | |
296 | NTN | RTS | |
297 | ||
298 | #endif |