7d85f8d362c0e8cfa6402a33ade3470fd9cf3a25
[vvhitespace] / examples / hunt-the-wumpus / wump_game.pvvs
#ifndef WUMP_GAME
#define WUMP_GAME
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ (c) 2019 Aaron Taylor <ataylor at subgeniuskitty dot com>
@ See LICENSE.txt file for copyright and license details.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Name:
@ get_tunnel_destination
@ Description:
@ Returns the room number corresponding to the destination of a tunnel
@ specified by room and slot.
@ Call Stack:
@ slot
@ room_number <-- TOS
@ Return Stack:
@ dst_room_number <-- TOS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTSSSTSSSN | MARK: 10001000 (get_tunnel_destination)
@ The pointer we seek is:
@ (room_number * room_struct_size) + 2 + slot + ROOM_DATA_BASE
@ Where the '+2' accounts for the pit and bat booleans.
NSTTSSSTSTTN | JSR > 10001011 (get_room_struct_size)
TSSN | MULTIPLY
SSSTSN | PUSH +2
TSSS | ADD
TSSS | ADD
SSSTSSSSSSSSSSSSSN | PUSH 0x2000 (ROOM_DATA_BASE address)
TSSS | ADD
TTT | LOAD
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Name:
@ get_room_struct_size
@ Description:
@ Returns the size in words of the data structure for a single room.
@ For example, with 3 links plus bat and pit booleans, the size is 5 words.
@ Call Stack:
@ <empty>
@ Return Stack:
@ size <-- TOS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTSSSTSTTN | MARK: 10001011 (get_room_struct_size)
SSSTSSSSSSSSSSTTN | PUSH 0x1003 (GAME_DATA_BASE+3 = links_per_room address)
TTT | LOAD
SSSTSN | PUSH +2
TSSS | ADD
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Name:
@ room_has_bats
@ Description:
@ Check if room_number contains bats.
@ Returns 1 or 0 representing true or false.
@ Call Stack:
@ room_number <-- TOS
@ Return Stack:
@ 1 or 0 <-- TOS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTSSSTTSSN | MARK: 10001100 (room_has_bats)
@ We seek the pointer:
@ (room_number * room_struct_size) + 1 + ROOM_DATA_BASE
@ where '+1' accounts for the offset of the bat boolean in the desired room.
NSTTSSSTSTTN | JSR > 10001011 (get_room_struct_size)
TSSN | MULTIPLY
SSSTN | PUSH +1
TSSS | ADD
SSSTSSSSSSSSSSSSSN | PUSH 0x2000 (GAME_DATA_BASE address)
TSSS | ADD
TTT | LOAD
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Name:
@ room_has_pits
@ Description:
@ Check if room_number contains pits.
@ Returns 1 or 0 representing true or false.
@ Call Stack:
@ room_number <-- TOS
@ Return Stack:
@ 1 or 0 <-- TOS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTSSSTTSTN | MARK: 10001101 (room_has_pits)
@ We seek the pointer:
@ (room_number * room_struct_size) + 0 + ROOM_DATA_BASE
@ where '+0' accounts for the offset of the pit boolean in the desired room.
NSTTSSSTSTTN | JSR > 10001011 (get_room_struct_size)
TSSN | MULTIPLY
SSSTSSSSSSSSSSSSSN | PUSH 0x2000 (GAME_DATA_BASE address)
TSSS | ADD
TTT | LOAD
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Name:
@ room_has_wumpus
@ Description:
@ Check if room contains wumpus.
@ Returns 1 or 0 representing true or false.
@ Call Stack:
@ room_number <-- TOS
@ Return Stack:
@ 1 or 0 <-- TOS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTSTSSSSSN | MARK: 10100000 (room_has_wumpus)
SSSTSSSSSSSSSTTTN | PUSH 0x1007 (wumpus_location address)
TTT | LOAD
TSST | SUBTRACT
NTSTSTSSSSSSSSSSSSSN | BRZ > 10100000 00000000 (room_has_wumpus:true)
SSSSN | PUSH 0 (false)
NTN | RTS
NSSVTSTSSSSSSSSSSSSSN | MARK: 10100000 00000000 (room_has_wumpus:true)
SSSTN | PUSH 1 (true)
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Name:
@ are_bats_near
@ Description:
@ Given a room number, checks rooms within one hop for bats.
@ Returns 1 if bats are present or 0 if no bats.
@ Call Stack:
@ room_number <-- TOS
@ Return Stack:
@ 1 or 0 <-- TOS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <stack.pvvs>
NSSVTSSTTTSSN | MARK: 10011100 (are_bats_near)
@ Prepare the stack by loading the number of links per room and decrementing.
@ We will loop until this reaches 0 or we find bats.
SSSTSSSSSSSSSSTTN | PUSH 0x1003 (number_of_links_per_room address)
TTT | LOAD
SSSTN | PUSH 1
TSST | SUBTRACT
@ Check one nearby room on each pass through this loop.
@ TOS> tunnel_index, room_number
NSSVTSSTTTSSSSSSSSSSN | MARK: 10011100 00000000 (are_bats_near:loop)
SNS | DUP
SSSTTN | PUSH 3
NSTTTSSN | JSR > 1100 (deepdup)
NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination)
NSTTSSSTTSSN | JSR > 10001100 (room_has_bats)
NTSTSSTTTSSSSSSSSSTN | BRZ > 10011100 00000001 (no_bats_in_this_room)
@ Found bats. Clean up and return.
SNN | DROP
SNN | DROP
SSSTN | PUSH 1
NTN | RTS
NSSVTSSTTTSSSSSSSSSTN | MARK: 10011100 00000001 (no_bats_in_this_room)
@ Test for end of loop.
SNS | DUP
NTSTSSTTTSSSSSSSSTSN | BRZ > 10011100 00000010 (are_bats_near:loop_end)
@ No bats found yet, but still need to check some rooms.
@ Decrement tunnel index and loop again.
SSSTN | PUSH 1
TSST | SUBTRACT
NSNTSSTTTSSSSSSSSSSN | JMP > 10011100 00000000 (are_bats_near:loop)
@ No bats found in nearby rooms. Clean up and return.
NSSVTSSTTTSSSSSSSSTSN | MARK: 10011100 00000010 (are_bats_near:loop_end)
SNN | DROP
SNN | DROP
SSSSN | PUSH 0
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Name:
@ are_pits_near
@ Description:
@ Given a room number, checks rooms within one hop for pits.
@ Returns 1 if pits are present or 0 if no pits.
@ Call Stack:
@ room_number <-- TOS
@ Return Stack:
@ 1 or 0 <-- TOS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <stack.pvvs>
NSSVTSSTTTSTN | MARK: 10011101 (are_pits_near)
@ Prepare the stack by loading the number of links per room and decrementing.
@ We will loop until this reaches 0 or we find pits.
SSSTSSSSSSSSSSTTN | PUSH 0x1003 (number_of_links_per_room address)
TTT | LOAD
SSSTN | PUSH 1
TSST | SUBTRACT
@ Check one nearby room on each pass through this loop.
@ TOS> tunnel_index, room_number
NSSVTSSTTTSTSSSSSSSSN | MARK: 10011101 00000000 (are_pits_near:loop)
SNS | DUP
SSSTTN | PUSH 3
NSTTTSSN | JSR > 1100 (deepdup)
NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination)
NSTTSSSTTSTN | JSR > 10001101 (room_has_pits)
NTSTSSTTTSTSSSSSSSTN | BRZ > 10011101 00000001 (no_pits_in_this_room)
@ Found pits. Clean up and return.
SNN | DROP
SNN | DROP
SSSTN | PUSH 1
NTN | RTS
NSSVTSSTTTSTSSSSSSSTN | MARK: 10011101 00000001 (no_pits_in_this_room)
@ Test for end of loop.
SNS | DUP
NTSTSSTTTSTSSSSSSTSN | BRZ > 10011101 00000010 (are_pits_near:loop_end)
@ No pits found yet, but still need to check some rooms.
@ Decrement tunnel index and loop again.
SSSTN | PUSH 1
TSST | SUBTRACT
NSNTSSTTTSTSSSSSSSSN | JMP > 10011101 00000000 (are_pits_near:loop)
@ No pits found in nearby rooms. Clean up and return.
NSSVTSSTTTSTSSSSSSTSN | MARK: 10011101 00000010 (are_pits_near:loop_end)
SNN | DROP
SNN | DROP
SSSSN | PUSH 0
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Name:
@ is_wumpus_very_near
@ Description:
@ Given a room number, checks rooms within one hop for the wumpus.
@ Returns 1 if wumpus is present, otherwise 0.
@ Call Stack:
@ room_number <-- TOS
@ Return Stack:
@ 1 or 0 <-- TOS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <stack.pvvs>
NSSVTSSTTTTTN | MARK: 10011111 (is_wumpus_very_near)
@ Prepare the stack by loading the number of links per room and decrementing.
@ We will loop until this reaches 0 or we find the wumpus.
SSSTSSSSSSSSSSTTN | PUSH 0x1003 (number_of_links_per_room address)
TTT | LOAD
SSSTN | PUSH 1
TSST | SUBTRACT
@ Check one nearby room on each pass through this loop.
@ TOS> tunnel_index, room_number
NSSVTSSTTTTTSSSSSSSSN | MARK: 10011111 00000000 (is_wumpus_very_near:loop)
SNS | DUP
SSSTTN | PUSH 3
NSTTTSSN | JSR > 1100 (deepdup)
NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination)
NSTTSTSSSSSN | JSR > 10100000 (room_has_wumpus)
NTSTSSTTTTTSSSSSSSTN | BRZ > 10011111 00000001 (no_wumpus_in_this_room)
@ Found wumpus. Clean up and return.
SNN | DROP
SNN | DROP
SSSTN | PUSH 1
NTN | RTS
NSSVTSSTTTTTSSSSSSSTN | MARK: 10011111 00000001 (no_wumpus_in_this_room)
@ Test for end of loop.
SNS | DUP
NTSTSSTTTTTSSSSSSTSN | BRZ > 10011111 00000010 (is_wumpus_very_near:loop_end)
@ No wumpus found yet, but still need to check some rooms.
@ Decrement tunnel index and loop again.
SSSTN | PUSH 1
TSST | SUBTRACT
NSNTSSTTTTTSSSSSSSSN | JMP > 10011111 00000000 (is_wumpus_very_near:loop)
@ No wumpus found in nearby rooms. Clean up and return.
NSSVTSSTTTTTSSSSSSTSN | MARK: 10011111 00000010 (is_wumpus_very_near:loop_end)
SNN | DROP
SNN | DROP
SSSSN | PUSH 0
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Name:
@ is_wumpus_near
@ Description:
@ Given a room number, checks rooms within two hops for the wumpus.
@ Returns 1 if wumpus is present, otherwise 0.
@ Call Stack:
@ room_number <-- TOS
@ Return Stack:
@ 1 or 0 <-- TOS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <stack.pvvs>
NSSVTSSTTTTSN | MARK: 10011110 (is_wumpus_near)
@ Prepare the stack by loading the number of links per room and decrementing.
@ We will loop until this reaches 0 or we find the wumpus.
SSSTSSSSSSSSSSTTN | PUSH 0x1003 (number_of_links_per_room address)
TTT | LOAD
SSSTN | PUSH 1
TSST | SUBTRACT
@ Check one nearby room and its connecting rooms on each pass through this loop.
@ TOS> tunnel_index, room_number
NSSVTSSTTTTSSSSSSSSSN | MARK: 10011110 00000000 (is_wumpus_near:loop)
SNS | DUP
SSSTTN | PUSH 3
NSTTTSSN | JSR > 1100 (deepdup)
NSTTSSSTSSSN | JSR > 10001000 (get_tunnel_destination)
@ TOS> tunnel_endpoint, tunnel_index, room_number
SNS | DUP
NSTTSTSSSSSN | JSR > 10100000 (room_has_wumpus)
SSSTN | PUSH 1
TSST | SUBTRACT
NTSTSSTTTTSSSSSSSTTN | BRZ > 10011110 00000011 (found_wumpus_one_hop)
NSTTSSTTTTTN | JSR > 10011111 (is_wumpus_very_near)
SSSTN | PUSH 1
TSST | SUBTRACT
NTSTSSTTTTSSSSSSTSSN | BRZ > 10011110 00000100 (found_wumpus_two_hops)
@ Test for end of loop.
SNS | DUP
NTSTSSTTTTSSSSSSSTSN | BRZ > 10011110 00000010 (is_wumpus_near:loop_end)
@ No wumpus found yet, but still need to check some rooms.
@ Decrement tunnel index and loop again.
SSSTN | PUSH 1
TSST | SUBTRACT
NSNTSSTTTTSSSSSSSSSN | JMP > 10011110 00000000 (is_wumpus_near:loop)
@ No wumpus found in nearby rooms. Clean up and return.
NSSVTSSTTTTSSSSSSSTSN | MARK: 10011110 00000010 (is_wumpus_near:loop_end)
SNN | DROP
SNN | DROP
SSSSN | PUSH 0
NTN | RTS
@ Found wumpus. Clean up and return.
NSSVTSSTTTTSSSSSSSTTN | MARK: 10011110 00000011 (found_wumpus_one_hop)
SNN | DROP
NSSVTSSTTTTSSSSSSTSSN | MARK: 10011110 00000100 (found_wumpus_two_hops)
SNN | DROP
SNN | DROP
SSSTN | PUSH 1
NTN | RTS
#endif