Added ability for player to move around the tunnels in Wumpus.
[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
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>
72NSSVTSTSSTSSN | MARK: 10100100 (is_room_adjacent)
73
74SSSTSSSSSSSSSSTTN | PUSH 0x1003 (ptr to number_of_tunnels_per_room)
75TTT | LOAD
76SSSTN | PUSH +1
77TSST | SUBTRACT
78
79@ TOS> tunnel_index, destination_room_num
80NSSVTSTSSTSSSSSSSSSSN | MARK: 10100100 00000000 (is_room_adjacent:main_loop)
81SSSTSN | PUSH +2
82NSTTTSSN | JSR > 1100 (deepdup)
83SSSTSN | PUSH +2
84NSTTTSSN | JSR > 1100 (deepdup)
85SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player_location)
86TTT | LOAD
87NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination)
88TSST | SUBTRACT
89NTSTSTSSTSSSSSSSSSTN | BRZ > 10100100 00000001 (is_room_adjacent:found_tunnel)
90SSSTN | PUSH +1
91TSST | SUBTRACT
92SNS | DUP
93NTTTSTSSTSSSSSSSSTSN | BMI > 10100100 00000010 (is_room_adjacent:no_match)
94NSNTSTSSTSSSSSSSSSSN | JMP > 10100100 00000000 (is_room_adjacent:main_loop)
95
96NSSVTSTSSTSSSSSSSSSTN | MARK: 10100100 00000001 (is_room_adjacent:found_tunnel)
97SNN | DROP
98SNN | DROP
99SSSTN | PUSH +1
100NTN | RTS
101
102NSSVTSTSSTSSSSSSSSTSN | MARK: 10100100 00000010 (is_room_adjacent:no_match)
103SNN | DROP
104SNN | DROP
105SSSSN | PUSH 0
106NTN | 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>
122NSSVTSTSSSTTN | MARK: 10100011 (move_player)
123
124A"To which room do you wish to move?\n"
125SSSSN | PUSH 0 (number of string substitutions)
126NSTTSSSN | JSR > 1000 (printf)
127NSTTSSTTSSTN | JSR > 10011001 (get_line)
128SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address)
129NSTTTSSSSN | JSR > 110000 (atoi)
130SNN | DROP
131
132@ The desired room number is now on the TOS. Verify that it is valid.
133SNS | DUP
134NSTTSTSSTSSN | JSR > 10100100 (is_room_adjacent)
135NTSTSTSSSTTSSSSSSSTN | BRZ > 10100011 00000001 (invalid room number)
136NSNTSTSSSTTSSSSSSSSN | JMP > 10100011 00000000 (valid room number)
137
138NSSVTSTSSSTTSSSSSSSTN | MARK: 10100011 00000001 (invalid room number)
139@ TOS> room_number
140SNN | DROP
141A"*Oof!* (you hit the wall)\n"
142SSSSN | PUSH 0 (number of string substitutions)
143NSTTSSSN | JSR > 1000 (printf)
144NSTTSSSSN | JSR > 10000 (random)
145SSSTTSN | PUSH 6 (chance)
146TSTT | MODULO
147NTSTSTSSSTTSSSSSSTSN | BRZ > 10100011 00000010 (woke the wumpus)
148NTN | RTS
149NSSVTSTSSSTTSSSSSSTSN | MARK: 10100011 00000010 (woke the wumpus)
150A"Your colorful comments awaken the wumpus!\n"
151SSSSN | PUSH 0 (number of string substitutions)
152NSTTSSSN | JSR > 1000 (printf)
153NSTTSSSSN | JSR > 10000 (random)
154SSSTSSSSSSSSSSTTN | PUSH 0x1003 (ptr to number of tunnels per room)
155TSTT | MODULO
156SSSTSSSSSSSSSTTTN | PUSH 0x1007 (ptr to wumpus location)
157TTT | LOAD
158NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination)
159SSSTSSSSSSSSSTTTN | PUSH 0x1007 (ptr to wumpus location)
160SNT | SWAP
161TTS | STORE
162SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location)
163TTT | LOAD
164NSTTSTSSSSSN | JSR > 10100000 (room_has_wumpus)
165NTSTSTSSSTTSSSSSSTTN | BRZ > 10100011 00000011 (wumpus did not move to player)
166NSTTTTTTTTTSSSSSSSSN | JSR > 11111111 00000000 (wump_kill)
167SSSSN | PUSH 0 (number of string substitutions)
168NSTTSSSN | JSR > 1000 (printf)
169NNN | DIE
170NSSVTSTSSSTTSSSSSSTTN | MARK: 10100011 00000011 (wumpus did not move to player)
171NTN | RTS
172
173NSSVTSTSSSTTSSSSSSSSN | MARK: 10100011 00000000 (valid room number)
174@ TOS> room_number
175@ Move player to new room
176SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location)
177SNT | SWAP
178TTS | STORE
179@ Check for wumpus in new player location
180SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location)
181TTT | LOAD
182NSTTSTSSSSSN | JSR > 10100000 (room_has_wumpus)
183NTSTSTSSSTTSSSSSTSSN | BRZ > 10100011 00000100 (no wumpus in new room)
184NSTTTTTTTTTSSSSSSSSN | JSR > 11111111 00000000 (wump_kill)
185SSSSN | PUSH 0 (number of string substitutions)
186NSTTSSSN | JSR > 1000 (printf)
187NNN | DIE
188NSSVTSTSSSTTSSSSSTSSN | MARK: 10100011 00000100 (no wumpus in new room)
189@ Check for pits in new player location
190SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location)
191TTT | LOAD
192NSTTSSSTTSTN | JSR > 10001101 (room_has_pits)
193NTSTSTSSSTTSSSSSTSTN | BRZ > 10100011 00000101 (no pits in new room)
194NSTTSSSSN | JSR > 10000 (random)
195SSSTTSN | PUSH 6 (chance)
196TSTT | MODULO
197NTSTSTSSSTTSSSSSTTSN | BRZ > 10100011 00000110 (survived the pits)
198NSTTTTTTTTTSSSSSTSTN | JSR > 11111111 00000101 (pit_kill)
199SSSSN | PUSH 0 (number of string substitutions)
200NSTTSSSN | JSR > 1000 (printf)
201NNN | DIE
202NSSVTSTSSSTTSSSSSTTSN | MARK: 10100011 00000110 (survived the pits)
203NSTTTTTTTTTSSSSSTTSN | JSR > 11111111 00000110 (pit_survive)
204SSSSN | PUSH 0 (number of string substitutions)
205NSTTSSSN | JSR > 1000 (printf)
206NSSVTSTSSSTTSSSSSTSTN | MARK: 10100011 00000101 (no pits in new room)
207@ Check for bats in new player location
208SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location)
209TTT | LOAD
210NSTTSSSTTSSN | JSR > 10001100 (room_has_bats)
211NTSTSTSSSTTSSSSSTTSN | BRZ > 10100011 00000110 (no bats in new room)
212A"*flap* *flap* *flap* (humongous bats pick you up and move you!)\n"
213SSSSN | PUSH 0 (number of string substitutions)
214NSTTSSSN | JSR > 1000 (printf)
215NSTTSSSSN | JSR > 10000 (random)
216SSSTSSSSSSSSSSTTN | PUSH 0x1003 (ptr to number of tunnels per room)
217TSTT | MODULO
218SSSTSSSSSSSSSTTSN | PUSH 0x1006 (ptr to player location)
219TTT | LOAD
220NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination)
221NSNTSTSSSTTSSSSSSSSN | JMP > 10100011 00000000 (valid room number)
222NSSVTSTSSSTTSSSSSTTSN | MARK: 10100011 00000110 (no bats in new room)
223NTN | 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>
237NSSVTSTSSSTSN | MARK: 10100010 (move_or_shoot)
238
239NSTTSSTTSSTN | 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.
243SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address)
244TTT | LOAD
245SSSSTTSTTSTN | PUSH 109 (ASCII 'm')
246TSST | SUBTRACT
247NTSTSTSSSTSSSSSSSSSN | BRZ > 10100010 00000000 (move)
248SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address)
249TTT | LOAD
250SSSSTTTSSTTN | PUSH 115 (ASCII 's')
251TSST | SUBTRACT
252NTSTSTSSSTSSSSSSSSTN | BRZ > 10100010 00000001 (shoot)
253NSTTTTTTTTTSSSSTSSSN | JSR > 11111111 00001000 (problem_with_input)
254SSSSN | PUSH 0 (number of string substitutions)
255NSTTSSSN | JSR > 1000 (printf)
256NSNTSTSSSTSN | JMP > 10100010 (move_or_shoot)
257
258@ User typed 'm'
259NSSVTSTSSSTSSSSSSSSSN | MARK: 10100010 00000000 (move)
28a945f7 260NSTTSTSSSTTN | JSR > 10100011 (move_player)
f0e3023d
AT
261NTN | RTS
262
263@ User typed 's'
264NSSVTSTSSSTSSSSSSSSTN | MARK: 10100010 00000001 (shoot)
265@ TODO: JSR shoot
266NTN | 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>
280NSSVTSSTTSSSN | 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.
286NSTTSSTTSSTN | 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.
290SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address)
291TTT | LOAD
292SSSSTTTTSSTN | PUSH 121 (ASCII 'y')
293TSST | SUBTRACT
294NTSTSSTTSSSSSSSSSSSN | BRZ > 10011000 00000000 (answer: yes)
295SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address)
296TTT | LOAD
297SSSSTTSTTTSN | PUSH 110 (ASCII 'n')
298TSST | SUBTRACT
299NTSTSSTTSSSSSSSSSSTN | BRZ > 10011000 00000001 (answer: no)
f0e3023d 300NSTTTTTTTTTSSSSTSSSN | JSR > 11111111 00001000 (problem_with_input)
2da74194
AT
301SSSSN | PUSH 0 (number of string substitutions)
302NSTTSSSN | JSR > 1000 (printf)
303NSNTSSTTSSSN | JMP > 10011000 (get_answer)
304
305@ User typed 'y'
306NSSVTSSTTSSSSSSSSSSSN | MARK: 10011000 00000000 (answer: yes)
307SSSTN | PUSH 1
308NTN | RTS
309
310@ User typed 'n'
311NSSVTSSTTSSSSSSSSSSTN | MARK: 10011000 00000001 (answer: no)
312SSSSN | PUSH 0
313NTN | 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@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
327NSSVTSSTTSSTN | 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.
331SSSTTSSSSSSSSSSSSN | PUSH 0x3000 (USER_INPUT_BUFFER address)
332NSSVTSSTTSSTSSSSSSSSN | MARK: 10011001 00000000 (input loop)
333SNS | DUP
334SNS | DUP
335TNTS | GETCHAR
336TTT | LOAD
337SNS | DUP
338TNSS | PUTCHAR
339SSSTSTSN | PUSH 10 (ASCII '\n')
340TSST | SUBTRACT
341NTSTSSTTSSTSSSSSSSTN | BRZ > 10011001 00000001 (input loop:terminate)
342@ Character was not ENTER. Increment buffer pointer and loop again.
343SSSTN | PUSH 1
344TSSS | ADD
345NSNTSSTTSSTSSSSSSSSN | JMP > 10011001 00000000 (input loop)
346@ Character was ENTER. Overwrite the line feed with a null term and return.
347NSSVTSSTTSSTSSSSSSSTN | MARK: 10011001 00000001 (input loop:terminate)
348SSSSN | PUSH 0 (ASCII '\0')
349TTS | STORE
350NTN | 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>
363NSSVTSSTTSTTN | MARK: 10011011 (print_cave_description)
364NSTTTTTTTTTSSSSTSTSN | JSR > 11111111 00001010 (cave_description)
365SSSTSSSSSSSSSTSTN | PUSH 0x1005 (number_of_arrows address)
366TTT | LOAD
367SSSTSSSSSSSSSSSTN | PUSH 0x1001 (number_of_pits address)
368TTT | LOAD
369SSSTSSSSSSSSSSTSN | PUSH 0x1002 (number_of_bats address)
370TTT | LOAD
371SSSTSSSSSSSSSSTTN | PUSH 0x1003 (number_of_tunnels address)
372TTT | LOAD
373SSSTSSSSSSSSSSSSN | PUSH 0x1000 (number_of_rooms address)
374TTT | LOAD
375SSSTSTN | PUSH 5 (number of substitions)
376NSTTSSSN | JSR > 1000 (printf)
377NTN | 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>
392NSSVTSTSSSSTN | MARK: 10100001 (print_room_stats)
393
394@ Print location and arrow quantity remaining.
395A"You are in room %u of the cave and have %u arrows remaining.\n"
396SSSTSSSSSSSSSTSTN | PUSH 0x1005 (number_of_arrows address)
397TTT | LOAD
398SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address)
399TTT | LOAD
400SSSTSN | PUSH 2 (number of substitutions)
401NSTTSSSN | JSR > 1000 (printf)
402
403@ Print if bats/pits/wumpus nearby.
404SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address)
405TTT | LOAD
406SNS | DUP
407NSTTSSTTTSSN | JSR > 10011100 (are_bats_near)
408NTSTSTSSSSTSSSSSSSSN | BRZ > 10100001 00000000 (no_bats)
409A"*rustle* (Bats must be nearby.)\n"
410SSSSN | PUSH 0 (number of substitutions)
411NSTTSSSN | JSR > 1000 (printf)
412NSSVTSTSSSSTSSSSSSSSN | MARK: 10100001 00000000 (no_bats)
413SNS | DUP
414NSTTSSTTTSTN | JSR > 10011101 (are_pits_near)
415NTSTSTSSSSTSSSSSSSTN | BRZ > 10100001 00000001 (no_pits)
416A"*whoosh* (You feel a draft from nearby pits.)\n"
417SSSSN | PUSH 0 (number of substitutions)
418NSTTSSSN | JSR > 1000 (printf)
419NSSVTSTSSSSTSSSSSSSTN | MARK: 10100001 00000001 (no_pits)
420NSTTSSTTTTSN | JSR > 10011110 (is_wumpus_near)
421NTSTSTSSSSTSSSSSSTSN | BRZ > 10100001 00000010 (no_wumpus)
422A"*sniff* (You smell the evil Wumpus nearby!)\n"
423SSSSN | PUSH 0 (number of substitutions)
424NSTTSSSN | JSR > 1000 (printf)
425NSSVTSTSSSSTSSSSSSTSN | MARK: 10100001 00000010 (no_wumpus)
426
427@ Print a list of nearby rooms.
428A"This room contains tunnels to the following rooms:"
429SSSSN | PUSH 0 (number of substitutions)
430NSTTSSSN | JSR > 1000 (printf)
431SSSTSSSSSSSSSTTSN | PUSH 0x1006 (player_location address)
432TTT | LOAD
433SSSTSSSSSSSSSSTTN | PUSH 0x1003 (number_of_links_per_room address)
434TTT | LOAD
435SSSTN | PUSH 1
436TSST | SUBTRACT
437@ Print one room on each pass through this loop.
438@ TOS> tunnel_index, room_number
439NSSVTSTSSSSTSSSSSSTTN | MARK: 10100001 00000011 (print_room_list_loop)
440A" %u"
441SSSTSTN | PUSH 5
442NSTTTSSN | JSR > 1100 (deepdup)
443SSSTTTN | PUSH 7
444NSTTTSSN | JSR > 1100 (deepdup)
445NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination)
446SSSTN | PUSH 1 (number of substitutions)
447NSTTSSSN | JSR > 1000 (printf)
448@ Test for end of loop
449SNS | DUP
450NTSTSTSSSSTSSSSSTSSN | BRZ > 10100001 00000100 (print_room_list_loop_end)
451SSSTN | PUSH 1
452TSST | SUBTRACT
453NSNTSTSSSSTSSSSSSTTN | JMP > 10100001 00000011 (print_room_list_loop)
454@ Clean up and return.
455NSSVTSTSSSSTSSSSSTSSN | MARK: 10100001 00000100 (print_room_list_loop_end)
456SSSTSTSN | PUSH 10 (ASCII '\n')
457TNSS | PUTCHAR
458SNN | DROP
459SNN | DROP
460NTN | RTS
461
462#endif