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