Trailing-Edge
-
PDP-10 Archives
-
SRI_NIC_PERM_SRC_3_19910112
-
utilities/wumpus.mid
There are no other files named wumpus.mid in the archive.
;<MRC>WUMPUS.MID;2 04-SEP-77 08:55:35 TECO'd by MRC
.SYMTAB 3500.
TITLE WUMPUS
.DECSAV
T=11
T1=12
ROOM=13
ME=14
CNT=15
P=17
WORLD: BLOCK 21. ;Holds the world
NTABLE: BLOCK 21. ;Random table of numbers
X0: BLOCK 1 ;Random # gen seed
RCOUNT: BLOCK 1 ;Random # gen counter
RANDP: BLOCK 1 ;Random # gen pointer
ARROWS: BLOCK 1 ;Number of arrows allowed
PDL: BLOCK 200 ;Push down list
DEFINE SENSE PROOM,HAZARD,ORWORD
LDB ROOM,PROOM
LDB T,HAZARD
IORM T,ORWORD
TERMIN
DEFINE SENSE3 HAZARD,ORWORD
PUSH P,ROOM
SENSE PROOM1,HAZARD,ORWORD
MOVE ROOM,(P)
SENSE PROOM2,HAZARD,ORWORD
MOVE ROOM,(P)
SENSE PROOM3,HAZARD,ORWORD
POP P, ROOM
TERMIN
;Do NOT change the order of these byte pointers:
PROOM1: 360600,,WORLD(ROOM) ;Byte pointer to first tunnel
PROOM2: 300600,,WORLD(ROOM) ;Second tunnel
PROOM3: 220600,,WORLD(ROOM) ;Third tunnel
PWUMP: 210100,,WORLD(ROOM) ;Byte pointer to wumpus bit
PBAT: 200100,,WORLD(ROOM) ;Bat bit
PPIT: 170100,,WORLD(ROOM) ;Pit bit
CRLF: ASCIZ/
/
EXPL: ASCIZ/
You are a famous hunter descending down into the caves of darkness,
lair of the famous man-eating wumpus. You are equiped with five
bent arrows, and all your senses. There are twenty caves connected
by tunnels, and there are two other kinds of hazards (three each):
a) Super-bats which if you stumble into their room will pick
you up and drop you in some random room in the network.
b) Pits, which are bottomless, and fatal to fall into.
Both are immovable.
If you end up in the same room as the wumpus, you lose.
Normally the wumpus does not move (having gorged himself upon a
previous hunter). Two things wake him up:
1) Walking into his room,
2) Shooting an arrow anywhere in the network.
If he wakes there is a 50-50 chance he will be offended by
the intrusion and leave in disgust. If he is really riled he
will eat you. He is too big to be picked up by bats, and has
sucker feet, so he doesn't fall into the pits.
You can smell the wumpus from one or two rooms away. You
can hear bats one room away, and feel drafts (from bottomless
pits) from one room away (and taste the fear...).
To shoot type S (with no carriage return) instead of a
move, and then specify a legal path of five caves for the
arrow to follow. If you guess and lose the arrow takes a
random path. Paths can be truncated by typing carriage return
instead of a room number.
Good luck hunting!!
/
BEG: RESET ;The beginning
MOVEI P, PDL
HRROI 1,[ASCIZ/Directions? (Y or N) /] ;Does he want the expl?
PSOUT
PBIN
CAIE 1,"y
CAIN 1,"Y ;Did he say yes?
JRST [HRROI 1,EXPL
PSOUT
JRST .+1]
HRROI 1,CRLF
PSOUT
PUSHJ P,NAMEF ;Fiddle with name
GTAD
HRRZM 1,X0 ;For random # gen
HRREI T,-5
MOVEM T,ARROWS ;Set up five bent arrows
SETZM RCOUNT
SETZM WORLD ;Restart the world
MOVE T,[XWD WORLD,WORLD+1]
BLT T,WORLD+20.
PUSHJ P,SETNTB ;Set up ntable
PUSHJ P,RANDOM
PUSHJ P,RANDOM
IMULI T,3
PUSH P,T
PUSHJ P,SHUFFL ;Shuffle ntable
SOSLE (P)
JRST .-2
POP P,T
MOVE T,NTABLE+20. ;Make ntable a ring
MOVEM T,NTABLE
PUSHJ P,FIRST2 ;First two tunnels per room
PUSHJ P,LAST1 ;Last one
PUSHJ P,SHUFFL ;Shuffle ntable
PUSHJ P,SHUFFL
PUSHJ P,IHZRDS ;Add hazards and me
JRST CIRCLE
NAMEF: HRROI 1,[ASCIZ/Here's the famous Wumpus hunter Major /]
PSOUT
GJINF
MOVE 2,1
MOVEI 1,101
DIRST
JRST 4,.-1
HRROI 1,[ASCIZ/ descending
into the "Caves of Darkness", lair of the deadly man-eating Wumpus.
/]
PSOUT
MOVEI 1,1000.
DISMS
HRROI 1,[ASCIZ/ Down...
/]
PSOUT
MOVEI 1,1500.
DISMS
HRROI 1,[ASCIZ/ Down...
/]
PSOUT
MOVEI 1,2000.
DISMS
HRROI 1,[ASCIZ/ Down...
/]
PSOUT
MOVEI 1,2500.
DISMS
POPJ P,
SETNTB: SETZ T, ;Set up NTABLE with 1-20
SETNT1: ADDI T,1
MOVEM T,NTABLE(T)
CAIGE T,20.
JRST SETNT1
POPJ P,
SHUFFL: MOVEI ME,1 ;Shuffle NTABLE once
SHUFF1: PUSHJ P,RANDOM ;Get random number
CAME T,ME ;If same, only two swaps
EXCH P,NTABLE(T) ;Swap NTABLE (T) with NTABLE (ME)
EXCH P,NTABLE(ME)
EXCH P,NTABLE(T)
ADDI ME,1
CAIG ME,20.
JRST SHUFF1
POPJ P,
FIRST2: MOVEI T1,1 ;Put first two tunnels in each room
FIRSTA: MOVE ROOM,NTABLE(T1) ;Get ring entry
MOVE T,NTABLE-1(T1) ;Get previous entry
DPB T,PROOM1 ;Put in one direction
EXCH T,ROOM
DPB T,PROOM2 ;Put in other
ADDI T1,1
CAIG T1,20.
JRST FIRSTA
POPJ P,
LAST1: HRREI T,-500. ;500 trys or else!!
PUSH P,T
LASTA: PUSHJ P,SHUFFL ;Shuffle NTABLE
MOVEI ROOM,1
SETZ T,
LASTA1: DPB T,PROOM3 ;Zero third tunnels
ADDI ROOM,1
CAIG ROOM,20.
JRST LASTA1
MOVEI T1,1 ;Index to NTABLE
LASTB: MOVE ROOM,NTABLE(T1)
LDB T,PROOM3
JUMPN T,LASTC1 ;If NTABLE(T1) has 3rd rm, get next t1
MOVEI ROOM,1 ;Index to world
LASTC: LDB T,PROOM3
JUMPN T,LASTD ;If third room full, next!
CAMN ROOM,NTABLE(T1) ;Is room same as NTABLE entry?
JRST LASTD ;Yep, next room
LDB T,PROOM1
CAMN T,NTABLE(T1) ;NTABLE(T1) = tunnel #1?
JRST LASTD ;Yep, next room
LDB T,PROOM2
CAMN T,NTABLE(T1) ;NTABLE(T1) = tunnel #2?
JRST LASTD ;Yep, next room
MOVE T,NTABLE(T1) ;Get room number
DPB T,PROOM3 ;Put it in world
EXCH T,ROOM
DPB T,PROOM3 ;Put in other direction
LASTC1: ADDI T1,1
CAIG T1,20. ;End of NTABLE?
JRST LASTB ;Nope, go back
POP P,T ;Get rid of counter
POPJ P,
LASTD: ADDI ROOM,1 ;Look at next room
CAIG ROOM,20. ;Looked at all?
JRST LASTC ;Nope, go back
AOSGE (P) ;Yep, count shuffles
JRST LASTA ;Shuffle and try again
HRROI 1,[ASCIZ/Can't finish tunnels. Foo!/]
ESOUT
HALTF
JRST .-1
IHZRDS: PUSHJ P,SHUFFL ;Set up hazards and me
PUSHJ P,SHUFFL
SETO T, ;Bit for marking world
MOVE ROOM,NTABLE+1 ;Wumpus goes in first room
DPB T,PWUMP
HRREI T1,-2 ;Three bats and pits
IHZRDL: MOVE ROOM,NTABLE+4(T1)
DPB T,PPIT
MOVE ROOM,NTABLE+7(T1)
DPB T,PBAT
AOJLE T1,IHZRDL
MOVE ME,NTABLE+10 ;Me
SETZ T,
MWUMP: PUSH P,ROOM ;Move the Wumpus (50% chance)
PUSH P,T ;Transparent to AC'S
PUSH P,T1
MOVEI ROOM,1
MWUMP1: LDB T,PWUMP ;Find the Wumpus first
JUMPN T,MWUMP2 ;Got him
ADDI ROOM,1
CAIG ROOM,20.
JRST MWUMP1
HRROI 1,[ASCIZ/Error @ MWUMP1/]
ESOUT
HALTF
JRST .-1
MWUMP2: PUSHJ P,RANDOM
CAILE T,10. ;50% chance of moving!
JRST MWUMPX ;Not this time
IDIVI T,3
SETZ T,
DPB T,PWUMP ;Get rid of wumpus
LDB ROOM,PROOM1 (T1) ;Get random room
SETO T,
DPB T,PWUMP ;Put Wumpus there
MWUMPX: POP P,T1
POP P,T
POP P,ROOM
POPJ P,
CIRCLE: HRROI 1,[ASCIZ/You are in room /] ;Master loop
PSOUT
MOVE T,ME
PUSHJ P,DECPNT
HRROI 1,CRLF
PSOUT
MOVE ROOM,ME
LDB T,PWUMP ;Get Wumpus bit
JUMPE T,CIRCL1 ;No Wumpus, go on
PUSHJ P,MWUMP ;He's there, to move or not to move?
CIRCLF: MOVE ROOM,ME
LDB T,PWUMP
JUMPE T,CIRCL1 ;He moved, you're safe...
HRROI 1,[ASCIZ/You were eaten by the Wumpus. You lose./]
PSOUT
HALTF
JRST .-1
CIRCL1: LDB T,PBAT
JUMPE T,CIRCL2 ;No bats, go on
HRROI 1,[ASCIZ/Bats in your room!
/]
PSOUT
PUSHJ P,RANDOM
MOVE ME,T ;Put me somewhere random.
JRST CIRCLE
CIRCL2: LDB T,PPIT
JUMPE T,CIRCL3 ;No pits, go on
HRROI 1,[ASCIZ/You fell into a pit. You lose!/]
PSOUT
HALTF
JRST .-1
CIRCL3: SETZ T1, ;Sense all around. T1 is OR-WORD
PUSHJ P,WSENSE
JRST CIRCL4
WSENSE: SENSE3 PWUMP,T1 ;Sense the world!!
POPJ P,
CIRCL4: LDB ROOM,PROOM1
PUSHJ P,WSENSE
MOVE ROOM,ME
LDB ROOM,PROOM2
PUSHJ P,WSENSE
MOVE ROOM,ME
LDB ROOM,PROOM3
PUSHJ P,WSENSE
JUMPE T1,CIRCL5 ;No smell of Wumpus, go on
HRROI 1,[ASCIZ/I smell a Wumpus.
/]
PSOUT
CIRCL5: SETZ T1, ;Clear IOR bit
MOVE ROOM,ME
SENSE3 PBAT,T1 ;Sense bats
JUMPE T1,CIRCL6 ;No bats, go on
HRROI 1,[ASCIZ/I hear squeeking.
/]
PSOUT
CIRCL6: SETZ T1, ;Clear IOR bit for pits
MOVE ROOM,ME
SENSE3 PPIT,T1
JUMPE T1,MOVE0 ;No bats, let him move.
HRROI 1,[ASCIZ/I feel a draft.
/]
PSOUT
;Move Routine: Does work related to user move.
MOVE0: HRROI 1,[ASCIZ/Tunnels to /]
PSOUT
MOVE ROOM,ME
LDB T,PROOM1
PUSHJ P,DECPNT
MOVEI 1,<" >
PBOUT
LDB T,PROOM2
PUSHJ P,DECPNT
MOVEI 1,<" >
PBOUT
LDB T,PROOM3
PUSHJ P,DECPNT
HRROI 1,CRLF
PSOUT
MOVE1: HRROI 1,[ASCIZ/Move? /] ;Demand move
PSOUT
PUSHJ P,DECIN
JRST MOVE2 ;Non-number, go check.
JUMPLE T,WHAT
CAILE T,20. ;Between 1-20?
JRST WHAT ;Nope.
MOVE T1,ME
PUSHJ P,LEGAL ;Legal move? (from T1 to T)
JRST NOTPOS ;Nope, not possible
MOVE ME,T ;Yep, make it
JRST CIRCLE ;Go back
MOVE2: CAIE T,"s
CAIN T,"S ;Only non-number is S
JRST SHOOT ;To shoot arrow.
WHAT: CAIN T,1000
JRST MOVE1
HRROI 1,[ASCIZ/What??/] ;Non-recognizable char
SKIPA
NOTPOS: HRROI 1,[ASCIZ/Not Possible!/] ;...
PSOUT
HRROI 1,CRLF
PSOUT
JRST CIRCLE
;Routine to determine if a tunnel exists tween T and T1
;SKIP RETURN = YES. Transparent to AC'S
LEGAL: PUSH P,ROOM
MOVE ROOM,T
LDB T,PROOM1
CAMN T,T1
JRST SLEGAL
LDB T,PROOM2
CAMN T,T1
JRST SLEGAL
LDB T,PROOM3
CAMN T,T1
SLEGAL: AOS -1(P) ;Yep, 's legal
MOVE T,ROOM ;Restore AC'S
POP P,ROOM
POPJ P,
;Shoot routine to handle shooting arrows.
SHOOT: HRROI 1,[ASCIZ/hoot!
/]
PSOUT
AOSLE ARROWS ;Arrows left?
JRST LOSE1 ;Nope
HRROI 1,[ASCIZ/Finish with CR.
/]
PSOUT
MOVE ROOM,ME ;Arrow starts at me
SETZM NTABLE ;To check 180 deg bounces
HRREI CNT,-5 ;Five rooms
SHOOT1: HRROI 1,[ASCIZ/Room: /] ;Get room number
PSOUT
PUSHJ P,DECIN
JRST SHOOTX ;Unrecognizable input = EXIT
JUMPE T,SHOOTX
CAILE T,20.
JRST SHOOTX ;Out of bounds = EXIT
MOVE T1,ROOM
PUSHJ P,LEGAL ;Tunnel tween T and T1?
JRST BOUNCE ;Nope, he's fishing, get him
CAMN T,NTABLE ;Does he want to do a 180?
JRST BOUNCE ;Yep, get him
MOVEM ROOM,NTABLE ;Arrow just leaving (ROOM)
PUSHJ P,MEWUMP ;Kill me or Wumpus??
AOJL CNT,SHOOT1 ;No, more arrows = go back
SHOOTX: PUSHJ P,MWUMP ;Finished, move Wumpus
JRST CIRCLF ;Go back, see if Wumpus kills, dont let
;Him move again.
BOUNCE: HRROI 1,[ASCIZ/Bounce
/] ;He tried to fool us, random arrow path.
PSOUT
PUSHJ P,RANDOM
IDIVI T,3
LDB T,PROOM1(T1) ;Get random tunnel
PUSHJ P,MEWUMP ;Kill anyone?
AOJL CNT,BOUNCE ;Continue bouncing
JRST CIRCLE
MEWUMP: CAMN ME,T ;Kill me or Wumpus?
JRST LOSE ;Yep, me
MOVE ROOM,T
LDB T,PWUMP ;Kill Wumpus?
JUMPN T,WIN ;Yep
POPJ P,
LOSE1: HRROI 1,[ASCIZ/No more arrows. You lose by default./]
PSOUT
HALTF
JRST .-1
LOSE: HRROI 1,[ASCIZ/You shot yourself./]
PSOUT
HALTF
JRST .-1
WIN: HRROI 1,[ASCIZ/You slew the Wumpus. Congratulations!!!/]
PSOUT
HALTF
JRST .-1
;DECIN inputs a decimal number. It must be terminated
;with a cr. First char if non-number gets returned with POPJ.
;Normal return is skip. Answer in T.
DECIN: MOVEI 1,100
MOVEI 3,10.
NIN
JRST [ MOVEI 1,100
BKJFN
JFCL
PBIN
CAIN 1,15
PBIN
CAIE 1,12
CAIN 1,37
JRST [MOVEI T,1000
POPJ P,]
MOVE T,1
POPJ P,] ; No number
MOVE T,2
MOVEI 1,100
BKJFN
JFCL
PBIN
CAIN 1,15
PBIN
CAIE 1,12
CAIN 1,37
CAIA
JRST DWHAT
CPOPJ1: AOS (P)
CPOPJ: POPJ P,
DWHAT: HRROI 1,[ASCIZ/What??
/]
PSOUT
JRST DECIN
;Decimal print routine. Takes argument in T
DECPNT: MOVEI 1,101
MOVE 2,T
MOVEI 3,10.
NOUT
JRST 4,.-1
POPJ P,
;Random number generator: uses formula:
; X[N+1] = ( A*X[N] + C )TAKEN MOD(M)
RANDOM: SKIPE RCOUNT ;Random # GEN (RANGE = 1-20)
JRST RAND1
AOS RCOUNT
MOVE T,X0
IMUL T,MA
ADD T,MC
IDIV T,MM
MOVEM T,X0
MOVE T,[360600,,X0]
MOVEM T,RANDP
RANDX: LDB T,RANDP
IDIVI T,20.
MOVE T,T1
ADDI T,1
POPJ P,
RAND1: AOS RCOUNT
MOVEI T,6
CAMN T,RCOUNT
SETZM RCOUNT
IBP RANDP
JRST RANDX
MA: 32768.-19. ;Random # gen constants
MC: 262144.-11.
MM: -23.
X0SAVD: 5
CONSTA
END BEG ;Game over!!!!!