--- /dev/null
+ SECT BTSET\r
+ ENTRY ISHFT\r
+ ENTRY BITSET\r
+ ENTRY #ANDER\r
+ EXTERN #RETRN\r
+ EXTERN #FIX\r
+ SECT8 BITTER\r
+\r
+#ANDER, TAD #XR /Simple masking\r
+ AND #XR+1\r
+ DCA #XR\r
+ CIF CDF\r
+ JMP% #XR+2 / Return\r
+\r
+/FPP code here; using the rest of the SECT8 page.\r
+\r
+SECNAM, TEXT +BITSET+ /For traceback\r
+#RET, SETX #XR /Return addr\r
+ SETB #BASE\r
+ JA .+3\r
+#BASE, ORG .+3 /Base 0\r
+N, ORG .+3 /Base 1 - value\r
+L, ORG .+3\r
+#BSET, TEXT +BITSET+ /Base 2 - section name\r
+#ISH, TEXT +ISHFT + /Base 3\r
+\r
+/ Now at address 23, past autoindex registers.\r
+#XR, FNOP /XR 0\r
+ ADDR #RETRN /XR 1; XR2 return to FRTS address.\r
+ ORG #XR+10 / Space for our index regs\r
+\r
+ ORG #BASE+30\r
+ FNOP\r
+ JA #RET\r
+ FNOP\r
+#GOBAK, 0;0\r
+ #LBL=.\r
+ COMMON MISCOM\r
+LINUSE, ORG .+0003\r
+TRVS, ORG .+0003\r
+CLSSES, ORG .+0003\r
+OLDLOC, ORG .+0003\r
+LOC, ORG .+0003\r
+CVAL, ORG .+0044\r
+TK, ORG .+0074\r
+NEWLOC, ORG .+0003\r
+KEY, ORG .+0702\r
+PLAC, ORG .+0454\r
+FIXD, ORG .+0454\r
+ACTSPK, ORG .+0151\r
+COND, ORG .+0702\r
+HINTS, ORG .+0360\r
+HNTMAX, ORG .+0003\r
+PROP, ORG .+0454\r
+TALLY, ORG .+0003\r
+TALLY2, ORG .+0003\r
+HINTLC, ORG .+0074\r
+CHLOC, ORG .+0003\r
+CHLOC2, ORG .+0003\r
+DSEEN, ORG .+0022\r
+DFLAG, ORG .+0003\r
+DLOC, ORG .+0022\r
+DALTLC, ORG .+0003\r
+KEYS, ORG .+0003\r
+LAMP, ORG .+0003\r
+GRATE, ORG .+0003\r
+CAGE, ORG .+0003\r
+ROD, ORG .+0003\r
+ROD2, ORG .+0003\r
+STEPS, ORG .+0003\r
+BIRD, ORG .+0003\r
+DOOR, ORG .+0003\r
+PILLOW, ORG .+0003\r
+SNAKE, ORG .+0003\r
+FISSUR, ORG .+0003\r
+TABLET, ORG .+0003\r
+CLAM, ORG .+0003\r
+OYSTER, ORG .+0003\r
+MAGZIN, ORG .+0003\r
+DWARF, ORG .+0003\r
+KNIFE, ORG .+0003\r
+FOOD, ORG .+0003\r
+BOTTLE, ORG .+0003\r
+WATER, ORG .+0003\r
+OIL, ORG .+0003\r
+PLANT, ORG .+0003\r
+PLANT2, ORG .+0003\r
+AXE, ORG .+0003\r
+MIRROR, ORG .+0003\r
+DRAGON, ORG .+0003\r
+CHASM, ORG .+0003\r
+TROLL, ORG .+0003\r
+TROLL2, ORG .+0003\r
+BEAR, ORG .+0003\r
+MESSAG, ORG .+0003\r
+VEND, ORG .+0003\r
+BATTER, ORG .+0003\r
+NUGGET, ORG .+0003\r
+COINS, ORG .+0003\r
+CHEST, ORG .+0003\r
+EGGS, ORG .+0003\r
+TRIDNT, ORG .+0003\r
+VASE, ORG .+0003\r
+EMRALD, ORG .+0003\r
+PYRAM, ORG .+0003\r
+PEARL, ORG .+0003\r
+RUG, ORG .+0003\r
+CHAIN, ORG .+0003\r
+BACK, ORG .+0003\r
+LOOK, ORG .+0003\r
+CAVE, ORG .+0003\r
+NULL, ORG .+0003\r
+ENTRNC, ORG .+0003\r
+DPRSSN, ORG .+0003\r
+SAY, ORG .+0003\r
+LOCK, ORG .+0003\r
+THROW, ORG .+0003\r
+FIND, ORG .+0003\r
+INVENT, ORG .+0003\r
+TURNS, ORG .+0003\r
+LMWARN, ORG .+0003\r
+KNFLOC, ORG .+0003\r
+DETAIL, ORG .+0003\r
+ABBNUM, ORG .+0003\r
+NUMDIE, ORG .+0003\r
+MAXDIE, ORG .+0003\r
+DKILL, ORG .+0003\r
+FOOBAR, ORG .+0003\r
+BONUS, ORG .+0003\r
+CLOCK1, ORG .+0003\r
+CLOCK2, ORG .+0003\r
+CLOSNG, ORG .+0003\r
+PANIC, ORG .+0003\r
+CLOSED, ORG .+0003\r
+GAVEUP, ORG .+0003\r
+SCORNG, ORG .+0003\r
+ODLOC, ORG .+0022\r
+STREAM, ORG .+0003\r
+SPICES, ORG .+0003\r
+ ORG #LBL\r
+\r
+COUNT, ORG .+3\r
+ONE, F 1.0\r
+\r
+\r
+/BITSET(L,N) = (COND(L).AND.ISHFT(1,N)) .NE.0\r
+\r
+BITSET, FLDA #BSET /Section name\r
+ JSA GETARG /Common setup\r
+ BASE #BASE\r
+\r
+ FLDA% L /Get array index\r
+ ATX 1\r
+ FLDA COND-0003,1 /COND(L)\r
+ FSTA ITEST / COND(L)\r
+ LDX 1,0 /Put 1 into shift value\r
+ FLDA% N /Get N value\r
+ JEQ #1 /No shift if zero\r
+ FNEG /Negate\r
+ ATX 1 /Into register\r
+ XTA 0 /Get the "1" back\r
+ ALN 0\r
+ STARTD\r
+ ALN 1 /Do the shift\r
+ STARTF\r
+ ATX 0 /Put result in place\r
+#1, XTA 0 /Get result\r
+ JSA #FIX\r
+ ATX 0 /One mask value\r
+ FLDA ITEST\r
+ JSA #FIX\r
+ ATX 1 /The other\r
+ TRAP3 #ANDER /AND it\r
+ XTA 0 /Restore value\r
+ JEQ #GOBAK /Return if zero\r
+ FLDA ONE /Else one\r
+ JA #GOBAK /Done.\r
+ITEST, ORG .+3 /Test value\r
+\r
+/\r
+/ ISHFT entry point\r
+/\r
+ BASE 0\r
+ISHFT, FLDA #ISH /Section name\r
+ JSA GETARG /Common setup\r
+\r
+ BASE #BASE\r
+ FLDA% N /Get shift count\r
+ JEQ #SKIP /No need to shift\r
+ FNEG /Negative shift count goes left\r
+ ATX 1 /Into XR 1\r
+ FLDA% L /Get value to shift\r
+ ALN 0 /Align to right\r
+ STARTD\r
+ ALN 1 /Shift\r
+ STARTF /Done\r
+ JSA #FIX\r
+ JA #GOBAK /Done\r
+#SKIP, FLDA% L /Get value back\r
+ JA #GOBAK /Done\r
+\r
+GETARG, 0;0 /Common setup routine\r
+ FSTA SECNAM /AC has section name\r
+ STARTD\r
+ 0210 /Get caller's return\r
+ FSTA #GOBAK,0\r
+ 0200 /Get arg list\r
+ SETX #XR /Set up index registers\r
+ SETB #BASE /Set up base page\r
+ FSTA #BASE /Set up arg list\r
+ LDX 0,1 /Zero to XR #1\r
+ FLDA% #BASE,1+ /Get first arg\r
+ FSTA L\r
+ FLDA% #BASE,1+ /Second arg\r
+ FSTA N\r
+ STARTF\r
+ JA GETARG /Return\r
+ END\r