Replaced RNG with Xorshift implementation from Wikipedia.
[vvhitespace] / examples / wump / wump_ui.pvvs
CommitLineData
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>
21NSSVTSSSSSTTN | MARK: 10000011 (seed_rng)
22
23SSSTSSSSN | PUSH 16 (loop counter)
24SSSSN | PUSH 0 (rng seed)
25
26NSSVTSSSSSTTSSSSSSSSN | MARK: 10000011 00000000 (seed_rng:main loop)
27@ Get character from user and print ASCII '.' as feedback.
28SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address)
29TNTS | GETCHAR
30SSSTSTTTSN | PUSH ASCII '.'
31TNSS | PUTCHAR
32@ Left shift the seed by 4 bits.
33SSSTSSN | PUSH 4 (shift count)
34NSTTSTTSTN | JSR > 101101 (lshift)
35@ XOR seed with character from user.
36SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address)
37TTT | LOAD
38NSTTSTSTTN | JSR > 101011 (xor)
39@ Decrement counter
40SNT | SWAP
41SSSTN | PUSH +1
42TSST | SUBTRACT
43@ Test for loop completion
44SNS | DUP
45NTSTSSSSSTTSSSSSSSTN | BRZ > 10000011 00000001 (seed_rng:cleanup and return)
46SNT | SWAP
47NSNTSSSSSTTSSSSSSSSN | JMP > 10000011 00000000 (seed_rng:main loop)
48
49@ Store seed, clean up and return.
50NSSVTSSSSSTTSSSSSSSTN | MARK: 10000011 00000001 (seed_rng:cleanup and return)
51SNN | DROP
52SSSSN | PUSH 0 (seed address)
53SNT | SWAP
54TTS | STORE
55SSSTSTSN | PUSH ASCII '\n'
56SSSTSTSN | PUSH ASCII '\n'
57TNSS | PUTCHAR
58TNSS | PUTCHAR
59NTN | 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>
73NSSVTSSTTSSSN | 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.
79NSTTSSTTSSTN | 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.
83SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address)
84TTT | LOAD
85SSSSTTTTSSTN | PUSH 121 (ASCII 'y')
86TSST | SUBTRACT
87NTSTSSTTSSSSSSSSSSSN | BRZ > 10011000 00000000 (answer: yes)
88SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address)
89TTT | LOAD
90SSSSTTSTTTSN | PUSH 110 (ASCII 'n')
91TSST | SUBTRACT
92NTSTSSTTSSSSSSSSSSTN | BRZ > 10011000 00000001 (answer: no)
93NSTTTTTTTTTSSSSTSSSN | JSR > 11111111 00001000 (problem_with_yes_no_answer)
94SSSSN | PUSH 0 (number of string substitutions)
95NSTTSSSN | JSR > 1000 (printf)
96NSNTSSTTSSSN | JMP > 10011000 (get_answer)
97
98@ User typed 'y'
99NSSVTSSTTSSSSSSSSSSSN | MARK: 10011000 00000000 (answer: yes)
100SSSTN | PUSH 1
101NTN | RTS
102
103@ User typed 'n'
104NSSVTSSTTSSSSSSSSSSTN | MARK: 10011000 00000001 (answer: no)
105SSSSN | PUSH 0
106NTN | 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@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
120NSSVTSSTTSSTN | 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.
124SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address)
125NSSVTSSTTSSTSSSSSSSSN | MARK: 10011001 00000000 (input loop)
126SNS | DUP
127SNS | DUP
128TNTS | GETCHAR
129TTT | LOAD
130SNS | DUP
131TNSS | PUTCHAR
132SSSTSTSN | PUSH 10 (ASCII '\n')
133TSST | SUBTRACT
134NTSTSSTTSSTSSSSSSSTN | BRZ > 10011001 00000001 (input loop:terminate)
135@ Character was not ENTER. Increment buffer pointer and loop again.
136SSSTN | PUSH 1
137TSSS | ADD
138NSNTSSTTSSTSSSSSSSSN | JMP > 10011001 00000000 (input loop)
139@ Character was ENTER. Overwrite the line feed with a null term and return.
140NSSVTSSTTSSTSSSSSSSTN | MARK: 10011001 00000001 (input loop:terminate)
141SSSSN | PUSH 0 (ASCII '\0')
142TTS | STORE
143NTN | 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>
156NSSVTSSTTSTTN | MARK: 10011011 (print_cave_description)
157NSTTTTTTTTTSSSSTSTSN | JSR > 11111111 00001010 (cave_description)
158SSSTSSSSSSSSSTSTN | PUSH 0x1005 (number_of_arrows address)
159TTT | LOAD
160SSSTSSSSSSSSSSSTN | PUSH 0x1001 (number_of_pits address)
161TTT | LOAD
162SSSTSSSSSSSSSSTSN | PUSH 0x1002 (number_of_bats address)
163TTT | LOAD
164SSSTSSSSSSSSSSTTN | PUSH 0x1003 (number_of_tunnels address)
165TTT | LOAD
166SSSTSSSSSSSSSSSSN | PUSH 0x1000 (number_of_rooms address)
167TTT | LOAD
168SSSTSTN | PUSH 5 (number of substitions)
169NSTTSSSN | JSR > 1000 (printf)
170NTN | 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>
185NSSVTSTSSSSTN | MARK: 10100001 (print_room_stats)
186
187@ Print location and arrow quantity remaining.
188A"You are in room %u of the cave and have %u arrows remaining.\n"
189SSSTSSSSSSSSSTSTN | PUSH 0x1005 (number_of_arrows address)
190TTT | LOAD
191SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address)
192TTT | LOAD
193SSSTSN | PUSH 2 (number of substitutions)
194NSTTSSSN | JSR > 1000 (printf)
195
196@ Print if bats/pits/wumpus nearby.
197SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address)
198TTT | LOAD
199SNS | DUP
200NSTTSSTTTSSN | JSR > 10011100 (are_bats_near)
201NTSTSTSSSSTSSSSSSSSN | BRZ > 10100001 00000000 (no_bats)
202A"*rustle* (Bats must be nearby.)\n"
203SSSSN | PUSH 0 (number of substitutions)
204NSTTSSSN | JSR > 1000 (printf)
205NSSVTSTSSSSTSSSSSSSSN | MARK: 10100001 00000000 (no_bats)
206SNS | DUP
207NSTTSSTTTSTN | JSR > 10011101 (are_pits_near)
208NTSTSTSSSSTSSSSSSSTN | BRZ > 10100001 00000001 (no_pits)
209A"*whoosh* (You feel a draft from nearby pits.)\n"
210SSSSN | PUSH 0 (number of substitutions)
211NSTTSSSN | JSR > 1000 (printf)
212NSSVTSTSSSSTSSSSSSSTN | MARK: 10100001 00000001 (no_pits)
213NSTTSSTTTTSN | JSR > 10011110 (is_wumpus_near)
214NTSTSTSSSSTSSSSSSTSN | BRZ > 10100001 00000010 (no_wumpus)
215A"*sniff* (You smell the evil Wumpus nearby!)\n"
216SSSSN | PUSH 0 (number of substitutions)
217NSTTSSSN | JSR > 1000 (printf)
218NSSVTSTSSSSTSSSSSSTSN | MARK: 10100001 00000010 (no_wumpus)
219
220@ Print a list of nearby rooms.
221A"This room contains tunnels to the following rooms:"
222SSSSN | PUSH 0 (number of substitutions)
223NSTTSSSN | JSR > 1000 (printf)
224SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address)
225TTT | LOAD
226SSSTSSSSSSSSSSTTN | PUSH 0x1003 (number_of_links_per_room address)
227TTT | LOAD
228SSSTN | PUSH 1
229TSST | SUBTRACT
230@ Print one room on each pass through this loop.
231@ TOS> tunnel_index, room_number
232NSSVTSTSSSSTSSSSSSTTN | MARK: 10100001 00000011 (print_room_list_loop)
233A" %u"
234SSSTSTN | PUSH 5
235NSTTTSSN | JSR > 1100 (deepdup)
236SSSTTTN | PUSH 7
237NSTTTSSN | JSR > 1100 (deepdup)
238NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination)
239SSSTN | PUSH 1 (number of substitutions)
240NSTTSSSN | JSR > 1000 (printf)
241@ Test for end of loop
242SNS | DUP
243NTSTSTSSSSTSSSSSTSSN | BRZ > 10100001 00000100 (print_room_list_loop_end)
244SSSTN | PUSH 1
245TSST | SUBTRACT
246NSNTSTSSSSTSSSSSSTTN | JMP > 10100001 00000011 (print_room_list_loop)
247@ Clean up and return.
248NSSVTSTSSSSTSSSSSTSSN | MARK: 10100001 00000100 (print_room_list_loop_end)
249SSSTSTSN | PUSH 10 (ASCII '\n')
250TNSS | PUTCHAR
251SNN | DROP
252SNN | DROP
253NTN | RTS
254
255#endif