Add MUD.MIC, MBOOTS.MAC, and POWER.BCL from the tape.
authorLars Brinkhoff <lars@nocrew.org>
Mon, 9 Apr 2018 08:01:24 +0000 (10:01 +0200)
committerLars Brinkhoff <lars@nocrew.org>
Wed, 11 Apr 2018 04:43:24 +0000 (06:43 +0200)
MBOOTS.MAC
MUD.MIC [new file with mode: 0644]
MUD.MIC.jpg [deleted file]
POWER.BCL [new file with mode: 0644]

index 3ae86ddb9359a3058ddc131f74d4d143125a3960..550bbcd31de0d2446f9f4e0e3f52ad00329d2ca4 100644 (file)
-;Copyright (C) 1980 by\r
-;Roy Trubshaw, Richard Bartle & Brian Mallett,\r
-;Essex University, Colchester. CO4 3SQ.\r
+;COPYRIGHT (C) 1980 BY
+;ROY TRUBSHAW, RICHARD BARTLE & BRIAN MALLETT,\r
+;ESSEX UNIVERSITY, COLCHESTER. CO4 3SQ.\r
 ;\r
-;      This software is furnished on the understanding that\r
-;it may be used and or copied only with the inclusion of this\r
-;notice.  No title or ownership of this software is hereby\r
-;transferred. The information in this software is subject to\r
-;change without notice. No responsibility is assumed for the\r
-;use or reliability of this software.\r
+;       THIS SOFTWARE IS FURNISHED ON THE UNDERSTANDING THAT\r
+;IT MAY BE USED AND OR COPIED ONLY WITH THE INCLUSION OF THIS\r
+;NOTICE.  NO TITLE OR OWNERSHIP OF THIS SOFTWARE IS HEREBY\r
+;TRANSFERRED. THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO\r
+;CHANGE WITHOUT NOTICE. NO RESPONSIBILITY IS ASSUMED FOR THE\r
+;USE OR RELIABILITY OF THIS SOFTWARE.\r
  \r
-       TITLE   BCPL\r
-       TWOSEG  400K\r
+        TITLE   BCPL\r
+        TWOSEG  400K\r
  \r
-       SEARCH UUOSYM\r
-\r
-       CODE1==617022\r
-       CODE2==13731\r
-       CODE3==26262\r
+        SEARCH UUOSYM\r
  \r
-       JRST    .BCPL.##        ; CATCH FALL THROUGH\r
-..BCPL::TDZA   1,      1\r
-       SETO    1,      0       ; SET UP CCL VALUE\r
-       MOVEM   1,      %CCL##  ;Store it.\r
-       MOVEM   0,      %CALLNM##       ;Save name of this game...\r
-       CAIN    .SGPPN, 75      ;Frig for 7.001 monitor - get 75 instead of ppn\r
-       MOVE    .SGPPN, 77      ;Real ppn is in 77 (part of lookup block)\r
-       MOVEM   .SGPPN, MAINTA##        ;Save as maintainer's ppn\r
-       MOVEM   .SGPPN, PATHPP  ;Save for assigning MUD:\r
-       CAIN    .SGDEV, 75      ;Same palaver for device now\r
-       MOVE    .SGDEV, 75      ;Device is 1st entry in lookup block\r
-       SKIPN           .SGDEV  ;Did he give a disc?\r
-       MOVEI   .SGDEV, 'DSK'   ;No so assume dsk...\r
-       MOVEM   .SGDEV, DISC    ;stow away...\r
-       MOVEM   .SGDEV, PATHDV  ;...again.\r
-       came    .sgdev, [       sixbit  /dsk/   ]\r
-       camn    .sgdev, [       sixbit  /all/   ]\r
-       jrst            past\r
-       camn    .sgdev, [       sixbit  /lib/   ]\r
-       jrst            past\r
-       movei   2,      4\r
-lop:   move    1,      [       xwd     3,      loc]\r
-       jobstr  1,\r
-       jrst            past\r
-       move    1,      loc\r
-       jumpe   1,      over\r
-       camn    1,      addr+1\r
-       jrst            past\r
-       movem   1,      addr(2)\r
-       addi    2,      3\r
-       jrst            lop\r
-over:  sos             2\r
-       hrli    1,      @2\r
-       hrri    1,      addr\r
-       struuo  1,\r
-       trn\r
-past:  hrri    1,      pathbk\r
-       hrli    1,      12\r
-       path.   1,\r
-       trn\r
-       RESET\r
-       setz    1,\r
-       setuwp  1,\r
-       halt\r
-       SKIPE           74\r
-       JRST    [       OUTSTR  [       ASCIZ   /\r
-If you think I'll let you DDT me you've another think coming, squire...\r
-/                              ]\r
-                       JRST    @.\r
-                       EXIT\r
-               ]\r
-       movei   1,      imrtrp\r
-       movem   1,      .jbapr\r
-       movei   1,      ap.pov+ap.ilm+ap.nxm+ap.par\r
-       aprenb  1,      0\r
-       moveI 1,vec\r
-       piini.  1,0\r
-       trn\r
-       movei 1,swint\r
-       movem 1,vec+4\r
-       movei 1,imrtrp\r
-       movem 1,vec+10\r
-       move 1,[ ps.fon+ps.fac+args]\r
-       pisys.  1,0\r
-       trn\r
-       move 1,[ ps.fon+ps.fac+args1]\r
-       pisys.  1,0\r
-       trn\r
-       skipn           esxwd##\r
-       jrst            ripple\r
-       movei   1,      2\r
-       hrli    1,      3\r
-       movei   2,      2036\r
-       seto    3,\r
-       trmno.  3,\r
-       trn\r
-       setz    4,\r
-       trmop.  1,\r
-       trn\r
-       movei   2,      2003\r
-       trmop.  1,\r
-       trn\r
-ripple:        JRST            400010  ;Start ripple through\r
-swint: movem   1,      sumadd\r
-       hrrz    1,      status\r
-       cain    1,      code1\r
-       jrst            cone\r
-       caie    1,      code2\r
-       cain    1,      code3\r
-       jrst            ctwo\r
-wally: setzm           half\r
-okok:  move    1,      sumadd\r
-       debrk.\r
-       halt\r
-cone:  setom           half\r
-       jrst            okok\r
-ctwo:  skipn           half\r
-       jrst            wally\r
-       caie    1,      code2\r
-       jrst            nice\r
-       skipe           maint##\r
-       jrst            [       outstr  [asciz  /\r
-Someone has just tried to do something magical to you nastily.\r
-/                                      ]\r
-                               jrst wally\r
-                       ]\r
-       outstr [asciz /\r
-Someone has done something magical to you, nastily...\r
+        JRST    .BCPL.##        ; CATCH FALL THROUGH\r
+..BCPL::TDZA    1,      1\r
+        SETO    1,      0       ; SET UP CCL VALUE\r
+        MOVEM   1,      %CCL##  ;STORE IT.\r
+        MOVEM   0,      %CALLNM##       ;SAVE NAME OF THIS GAME...\r
+        CAIN    .SGPPN, 75      ;FRIG FOR 7.001 MONITOR - GET 75 INSTEAD OF PPN\r
+        MOVE    .SGPPN, 77      ;REAL PPN IS IN 77 (PART OF LOOKUP BLOCK)\r
+        MOVEM   .SGPPN, MAINTA##        ;SAVE AS MAINTAINER'S PPN\r
+        MOVEM   .SGPPN, PATHPP  ;SAVE FOR ASSIGNING MUD:\r
+        CAIN    .SGDEV, 75      ;SAME PALAVER FOR DEVICE NOW\r
+        MOVE    .SGDEV, 75      ;DEVICE IS 1ST ENTRY IN LOOKUP BLOCK\r
+        SKIPN           .SGDEV  ;DID HE GIVE A DISC?\r
+        MOVEI   .SGDEV, 'DSK'   ;NO SO ASSUME DSK...\r
+        MOVEM   .SGDEV, DISC    ;STOW AWAY...\r
+        MOVEM   .SGDEV, PATHDV  ;...AGAIN.\r
+        CAME    .SGDEV, [       SIXBIT  /DSK/   ]\r
+        CAMN    .SGDEV, [       SIXBIT  /ALL/   ]\r
+        JRST            PAST\r
+        CAMN    .SGDEV, [       SIXBIT  /LIB/   ]\r
+        JRST            PAST\r
+        MOVEI   2,      4\r
+LOP:    MOVE    1,      [       XWD     3,      LOC]\r
+        JOBSTR  1,\r
+        JRST            PAST\r
+        MOVE    1,      LOC\r
+        JUMPE   1,      OVER\r
+        CAMN    1,      ADDR+1\r
+        JRST            PAST\r
+        MOVEM   1,      ADDR(2)\r
+        ADDI    2,      3\r
+        JRST            LOP\r
+OVER:   SOS             2\r
+        HRLI    1,      @2\r
+        HRRI    1,      ADDR\r
+        STRUUO  1,\r
+        TRN\r
+PAST:   HRRI    1,      PATHBK\r
+        HRLI    1,      12\r
+        PATH.   1,\r
+        TRN\r
+        RESET\r
+        SETZ    1,\r
+        SETUWP  1,\r
+        HALT\r
+\r
+\r
+\r
+\r
+\r
+\r
+        SKIPE           74\r
+        JRST    [       OUTSTR  [       ASCIZ   /\r
+IF YOU THINK I'LL LET YOU DDT ME YOU'VE ANOTHER THINK COMING, SQUIRE...\r
+/                               ]\r
+                        JRST    @.\r
+                        EXIT\r
+                ]\r
+        MOVEI 1,VEC\r
+        PIINI.  1,0\r
+        TRN\r
+        MOVEI 1,SWINT\r
+        MOVEM 1,VEC+4\r
+        MOVE 1,[ PS.FON+PS.FAC+ARGS]\r
+        PISYS.  1,0\r
+        TRN\r
+        MOVEI   1,      2\r
+        HRLI    1,      3\r
+        MOVEI   2,      2036\r
+        SETO    3,\r
+        TRMNO.  3,\r
+        TRN\r
+        SETZ    4,\r
+        TRMOP.  1,\r
+        TRN\r
+        MOVEI   2,      2003\r
+        TRMOP.  1,\r
+        TRN\r
+        MOVEI   2,      2005\r
+        SETO    4,\r
+        TRMOP.  1,\r
+        TRN\r
+        JRST            400010  ;START RIPPLE THROUGH\r
+SWINT:  DMOVEM  1,      SUMADD\r
+        MOVEM   3,      SUMADD+2                ;WHAT'S WRONG WITH PUSHING ON STACK?\r
+        HRRZ 1,STATUS   ;PASSED VALUE\r
+        HLRZ 2,STATUS   ;JOB NUMBER\r
+        HLL  3,STATUS\r
+        HRRI 3,2        ;TABLE 2 GETS PPN FOR JOB\r
+        GETTAB  3,\r
+        JRST WALLY\r
+        CAME 3,MAINTA## ;MAKE SURE MAINTAINER DID IT\r
+        JRST WALLY\r
+        SUB  1,2\r
+        CAIN 1,"N"\r
+        JRST NICE\r
+        CAIN 1,"H"\r
+        JRST HORRIB\r
+WALLY:  DMOVE   1,      SUMADD\r
+        MOVE    3,      SUMADD+2\r
+        DEBRK.\r
+        HALT\r
+HORRIB: OUTSTR [ASCIZ /\r
+SOMETHING MAGICAL HAS HAPPENED NASTILY...\r
 / ]\r
-       exit\r
-       halt\r
-nice:  outstr [asciz /\r
-Someone has done something magical to you, nicely...\r
-/]\r
-       setom   ctcflg##\r
-       jrst    wally\r
-\r
-imrtrp:        movei   1,      imrext\r
-       movem   1,      .jbapr\r
-       outstr  [asciz  /\r
-Something amazingly magical has happened!\r
+        EXIT\r
+        HALT\r
+NICE:   OUTSTR [ASCIZ /\r
+SOMETHING MAGICAL HAS HAPPENED NICELY...\r
 /]\r
-       skipe           magic##\r
-       jrst            imrext\r
-       setom           magic##\r
-       jsp     14,     @resetgame##\r
-       subi    16,     2\r
-imrext:        exit    1,\r
\r
-reloc\r
\r
-sumadd:        block 1\r
-half:  0\r
-vec:   block 4\r
-new:   0\r
-old:   0\r
-flags: 0\r
-status:        0\r
-new1:  0\r
-old1:  0\r
-flags1:        0\r
-stats1:        0\r
\r
-args:  .pcjbi\r
-       xwd 4,0\r
-       xwd 2,0\r
-args1: .pciuu\r
-       xwd 10,0\r
-       xwd 2,0\r
\r
-pathbk:        -5\r
-       0\r
-       sixbit /MUD/\r
-       0\r
-pathdv:        exp 0, 0, 0\r
-pathpp:        exp 0, 0, 0, 0\r
-addr:  .fssrc\r
-disc:: block 1\r
-       0\r
-       0\r
-       block   ^d21                    ;should be enough for most searchlists...\r
-loc:   exp -1,0,0\r
-       END     ..BCPL\r
-\r
-\r
-\r
-\r
-\\\\\\r
-\fSUBFILE: POWER.BCL @11:29 13-NOV-1986 <477> (3816)   \r
-/*\r
-Copyright (C) 1980 by\r
-Roy Trubshaw & Richard Bartle,\r
-Essex University, Colchester. CO4 3SQ.\r
-\r
-       This software is furnished on the understanding that\r
-it may be used and or copied only with the inclusion of this\r
-notice.  No title or ownership of this software is hereby\r
-transferred. The information in this software is subject to\r
-change without notice. No responsibility is assumed for the\r
-use or reliability of this software.\r
-*/\r
-\r
-get "bcl:acs"\r
-get "bcl:scb"\r
-get "bcl:iolib"\r
-get "dungen"\r
-get "bcl:rfslib"\r
-\r
-$LDTEXT "/RUNAME:power"\r
-\r
-external "."\r
-$(     fn\r
-$)\r
-\r
-manifest\r
-$(     TREESIZE        =       RECLENGTH+2\r
-       RIGHT           =       RH | TREESIZE-1\r
-       LEFT            =       LH | TREESIZE-1\r
-       CHAIN           =       RH | TREESIZE\r
-       PPPN            =       #2011002011//MPPN\r
-$)\r
-\r
-static\r
-$(     lastblock       =       0\r
-       cbl             =       vec 1\r
-       dmpbuf          =       vec BUFFERS\r
-       cbll            =       vec 1\r
-       perputt         =       ?\r
-       dmpbuff         =       vec BUFFERS\r
-       bcntt           =       1\r
-       nextrec         =       ?\r
-       game            =       $6"mud"\r
-       rock            =       $6"rock"\r
-       blud            =       $6"blud"\r
-       perput          =       ?\r
-       rec             =       ?\r
-       gender          =       0\r
-       me              =       0\r
-       ch              =       ?\r
-       name            =       vec 1\r
-       room            =       0\r
-       tree            =       0\r
-$)\r
-\r
-let start() be\r
-$(     let bcnt=1\r
-       output:=tty\r
-       outs("The power program!*C*L")\r
-       $[      $rescan\r
-zonk:          $inchrs         1\r
-               $jrst           plonk\r
-               $caie   1,      '-'\r
-               $jrst           zonk\r
-cronk:         $inchrs         1\r
-               $jrst           plonk\r
-               $trz    1,      #40\r
-               $caie   1,      'M'\r
-               $cain   1,      'V'\r
-               $jrst           wonk\r
-               $caie   1,      'B'     //spot the hacks...\r
-               $cain   1,      'R'\r
-               $trna\r
-               $jrst           cronk\r
-               $move   2,      rock\r
-               $cain   1,      'B'\r
-               $move   2,      blud\r
-               $movem  2,      game\r
-wonk:          $inchrs         1\r
-               $trna\r
-               $jrst           wonk\r
-plonk: $]\r
-       input:=tty\r
-       Readname(name, "Password: ")\r
-       test !name=!"bushbaby" then outs("*C*LThat'll do...*C*L") or\r
-       $(      Outs("*C*LEek! Go away!*C*L")\r
-               finish\r
-       $)\r
-       $(      Outs("Frig, Start, League, Transfer, Enumerate, Password, Dot, Reveal, Mud, Kill*C*Lor One-off? ")\r
-               switchon valof\r
-               $[      $clrbfi\r
-                       $inchrw         1\r
-                       $trz    1,      #40\r
-               $] into\r
-               $(\r
-               case 'R':       outs("eveal*C*L")\r
-                               reveal()\r
-                               finish\r
-               case 'M':       outs("ud*C*L")\r
-                               run($6"dsk", $6"mud", $6"exe", PPPN)\r
-               case 'S':       outs("tart*C*L")\r
-                               strat()\r
-                               finish\r
-               case 'D':       outs("ot*C*L")\r
-                               dot()\r
-                               finish\r
-               case 'F':       outs("rig*C*L")\r
-                               break\r
-               case 'L':       outs("eague*C*L")\r
-                               league()\r
-                               finish\r
-               case 'T':       outs("ransfer*C*L")\r
-                               Transfer()\r
-                               finish\r
-               case 'E':       outs("numerate*C*L")\r
-                               Enumerate()\r
-                               finish\r
-               case 'P':       outs("assword*C*L")\r
-                               password()\r
-                               finish\r
-               case 'K':       outs("ill*C*L")\r
-                               kill()\r
-                               finish\r
-               case 'O':       outs("ne-off*C*L")\r
-                               oneoff()\r
-                               finish\r
-               default 0 ... #137:\r
-                       Outs("*C*LEh?*C*L")\r
-               $)\r
-       $) repeat\r
-       setup()\r
-       readname(name, "Name: ")\r
-       if !name =!"richard" Outs("*C*LYou're so naive...*C*L")<>finish\r
-       searchrec(name)\r
-       if rec then rec_rec rem 128+dmpbuf\r
-       test rec then\r
-       $(      let sc, sx=SCRE of rec, WRD1 of rec bitand 1\r
-               outs("Current character profile is:*C*L")\r
-               out("Name*T*T:s:s*C*Lscore*T*T:n*T:s*C*Lstrength*T:n*C*L",rec+2,WIZD of rec bitand WIZMASK -> "*TWIZ","",sc,lev(sc,sx),STRN of rec)\r
-               out("dexterity*T:n*C*Lstamina*T*T:n*T(max*T:n)*C*Lgames played*T:n*C*Lsex*T*T:smale*C*Lp/w*T:8*C*L",\r
-               dxty of rec,stna of rec,stmx of rec,games of rec, sx -> "fe", "",PSWD of rec)\r
-               dumpersona(true)\r
-               save.block()\r
-       $) or\r
-       $(      out("No current persona! I'll make one for you, :s.*C*L",name)\r
-               addrec(name)\r
-               rec_rec rem 128+dmpbuf\r
-               games of rec_1\r
-               WRD1 of rec_!name\r
-               WRD2 of rec_LENGTH of name>4 -> 1!name,0\r
-               WIZD of rec_false\r
-               dumpersona()\r
-               save.block()\r
-       $)\r
-       Close(perput)\r
-       deq(sc.channel^perput)\r
-$)\r
-and dumpersona(pw) be\r
-$(     unless numbargs() pw_false\r
-       if pw pw_ESSEX\r
-       if pw pw_appendfile($6"dsk",$6"prolog",$6"prl", MPPN,label(oops))\r
-       if pw\r
-       $(      write(pw,"POWERing :S*C*LStr.*TDex.*TSta.*TScore*TSex*TP/w*C*L",name)\r
-               write(pw,":N*T:N*T:N*T:N*T:S*T:8*C*L",STRN of rec,DXTY of rec,\r
-                       STMX of rec,SCRE of rec,((WRD1 of rec) bitand 1)->"f","m",PSWD of rec)\r
-       $)\r
-       outs("Prepare to fulfill your wildest dreams!*C*L")\r
-       outs("Strength  ?");    STRN of rec_getno(STRN)\r
-       outs("Stamina (max)     ?");    STNA of rec_getno(STMX);        STMX of rec_STNA of rec\r
-       outs("Dexterity ?");    DXTY of rec_getno(DXTY)\r
-       outs("Score             ?");    SCRE of rec_getno(SCRE)\r
-       outs("Sex               ?")\r
-       $[      $CLRBFI\r
-               $INCHRW  ch\r
-       $]\r
-       Gender_(WRD1 of rec) bitand 1\r
-       TEST ch='M'\/ch='m' THEN OUTS("ale*C*L")<>gender_0\r
-       OR if ch= 'F'\/ch='f' THEN OUTS("emale*C*L")<>\r
-               gender_1\r
-       outs("Pn                ?");    PN of rec_Getno(PN,true)\r
-       unless PN of rec PN of rec_valof $[     $getppn 1,      0       $]\r
-       WRD1 of rec_((WRD1 of rec) bitand ~1) bitor gender\r
-       LSTM of rec_valof\r
-       $[      $hrri   ac,     #11\r
-               $hrli   ac,     #53\r
-               $gettab ac,     0\r
-               $trn\r
-       $]\r
-       if pw /\ (PSWD of rec ne 0)\r
-       $(      outs("Zero p/w  ?")\r
-               if valof\r
-               $[      $clrbfi\r
-                       $inchrw         1\r
-                       $trz    1,      #40\r
-                       $caie   1,      'Y'\r
-                       $jrst           render\r
-                       $outstr         $az"es*C*L"\r
-                       $trna\r
-render:                        $setz   1,      0\r
-                       $clrbfi\r
-               $] then PSWD of rec_0\r
-       $)\r
-       if pw\r
-       $(      write(pw,":N*T:N*T:N*T:N*T:S*T:8*C*L",STRN of rec,DXTY of rec,\r
-                       STMX of rec,SCRE of rec,((WRD1 of rec) bitand 1)->"f","m",PSWD of rec)\r
-               close(pw)\r
-       $)\r
-       return\r
-oops:  Outs("*C*LI can't log this frig, so I won't do it, sorry.*C*L")\r
-$)\r
-and load.block(stream,block) be\r
-$(     if block=lastblock return\r
-       useti(perput,block)\r
-       inuuo(stream,cbl)\r
-       lastblock_block\r
-$)\r
-and save.block(block) be\r
-$(     let blk=numbargs()->block,lastblock\r
-       useto(perput,blk)\r
-       outuuo(perput,cbl)\r
-$)\r
-and searchrec(nam) = valof\r
-$(     let pnt,lrec,str=?,0,vec 1\r
-       !str_!nam\r
-       1!str_LENGTH of nam>4 -> 1!nam, 0\r
-       load.block(perput,1)\r
-       lrec_hashval(str)\r
-       rec_dmpbuf!lrec\r
-       while rec\r
-       $(      load.block(perput,rec/WDSPERBUF+1)\r
-               pnt_(rec rem WDSPERBUF)+dmpbuf\r
-               if namesame(str,2+pnt) break\r
-               lrec_rec\r
-               rec_POINTR of pnt\r
-       $)\r
-       resultis lrec\r
-$)\r
-and saverec(nam) = valof\r
-$(     searchrec(nam)\r
-       unless rec addrec(nam)\r
-       if rec          //In case addrec hasn't added them.\r
-       $(      load.block(perput,rec/WDSPERBUF+1)\r
-               dumpersona(rec rem WDSPERBUF+dmpbuf)\r
-               save.block()\r
-       $)\r
-       resultis rec    //return a value to indicate whether you've been saved.\r
-$)\r
-and deleterec(nam) be\r
-$(     let olrec,odel,lrec=?,?,searchrec(nam)\r
-       and pnt=rec rem WDSPERBUF+dmpbuf\r
-       unless rec return       //Can't find record\r
-                                               //Ok, this may look a little long-winded\r
-       load.block(perput,rec/WDSPERBUF+1)      //but it's worth it not to corrupt the persona file in case of a crash\r
-       WRD1 of pnt_0\r
-       WRD2 of pnt_0           //Zero names for purges etc.\r
-       GAMES of pnt_0          //Yawn thinks we need this, too! (WE DO! - Yawn xx)\r
-       olrec_!pnt\r
-       save.block()\r
-\r
-       load.block(perput,lrec/WDSPERBUF+1)\r
-       dmpbuf!(lrec rem WDSPERBUF)_olrec       //Old pointer to rec now points to old pointer of rec.\r
-       save.block()\r
-       \r
-       load.block(perput,1)    //Get the deleted record pointer\r
-       odel_DEL of dmpbuf\r
-       save.block()\r
-\r
-       load.block(perput,rec/WDSPERBUF+1)      //And plonk it in the record to be deleted\r
-       !pnt_odel               //Does anyone read all these comments?\r
-       save.block()\r
-\r
-       load.block(perput,1)    //Finally update the deleted record pointer to point to the newly deleted record!\r
-       DEL of dmpbuf_rec\r
-       save.block()\r
-$)\r
-and addrec(nam) be\r
-$(     let hashcont,olrec,str=?,?,vec 1\r
-       !str_!nam\r
-       1!str_LENGTH of nam>4 -> 1!nam,0\r
-       load.block(perput,1)\r
-       rec_DEL of dmpbuf\r
-       test rec then\r
-       $(      load.block(perput,rec/WDSPERBUF+1)\r
-               olrec_POINTR of (rec rem WDSPERBUF+dmpbuf)\r
-               save.block()\r
-       $) or\r
-       $(      rec_FLEN of dmpbuf\r
-               unless rec                      //No persona file exists.\r
-               $(      rec_2*WDSPERBUF\r
-                       FLEN of dmpbuf_rec      //Create hash table\r
-               $)\r
-               olrec_0                         //No deleted records\r
-               FLEN of dmpbuf+_RECLENGTH\r
-               save.block()\r
-       $)\r
-       load.block(perput,1)\r
-       DEL of dmpbuf_olrec\r
-       hashcont_dmpbuf!hashval(str)\r
-       dmpbuf!hashval(str)_rec\r
-       save.block()\r
-\r
-       load.block(perput,rec/WDSPERBUF+1)\r
-       POINTR of (dmpbuf+rec rem WDSPERBUF)_hashcont\r
-       save.block()\r
-$)\r
-and hashval(nam) =  ((!nam+1!nam)>>1) rem 253\r
-and kill() be\r
-$(     setup()\r
-       readname(name, "Name: ")\r
-       if !name =!"richard" Outs("*C*LNot Richard...*C*L")<>finish\r
-       deleterec(name)\r
-       test rec then out(":s terminated.",name)\r
-       or out(":s already dead - you can only kill people once!",name)\r
-       \r
-       Close(perput)\r
-       deq(sc.channel^perput)\r
-$)\r
-and getno(sel,octal)=valof\r
-$(     let ch=valof\r
-       $[      $clrbfi\r
-               $inchrw 1\r
-       $]\r
-       unless numbargs()=2 octal_false\r
-       unless '0' le ch le '9'\r
-       $(      $[      $clrbfi $]\r
-               resultis sel of rec\r
-       $)\r
-       putback(input,  ch)\r
-       ch_(octal->inoct,inno)()\r
-       $(      let stk=SC.PUTSTACK^input\r
-               SC.PUTSTACK^input, SC.READER^input _ !stk, stk!2\r
-               freevec(stk)\r
-       $)\r
-       resultis ch\r
-$)\r
-and inoct(nopb)=valof\r
-$(     let res=0 and ch=?\r
-       ch_inch() repeatuntil '0' le ch le '7'\r
-       while '0' le ch le '7' do\r
-       $(      res_(res<<3)-'0'+ch\r
-               ch_inch()\r
-       $)\r
-       unless numbargs() putback(input,ch)\r
-       resultis res\r
-$)\r
-and readname(nm, pr) be\r
-$(      let n,ch,linev=0,?,vec NAMELENGTH\r
-       write(tty, pr)\r
-       readch(input,@ch)\r
-       while 'a'<=(ch bitor #40)<='z' do\r
-       $(      n+:1\r
-               unless n>NAMELENGTH linev!n:='A'<=ch<='Z'->ch+#40,ch\r
-               readch(input,@ch)\r
-       $)\r
-       !linev:=n>NAMELENGTH->NAMELENGTH,n\r
-       packstring(linev,nm)\r
-       until ch='*L' do readch(input,@ch)\r
-$)      repeatuntil LENGTH of nm\r
-and dot() be\r
-$(     let stfl,no,ch=0,?,?\r
-       writes(tty,"Please enter the job number of the about to be dotted job*C*L(0 for all of them)*C*L")\r
-       writes(tty,"**")\r
-       no_rdno(tty)\r
-       $(      let res=?\r
-               writes(tty,"dotted nicely or horribly N/H? ")\r
-               $[      $clrbfi\r
-                       $inchrw  ch\r
-               $]\r
-               stfl_0\r
-               test ch='H' \/ ch='h' then stfl_#13731<>writes(tty,"orribly*C*L") or\r
-               if ch='N' \/ ch='n' then stfl_#26262<>writes(tty,"icely*C*L")\r
-               unless stfl writes(tty,"*Binvalid character*C*L")<>loop\r
-               for i=1 to 200 dispose(#617022,i)\r
-               test no then res_dispose(stfl, no)\r
-               or for i=1 to 200 if dispose(stfl, i) res_true\r
-               unless res Writes(tty, "*C*L?POWIDW - it didn't work so stop pissing around.*C*L")\r
-               finish  \r
-       $) repeat\r
-$)\r
-and dispose(stfl, no) be\r
-$[     $hrrz 2,stfl\r
-       $hrl  2,no\r
-       $calli 2,#175\r
-       $setz 1,0                       //uh?\r
-$]\r
-and namesame(nam1,nam2)=\r
-(!nam1>>1)=(!nam2>>1)/\((LENGTH of nam1<=4)\/(1!nam1>>1)=(1!nam2>>1))\r
-and strat() be\r
-$(     let resp=?\r
-       $(      writes(tty, "*C*LMud, Valley or Rock? ")\r
-               $[      $inchrw         1\r
-                       $trz    1,      ' '\r
-                       $movem  1,      resp\r
-               $]\r
-       $) repeatuntil resp='V' | resp='M' | resp='R'\r
-       write(tty, ":s*C*L", resp='R'->"ock", resp='V'->"alley", "ud")\r
-       resp_resp='R' -> $6"rock",resp='V'->$6"valley", $6 "mud"\r
-       output_createtmp(resp)\r
-       readname(name, "Name: ")\r
-       writes(tty, "*C*LRoom: ")\r
-       $[ $clrbfi      $]\r
-       for i=0 to 5 do\r
-       $(      let letter = byte 6:30-6*i\r
-               and next = valof $[ $inchrw    1 $]\r
-               if 'a' le next le 'z' next-_'a'-'A'\r
-               if next = '*C' break\r
-               letter from room _ next-' '\r
-       $)\r
-       $[ $clrbfi      $]\r
-       out(":s*^C:n*$:n*$:n",  name,\r
-                               valof $[ $mstime 1, 0 $],\r
-                               valof $[ $mstime 1, 0 $],\r
-                               room)\r
-       close(output)\r
-       run($6 "dsk", resp, $6 "exe", 0)\r
-$)\r
-\r
-and setup() be\r
-$(     !cbl_(-BUFFERS<<18)bitor(dmpbuf-1)\r
-       1!cbl_0\r
-       if false\r
-       $(\r
-dogoneit:      perput_createfile($6"dsk",game,$6".pm",PPPN,0,#17,1)\r
-               enq(SC.CHANNEL^perput)\r
-               useto(perput,2)\r
-               outuuo(perput,cbl)\r
-               close(perput)\r
-               deq(sc.channel^perput)\r
-       $)\r
-       perput_updatefile($6"dsk",game,".pm",PPPN,label(dogoneit),#17,1)\r
-       enq(sc.channel^perput)\r
-       useti(perput,1)\r
-$)\r
-and reveal() be\r
-$(     let ch, f, fil, ext=?, ?, vec 1, vec 1\r
-       readname(fil, "File part: ")\r
-       readname(ext, "Extension part: ")\r
-       f_findfile($6"dsk", fil, ext, 0, label(absent))\r
-       if false\r
-absent:        f_findfile($6"dsk", fil, ext, PPPN, label(nowhere))\r
-       input_f\r
-       ch_Inch()\r
-       while ch ne '*E'\r
-       $(      outch(ch)\r
-               ch_inch()\r
-       $)\r
-       close(f)\r
-       input_tty\r
-       return\r
-nowhere:       out("Sorry, I can't find :S.:S*C*L", fil, ext)\r
-$)\r
-\r
-and password() be\r
-$(     let num,numrecs,bcnt=?,?,3\r
-       setup()\r
-       out("*C*LOctal password: ")\r
-       num_inoct(true)\r
-       \r
-       useti(perput,1)\r
-       inuuo(perput,cbl)\r
-       numrecs_(FLEN of dmpbuf-256)/12 //First find the number of records\r
-\r
-       useti(perput,bcnt)      //Load in the first block of records\r
-       inuuo(perput,cbl)\r
-\r
-       rec_dmpbuf\r
-       for i=1 to numrecs\r
-       $(      if WRD1 of rec /\ num=PSWD of rec\r
-                       out(":S on :N points*C*L", rec+2, SCRE of rec)\r
-               if (rec-dmpbuf)>128\r
-               $(      rec -_ 128\r
-                       bcnt +_ 1\r
-                       useti(perput,bcnt)\r
-                       inuuo(perput,cbl)\r
-               $)                      \r
-               rec+_RECLENGTH\r
-       $)\r
-\r
-       close(perput)\r
-       deq(sc.channel^perput)\r
-$)\r
+        SETOM   CTCFLG##\r
 \r
-and Lev(pts, fem)=valof\r
-$(     let sc=exp.step\r
-       for i=0 to 9\r
-       $(      if sc ge pts resultis i\r
-               sc+_sc\r
-       $)\r
-       resultis 9\r
-$)!(fem!(table\r
-               (table  "novice",\r
-                       "warrior",\r
-                       "hero",\r
-                       "champion",\r
-                       "superhero",\r
-                       "enchanter",\r
-                       "sorcerer",\r
-                       "necromancer",\r
-                       "legend",\r
-                       "wizard"\r
-               ),\r
-               (table  "novice",\r
-                       "warrior",\r
-                       "heroine",\r
-                       "champion",\r
-                       "superheroine",\r
-                       "enchantress",\r
-                       "sorceress",\r
-                       "necromancess",\r
-                       "legend",\r
-                       "witch"\r
-               )\r
-       )\r
-)\r
 \r
-and Enq(chan) be\r
-$(     let addr=vec 4\r
-       !addr_#1000005\r
-       1!addr_142857\r
-       2!addr_chan\r
-       3!addr_$az"mud"+(-1<<18)\r
-       4!addr_0\r
-       Out("*C*LENQ. error code :8*C*L", valof\r
-       $[      $move   1,      addr\r
-               $enq.   1,      0\r
-               $trna\r
-               $(      return  $)\r
-       $])\r
-$)\r
 \r
-and Deq(chan) be\r
-$(     let addr=vec 1\r
-       !addr_#1000005\r
-       1!addr_142857\r
-       Out("*C*LDEQ.error code :8*C*L", valof\r
-       $[      $move   1,      addr\r
-               $hrli   1,      1\r
-               $deq.   1,      0\r
-               $trna\r
-               $(      return  $)\r
-       $])\r
-$)\r
-and transfer() be\r
-$(     let peep, bcnt, numrecs=?, 3, ?\r
-       outs("where from? (0 for everywhere) ")\r
-       peep_inoct(true)\r
-       setup()\r
-       \r
-       useti(perput,1)\r
-       inuuo(perput,cbl)\r
-       numrecs_(FLEN of dmpbuf-256)/12 //First find the number of records\r
 \r
-       useti(perput,bcnt)      //Load in the first block of records\r
-       inuuo(perput,cbl)\r
 \r
-       rec_dmpbuf\r
-       for i=1 to numrecs\r
-       $(      if WRD1 of rec /\ (PN of rec=peep | peep=0)\r
-               $(      out(":s: [**,:8] -> ", rec+2, PN of rec)\r
-                       PN of rec_Getno(PN, true)\r
-               $)\r
-       \r
-               if (rec-dmpbuf)>128\r
-               $(      rec -_ 128\r
-                       useto(perput, bcnt)\r
-                       outuuo(perput, cbl)\r
-                       bcnt +_ 1\r
-                       useti(perput,bcnt)\r
-                       inuuo(perput,cbl)\r
-               $)\r
-               rec+_RECLENGTH\r
-       $)\r
 \r
-       close(perput)\r
-       deq(sc.channel^perput)\r
-$)\r
-\r
-and League() be\r
-$(     let numrecs,bcnt=?,3\r
-       setup()\r
-       useti(perput,1)\r
-       inuuo(perput,cbl)\r
-       numrecs_(FLEN of dmpbuf-256)/12 //First find the number of records\r
-\r
-       useti(perput,bcnt)      //Load in the first block of records\r
-       inuuo(perput,cbl)\r
-\r
-       rec_dmpbuf\r
-       for i=1 to numrecs\r
-       $(      if WRD1 of rec tree_insert(SCRE of rec, tree)\r
-               if (rec-dmpbuf)>128\r
-               $(      rec -_ 128\r
-                       bcnt +_ 1\r
-                       useti(perput,bcnt)\r
-                       inuuo(perput,cbl)\r
-               $)                      \r
-               rec+_RECLENGTH\r
-       $)\r
-\r
-\r
-       close(perput)\r
-       deq(sc.channel^perput)\r
-       outs("Writing to LEAGUE.ENM")\r
-       output_createfile("dsk","league","enm",0)\r
-       outree(tree)\r
-       while me\r
-       $(      let p=LH of me\r
-               Out("richard*T*T[**,:8]:c*T34359738369*T9999*Tyes*TWIZARD*C*L",p, p ls #1000->'*T','*0')\r
-               me of_RH\r
-       $)\r
-       close(output)\r
-$)\r
-and today()=valof\r
-$[     $hrli   1,      #53\r
-       $hrri   1,      #11\r
-       $gettab 1,      0\r
-       $trn\r
-       $hlrz   1,      1\r
-$]\r
-and Enumerate() be\r
-$(     let now,bcnt,numrecs=today(),3,?\r
-       setup()\r
-       outs("Writing to POWER.ENM*C*L")\r
-       output_Createfile($6"dsk",$6"power",$6"enm", 0, Label(rats))\r
-       outs("Enumeration of personas as of ")\r
-       outtime()\r
-       outs(" on ")\r
-       outdate()\r
-       outs(":*C*L*L")\r
-       \r
-       useti(perput,1)\r
-       inuuo(perput,cbl)\r
-       numrecs_(FLEN of dmpbuf-256)/12 //First find the number of records\r
-\r
-       useti(perput,bcnt)      //Load in the first block of records\r
-       inuuo(perput,cbl)\r
-\r
-       rec_dmpbuf\r
-       for i=1 to numrecs\r
-       $(      if WRD1 of rec\r
-               $(      let t, sx, wz=now-(LH from LSTM of rec), (WRD1 of rec) bitand 1, WIZD of rec\r
-                       Out("Name:*T*T:S*C*LPpn:*T*T[**,:8]*C*LScore:*T*T:N*C*LStrength:*T:N*C*LDexterity:*T:N*C*LStamina:*T:N*Tmax :N*C*L",\r
-                               rec+2,PN of rec,SCRE of rec,STRN of rec,DXTY of rec,STNA of rec,STMX of rec)\r
-                               Out("Last game:*T:N day:S ago*C*Lgames:*T*T:N*C*Lsex:*T*T:Smale*C*L",\r
-                                       t,t=1->"","s",GAMES of rec,sx->"fe","")\r
-                               if wz bitand WIZMASK Out("Mode:*T*TWI:S*C*L", sx->"TCH","ZARD")\r
-                               if wz bitand 4 Outs("Mode:*T*TBERSERK*C*L")\r
-                               Outs("*C*L*L")\r
-               $)\r
-               if (rec-dmpbuf)>128\r
-               $(      rec -_ 128\r
-                       bcnt +_ 1\r
-                       useti(perput,bcnt)\r
-                       inuuo(perput,cbl)\r
-               $)                      \r
-               rec+_RECLENGTH\r
-       $)\r
-\r
-       close(perput)\r
-       deq(sc.channel^perput)\r
-       close(output)\r
-       Writes(tty,"*C*LEnumerated in DSK:POWER.ENM*C*L")\r
-       if false\r
-rats:          Writes(tty,"*C*LCan't create DSK:POWER.ENM*C*L")\r
-$)\r
-\r
-and insert(sc, tree)=valof\r
-$(     if tree test sc ls SCRE of tree then\r
-       $(      LEFT of tree_insert(sc, LEFT of tree)\r
-               resultis tree\r
-       $) or if sc gr SCRE of tree then\r
-       $(      RIGHT of tree_insert(sc, RIGHT of tree)\r
-               resultis tree\r
-       $)\r
-       sc_Newvec(TREESIZE)\r
-       for i=0 to RECLENGTH sc!i_rec!i\r
-       sc!(RH from RIGHT)_0\r
-       if tree\r
-       $(      CHAIN of sc_CHAIN of tree\r
-               CHAIN of tree_sc\r
-               resultis tree\r
-       $)\r
-       CHAIN of sc_0\r
-       resultis sc\r
-$)\r
-\r
-and outree(tree) be if tree\r
-$(     let l, r, n, p=LEFT of tree, RIGHT of tree, tree+2, PN of tree\r
-       outree(l)\r
-       test !n=!"richard" then\r
-       $(      let m=newvec(0)\r
-               LH of m_p\r
-               RH of m_me\r
-               me_m\r
-       $) or\r
-       Out(":s:c*T[**,:8]:c*T:N*T:c:N*T:8:S:S*C*L",\r
-               n, LENGTH of n ge 8 -> '*0', '*T', p, p ls #1000->'*T','*0', SCRE of tree,SCRE of tree > 9999999 -> '*0','*t', GAMES of tree,\r
-               PSWD of tree, (WIZD of tree bitand 4)-> "*TBERSERK", "",(WIZD of tree bitand WIZMASK)->WRD1 of tree bitand 1->"*TWITCH","*TWIZARD", "")\r
-       Outree(CHAIN of tree)\r
-       outree(r)\r
-$)\r
-and Oneoff() be\r
-$(     let now,newrec,lastrec,recptr,rec2,old.lastrec,hashbuf=\r
-                       today(),0,?,?,0,?,vec 256\r
-       !cbll_(-BUFFERS<<18)bitor(dmpbuff-1)\r
-       1!cbll_0\r
-       clearvec(dmpbuff, BUFFERS)\r
-       perputt_createfile($6"dsk",game,$6"off",0,0,#17,1)\r
-       useto(perputt,1)\r
-       nextrec_dmpbuff\r
-       setup()\r
-       $(      inuuo(perput,cbl)\r
-               rec_dmpbuf\r
-               while LH of rec\r
-               $(\r
-//Do the processing between here...\r
-\r
-                       let temp,pswrd=newrec,?         //record list pointer\r
-                       newrec_newvec(RECLENGTH)        //new reclength\r
-                       !newrec_temp\r
-                       for i=0 to 7 do (2+i)!newrec_i!rec      //copy over oldrec\r
-                       for i=8 to RECLENGTH-2 do (2+i)!newrec_0        //and zero the rest\r
-                       pswrd_9!newrec\r
-                       9!newrec_(pswrd rem ((1<<20)-1))*(pswrd rem ((1<<25)-1))\r
-                       if LENGTH of (rec+1)<5 4!newrec_0\r
-                       \r
-\r
-//...and here!\r
-                       rec+_8\r
-               $)\r
-               unless rec=dmpbuf+2*WDSPERBUF-8 & rec!1 then break\r
-       $) repeat\r
-                       \r
-       \r
-       bcntt_3\r
-       for hashno=0 to 252\r
-       $(      let nextrec=newrec\r
-               out("****************HASH=:N*****************C*L",hashno)\r
-               lastrec_0\r
-               while nextrec\r
-               $(      let recptr=rec2+dmpbuff\r
-                       if hashno=hashval(nextrec+3)\r
-                       $(      out(":s :n*C*L",nextrec+3,bcntt)\r
-                               1!nextrec_lastrec\r
-                               lastrec_rec2+(bcntt-1)*WDSPERBUF\r
-                               old.lastrec_lastrec\r
-                               for i=0 to 11 i!recptr_(i+1)!nextrec\r
-                               rec2+_12\r
-                               if rec2>128\r
-                               $(      useto(perputt,bcntt)\r
-                                       outuuo(perputt,cbll)\r
-                                       bcntt+_1\r
-                                       rec2 rem_ 128\r
-                                       for i=0 to rec2-1 do i!dmpbuff_(i+12-(rec2-1))!nextrec\r
-                               $)\r
-                       $)\r
-                       nextrec_!nextrec\r
-               $)\r
-               hashno!hashbuf_lastrec\r
-       $)\r
-       useto(perputt,bcntt)            //tidy up.\r
-       outuuo(perputt,cbll)\r
-       255!hashbuf_old.lastrec+12\r
-       254!hashbuf_0\r
-\r
-       for hashno=0 to 255 hashno!dmpbuff_hashno!hashbuf\r
-\r
-       useto(perputt,1)\r
-       outuuo(perputt,cbll)            //Output hash table\r
-               \r
-       close(perput)\r
-       deq(sc.channel^perput)\r
-       close(perputt)\r
-       Writes(tty,"*C*LOne-offed in the .OFF file*C*L")\r
-$)\r
-and clearvec(vect,size) be\r
-$[     $MOVE   AC,     vect\r
-       $HRLI   B,      0(AC)\r
-       $HRRI   B,      1(AC)\r
-       $SETZM          0(AC)\r
-       $ADD    AC,     size\r
-       $BLT    B,      0(AC)\r
-$]\r
-and yes(rec, str) =valof\r
-write(tty, ":s :s", rec+1, str)<>\r
-$[     $clrbfi\r
-       $inchrw         1\r
-       $caie   1,      'y'\r
-       $cain   1,      'Y'\r
-       $jrst           ep\r
-       $cain   1,      '*C'\r
-       $jrst           yep\r
-       $clrbfi\r
-       $outstr         $az"o*C*L"\r
-       $setz   1,      0\r
-       $(      return          $)\r
-yep:   $outchr         'y'\r
-ep:    $outstr         $az"es*C*L"\r
-$]\r
-\r
-$[     fn:     $exit   1,      0\r
-               $jrst           fn\r
-$]\r
-\r
-\r
-\r
-\r
-\\\\\\r
-\fSUBFILE: DBADAT.MAC @15:11 16-AUG-1986 <477> (786)   \r
-;Copyright (C) 1980 by\r
-;Roy Trubshaw, Richard Bartle & Ronan Flood,\r
-;Essex University, Colchester. CO4 3SQ.\r
-;\r
-;      This software is furnished on the understanding that\r
-;it may be used and or copied only with the inclusion of this\r
-;notice.  No title or ownership of this software is hereby\r
-;transferred. The information in this software is subject to\r
-;change without notice. No responsibility is assumed for the\r
-;use or reliability of this software.\r
+        JRST    WALLY\r
  \r
-       TITLE   Database for MUD version 3\r
-       TWOSEG  400K\r
-       SALL\r
-       .DIRECTIVE      SFCOND\r
-       NOSYM\r
+RELOC\r
  \r
-       MAXPLY==^D36\r
+SUMADD: BLOCK 3\r
+VEC:    BLOCK 4\r
+NEW:    0\r
+OLD:    0\r
+FLAGS:  0\r
+STATUS: 0\r
  \r
-       IF2     <PRINTX Assembling Database for MUD version 3>\r
+ARGS:   .PCJBI\r
+        XWD 4,0\r
+        XWD 2,0\r
  \r
-       DEFINE  FLIST(SIZE,NUM)<\r
-       EXP     .+1\r
-       REPEAT  NUM-1,<\r
-       EXP     .+SIZE\r
-       BLOCK   SIZE-1>\r
-       BLOCK   SIZE>\r
\r
-       DEFINE  VEC(SIZE,VALUE<0>)<\r
-       EXP     .+1\r
-       IFE     VALUE,  <BLOCK  SIZE>\r
-       IFN     VALUE,  <REPEAT SIZE,       <EXP       VALUE>>>\r
\r
-STARTL::EXP    .                               ;Address of start of database.\r
-INDEX:: EXP    0                               ;Room index.\r
-DICTIO::BLOCK  1                               ;Dictionary hash table.\r
-STLIST::BLOCK  1                               ;Pointer to start location list.\r
-MAX.RO::BLOCK  1                               ;Max number of rooms.\r
-MAX.DE::BLOCK  1                               ;Max number of demons.\r
-DEMONS::BLOCK  1                               ;Table of demons\r
-GDEMON::EXP    0                               ;List of global demons\r
-DATE:: BLOCK   1                               ;DECsystem 10 date of creation.\r
-RDATE::        EXP     0                               ;DECsystem 10 date of last reset\r
-RHOURS::EXP    0                               ;Accumulated time since last Reset\r
-RNDMS::        EXP     0                               ;List of room lists for randomisation\r
-FTIME::        EXP     0                               ;First time played this version?\r
-TIME:: BLOCK   1                               ;DECsystem 10 time of creation.\r
-BACKWD::BLOCK  1                               ;Says if a direction has an opposite\r
-TVERB::        BLOCK   1                               ;movement check word\r
-NAPCT::        0                                       ;number of naps before assume crash\r
-SUPERS::0                                      ;whether this is superseded by us or not\r
-DEMO:: 0                                       ;is there a demo on?\r
-RANDIR::0                                      ;random directions in travel table\r
-CODES::        BLOCK   1                               ;vdu manipulation codes.\r
-LOW1:: EXP     0                               ;overload measure\r
-LOW2:: EXP     0                               ;near-overload measure\r
-TIMES::        EXP .+1                                 ;vector of lists of playing times\r
-       BLOCK 7\r
-MOTVEC::       BLOCK   1                       ;Inverse movement no. to names\r
-MOVERS::       BLOCK   1                       ;Objects which are mobile\r
-MVLOCK::       EXP     -1                      ;So don't try to move above twice at once\r
-DELOCK::       EXP     -1                      ;Global demon lock\r
-MELTED::       EXP     -1                      ;Whether objects can move\r
-PEACE::        EXP     0                               ;whether can fight or not\r
-SPECT::        EXP     0                               ;whether there's a spectacular on\r
-MALE:: VEC     ^D10                            ;names for males\r
-                                               ;I bet I forget to alter with MAX.LEVEL...\r
-FEMALE::       VEC     ^D10                    ;names for females\r
-MUDNAM::       BLOCK   ^D27                    ;Name of dungeon as BCPL string\r
-MUD6:: EXP     0                               ;first 6 letters of above in 6bit\r
-ESXWD::        BLOCK   1                               ;memory location for manifest ESSEX constant\r
-PS6::  BLOCK   1                               ;first 6 letters of persona file\r
-MAX.ME::BLOCK  1                               ;Max number of text messages.\r
-TEXT:: BLOCK   1                               ;Table of text messages.\r
-TXTVEC::       BLOCK   1                       ;Word count for disc file\r
-INIDR:: EXP    -1                              ;Initialisation door.\r
-DELDR::        EXP     -1                              ;Delay door for timing out.\r
-ACTIVE::VEC    MAXPLY, -1                      ;To ensure you're still playing\r
-PLAYER::EXP    -1                              ;Stack pointer.\r
-       COUNT==MAXPLY+2                         ;2 is the frig factor!\r
-PLYNUM::VEC    MAXPLY,   <<COUNT=COUNT-1>>\r
-       PURGE   COUNT\r
-MQUEUE::VEC    MAXPLY                          ;Message queue.\r
-PNAMES::VEC    MAXPLY                          ;Player names.\r
-JOBNOS::VEC    MAXPLY                          ;Player job numbers. Forget locking it...\r
-KIPS:: VEC     MAXPLY                          ;Times at which people went to sleep.\r
-QDOORS::VEC    MAXPLY, -1                      ;Doors to message queues.\r
-PDOOR::        EXP     -1                              ;persona file door\r
-MDOOR:: EXP    -1                              ;Door to message freelist.\r
-NDOOR::        EXP     -1                              ;Door to name selection\r
-TABS:: VEC     ^D24                            ;Combat tables\r
-SHELF::        EXP     0                               ;Shelf for arch-wiz items\r
-SHORTM::FLIST  3,      200                     ;Short message freelist.\r
-LONGME::FLIST  20,     100                     ;Long message freelist.\r
-%RANSE::XWD    1,      -1                      ;Random number seed.\r
-MAGIC:: EXP    0                               ;If non zero u get thrown out.\r
-NOWIZ::        EXP     0                               ;true if no wiz's allowed\r
-LOCKED::EXP    0                               ;Whether the game is wizard-locked or not\r
-ENDLOC::EXP    HERE/^D512                      ;Current page\r
-FREE.S::EXP    .+1                             ;Freestore pointer\r
-       BLOCK   1\r
-HERE==.\r
-END\r
-\r
-\r
-\r
-\r
-\\\\\\r
-\f
\ No newline at end of file
+PATHBK: -5\r
+        0\r
+        SIXBIT /MUD/\r
+        0\r
+PATHDV: EXP 0, 0, 0\r
+PATHPP: EXP 0, 0, 0, 0\r
+ADDR:   .FSSRC\r
+DISC::  BLOCK 1\r
+        0\r
+        0\r
+        BLOCK   ^D21                    ;SHOULD BE ENOUGH FOR MOST SEARCHLISTS...\r
+LOC:    EXP -1,0,0\r
+        END     ..BCPL\r
diff --git a/MUD.MIC b/MUD.MIC
new file mode 100644 (file)
index 0000000..facf059
--- /dev/null
+++ b/MUD.MIC
@@ -0,0 +1,147 @@
+\f.NOERROR\r
+.IF ($A#"") .GOTO 'A\r
+!TO COMPILE LOAD AND SAVE MUD IN ITS ENTIRETY SAY .DO MUD M.\r
+!IF THE DATABASE FILE DBADAT AND ALSO MBOOTS ARE IN .REL FORM\r
+!THEN SAY .DO MUD B. TO JUST COMPILE MUD.BCL SAY .DO  MUD R. TO MERELY LOAD\r
+!MUD SAY .DO MUD R2. TO COMPILE BITS OF MUD DO MUD <N> FOR MUD<N>.BCL\r
+!TO COMPILE LOAD AND SAVE DBASE SAY .DO MUD DM IF THE DATABASE FILE DBADAT\r
+!IS NOT ALREADY COMPILED, .DO MUD DB IF IT IS.\r
+!TO COMPILE AND LOAD POWER, .DO MUD P\r
+!TO PRODUCE DOCUMENTATION SAY .DO MUD DOC.\r
+!TO DELETE MUD.MAS AND MAKE A NEW ONE SAY .DO MUD NEW.\r
+!TO TIDY UP THE AREA THEN LOGOUT .DO MUD TIDY.\r
+!TO REASSEMBLE AND LOAD A MUD WITH SMALLER FREEVEC .DO MUD S\r
+!TO DO M AND DB OPTIONS TOGETHER, .DO MUD ALL\r
+.MIC EXIT\r
+P::\r
+.R BCPL\r
+*POWER/O\r
+*LINK!\r
+*POWER/G\r
+NSS POWER\r
+.MIC EXIT\r
+ALL::\r
+M::\r
+.R MACRO\r
+*DBADAT=DBADAT\r
+*MBOOTS=MBOOTS\r
+*^Z\r
+B::\r
+.R BCPL\r
+*MUD0/O\r
+*MUD1/O\r
+*MUD2/O\r
+*MUD3/O\r
+*MUD4/O\r
+*MUD5/O\r
+*MUD6/O\r
+*MUD7/O\r
+*MUD8/O\r
+*MUDLIB/O\r
+*^Z\r
+R2::\r
+.R LINK\r
+*MUD0,MUD1,MUD2,MUD3,MUD4,MUD5,MUD6,MUD7,MUD8,MUDLIB,MBOOTS/COUNTER/SET:.HIGH.:472500\r
+*DBADAT/G\r
+.SSAVE\r
+.IF ($A="ALL") .GOTO DB\r
+.MIC EXIT\r
+DM::\r
+.R MACRO\r
+*DBADAT=DBADAT\r
+^C\r
+DB::\r
+.R BCPL\r
+*DBASE/O\r
+DL::\r
+.R LINK\r
+*/SET:.HIGH.:430000\r
+*DBASE,SYS:BCPLIB/SEARCH/SET:.HIGH.:472500,DBADAT/G\r
+.SAVE\r
+\r
+\r
+\r
+\r
+\r
+\r
+.MIC EXIT\r
+R::\r
+.R BCPL\r
+*MUD0/O\r
+*MUD1/O\r
+*MUD2/O\r
+*MUD3/O\r
+*MUD4/O\r
+*MUD5/O\r
+*MUD6/O\r
+*MUD7/O\r
+*MUD8/O\r
+*^Z\r
+.BACKTO R2\r
+0::\r
+1::\r
+2::\r
+3::\r
+4::\r
+5::\r
+6::\r
+7::\r
+8::\r
+.R BCPL\r
+*MUD'A/O\r
+*^Z\r
+.BACKTO R2\r
+DOC::\r
+.R CSC:FORM\r
+*MUDDLE/P1\r
+*MUDDLE/CAMERA\r
+.MIC EXIT\r
+DEL::\r
+NEW::\r
+MAS::\r
+.R SETSRC\r
+*C DSKB,*\r
+*^Z\r
+.R ED\r
+*DEL MUD.MAS\r
+*Q\r
+.R SUBFIL-MUD.SUB\r
+.PRO MUD.MAS<477>\r
+.MIC EXIT\r
+ML::\r
+.R BCPL\r
+*MUDLIB/O\r
+^Z\r
+.BACKTO R2\r
+S::\r
+.R MACRO\r
+*DBADAT=DBADAT\r
+*^Z\r
+.R LINK\r
+*MUD0,MUD1,MUD2,MUD3,MUD4,MUD5,MUD6,MUD7,MUD8,MUDLIB,MBOOTS/COUNTER/SET:.HIGH.:472500\r
+*DBADAT/G\r
+.SSAVE\r
+.R LINK\r
+*/SET:.HIGH.:430000\r
+*DBASE,SYS:BCPLIB/SEARCH/SET:.HIGH.:472500,DBADAT/G\r
+\r
+\r
+\r
+\r
+\r
+\r
+.SAVE\r
+.MIC EXIT\r
+TIDY::\r
+.R SUBFIL-MUD.SUB/D\r
+.DEL *.REL\r
+.DEL MUD.DMP\r
+.IF ($B="") .GOTO LOGOUT\r
+.COP 'B_MUD.MAS\r
+.COP 'B_MUD.TXT\r
+.COP 'B_DBASE.EXE\r
+.COP DSKC:'B_MUD.?PM\r
+LOGOUT::\r
+.DEL DBASE.EXE\r
+.IF ($C="") .R LOGOUT\r
+.MIC EXIT\r
diff --git a/MUD.MIC.jpg b/MUD.MIC.jpg
deleted file mode 100644 (file)
index e210402..0000000
Binary files a/MUD.MIC.jpg and /dev/null differ
diff --git a/POWER.BCL b/POWER.BCL
new file mode 100644 (file)
index 0000000..5059e65
--- /dev/null
+++ b/POWER.BCL
@@ -0,0 +1,507 @@
+/*\r
+COPYRIGHT (C) 1980 BY\r
+ROY TRUBSHAW & RICHARD BARTLE,\r
+ESSEX UNIVERSITY, COLCHESTER. CO4 3SQ.\r
+\r
+        THIS SOFTWARE IS FURNISHED ON THE UNDERSTANDING THAT\r
+IT MAY BE USED AND OR COPIED ONLY WITH THE INCLUSION OF THIS\r
+NOTICE.  NO TITLE OR OWNERSHIP OF THIS SOFTWARE IS HEREBY\r
+TRANSFERRED. THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO\r
+CHANGE WITHOUT NOTICE. NO RESPONSIBILITY IS ASSUMED FOR THE\r
+USE OR RELIABILITY OF THIS SOFTWARE.\r
+*/\r
+\r
+GET "BCL:ACS"\r
+GET "BCL:SCB"\r
+GET "BCL:IOLIB"\r
+GET "DUNGEN"\r
+GET "BCL:RFSLIB"\r
+\r
+$LDTEXT "/RUNAME:POWER"\r
+\r
+EXTERNAL "."\r
+$(      FN\r
+$)\r
+\r
+MANIFEST\r
+$(      TREESIZE        =       RECLENGTH+2\r
+        RIGHT           =       RH \ TREESIZE-1\r
+        LEFT            =       LH \ TREESIZE-1\r
+        CHAIN           =       RH \ TREESIZE\r
+$)\r
+\r
+STATIC\r
+$(      CBL             =       VEC 1\r
+        DMPBUF          =       VEC BUFFERS\r
+        PERPUT          =       ?\r
+        REC             =       ?\r
+        GENDER          =       0\r
+        ME              =       0\r
+        CH              =       ?\r
+        NAME            =       VEC 1\r
+        ROOM            =       0\r
+        TREE            =       0\r
+$)\r
+\r
+LET START() BE\r
+$(      LET BCNT=1\r
+        OUTPUT:=TTY\r
+        OUTS("THE POWER PROGRAM!*C*L")\r
+        INPUT:=TTY\r
+        $(      OUTS("FRIG, START, LEAGUE, TRANSFER, ENUMERATE OR DOT? ")\r
+                SWITCHON VALOF\r
+                $[      $CLRBFI\r
+                        $INCHRW         1\r
+                        $TRZ    1,      #40\r
+                $] INTO\r
+                $(\r
+                CASE 'S':       OUTS("TART*C*L")\r
+                                STRAT()\r
+                                FINISH\r
+\r
+\r
+\r
+\r
+\r
+\r
+                CASE 'D':       OUTS("OT*C*L")\r
+                                DOT()\r
+                                FINISH\r
+                CASE 'F':       OUTS("RIG*C*L")\r
+                                BREAK\r
+                CASE 'L':       OUTS("EAGUE*C*L")\r
+                                LEAGUE()\r
+                                FINISH\r
+                CASE 'T':       OUTS("RANSFER*C*L")\r
+                                TRANSFER()\r
+                                FINISH\r
+                CASE 'E':       OUTS("NUMERATE*C*L")\r
+                                ENUMERATE()\r
+                                FINISH\r
+                DEFAULT 0 ... #137:\r
+                        OUTS("*C*LEH?*C*L")\r
+                $)\r
+        $) REPEAT\r
+        SETUP()\r
+        READNAME(NAME)\r
+        IF !NAME =!"RICHARD" OUTS("*C*LYOU'RE SO NAIVE...*C*L")<>FINISH\r
+        $(      INUUO(PERPUT,CBL)\r
+                REC_DMPBUF\r
+                UNTIL PN OF REC=0\/\r
+                        (NAMESAME(NAME,REC+1)/\VALOF\r
+                $(      OUT("*C*LDO YOU MEAN :S OF [**,:8]? ",NAME, PN OF REC)\r
+                        $[      \r
+BACK:                           $CLRBFI\r
+                                $INCHRW         1\r
+                                $IORI   1,      '*S'\r
+                                $CAIN   1,      'Y'\r
+                                $JRST           YES\r
+                                $CAIN   1,      'N'\r
+                                $JRST           NO\r
+                                $OUTSTR         $AZ "*C*LEH? YES OR NO? "\r
+                                $JRST           BACK\r
+YES:                            $OUTSTR         $AZ "ES*C*L"\r
+                                $JRST           FRONT\r
+NO:                             $OUTSTR         $AZ "O*C*L"\r
+                                $SETZ   1,      0\r
+FRONT:                          $CLRBFI\r
+                        $]\r
+                $) ) REC+_RECLENGTH\r
+                IF PN OF REC\r
+                $(      LET SC, SX=SCRE OF REC, WRD1 OF REC BITAND 1\r
+                        OUTS("CURRENT CHARACTER PROFILE IS:*C*L")\r
+                        OUT("NAME*T*T:S*C*LSCORE*T*T:N*T:S*C*LSTRENGTH*T:N*C*L",REC+1,SC,LEV(SC,SX),STRN OF REC)\r
+                        OUT("DEXTERITY*T:N*C*LSTAMINA*T*T:N*T(MAX*T:N)*C*LGAMES PLAYED*T:N*C*LSEX*T*T:SMALE*C*L",\r
+                        DXTY OF REC,STNA OF REC,STMX OF REC,GAMES OF REC, SX -> "FE", "")\r
+                        DUMPERSONA()\r
+                        BREAK\r
+                $)\r
+                IF REC=DMPBUF+LASTREC TEST REC!1 THEN\r
+                $(      BCNT+_2\r
+                        LOOP\r
+                $) OR\r
+                $(      REC!1_TRUE\r
+                        USETO(PERPUT,BCNT)\r
+                        OUTUUO(PERPUT,CBL)\r
+                        $[      $MOVE   AC,     DMPBUF\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                $HRLI   B,      0(AC)\r
+                                $HRRI   B,      1(AC)\r
+                                $SETZM          0(AC)\r
+                                $ADDI   AC,     BUFFERS\r
+                                $BLT    B,      0(AC)\r
+                        $]\r
+                        BCNT+_2\r
+                        REC_DMPBUF\r
+                $)\r
+                OUT("NO CURRENT PERSONA! I'LL MAKE ONE FOR YOU, :S*C*L",NAME)\r
+                GAMES OF REC_1\r
+                WRD1 OF REC_!NAME\r
+                WRD2 OF REC_1!NAME\r
+                WIZD OF REC_FALSE\r
+                DUMPERSONA()\r
+                BREAK\r
+        $) REPEAT\r
+        USETO(PERPUT,BCNT)\r
+        OUTUUO(PERPUT,CBL)\r
+        CLOSE(PERPUT)\r
+        DEQ(SC.CHANNEL^PERPUT)\r
+$)\r
+AND DUMPERSONA() BE\r
+$(      OUTS("PREPARE TO FULFILL YOUR WILDEST DREAMS!*C*L")\r
+        OUTS("STRENGTH  ?");    STRN OF REC_GETNO(STRN)\r
+        OUTS("STAMINA (MAX)     ?");    STNA OF REC_GETNO(STNA);        STMX OF REC_STNA OF REC\r
+        OUTS("DEXTERITY ?");    DXTY OF REC_GETNO(DXTY)\r
+        OUTS("SCORE             ?");    SCRE OF REC_GETNO(SCRE)\r
+        OUTS("SEX               ?")\r
+        $[      $CLRBFI\r
+                $INCHRW  CH\r
+        $]\r
+        GENDER_(WRD1 OF REC) BITAND 1\r
+        TEST CH='M'\/CH='M' THEN OUTS("ALE*C*L")<>GENDER_0\r
+        OR IF CH= 'F'\/CH='F' THEN OUTS("EMALE*C*L")<>\r
+                GENDER_1\r
+        OUTS("PN                ?");    PN OF REC_GETNO(PN,TRUE)\r
+        UNLESS PN OF REC PN OF REC_VALOF $[     $GETPPN 1,      0       $]\r
+        WRD1 OF REC_((WRD1 OF REC) BITAND ^1) BITOR GENDER\r
+        LSTM OF REC_VALOF\r
+        $[      $HRRI   AC,     #11\r
+                $HRLI   AC,     #53\r
+                $GETTAB AC,     0\r
+                $TRN\r
+        $]\r
+$)\r
+AND GETNO(SEL,OCTAL)=VALOF\r
+$(      LET CH=VALOF\r
+        $[      $CLRBFI\r
+                $INCHRW 1\r
+        $]\r
+        UNLESS NUMBARGS()=2 OCTAL_FALSE\r
+        UNLESS '0' LE CH LE '9'\r
+        $(      $[      $CLRBFI $]\r
+                RESULTIS SEL OF REC\r
+        $)\r
+        PUTBACK(INPUT,  CH)\r
+        CH_(OCTAL->INOCT,INNO)()\r
+        $(      LET STK=SC.PUTSTACK^INPUT\r
+                SC.PUTSTACK^INPUT, SC.READER^INPUT _ !STK, STK!2\r
+\r
+\r
+\r
+\r
+\r
+\r
+                FREEVEC(STK)\r
+        $)\r
+        RESULTIS CH\r
+$)\r
+AND INOCT(NOPB)=VALOF\r
+$(      LET RES=0 AND CH=?\r
+        CH_INCH() REPEATUNTIL '0' LE CH LE '7'\r
+        WHILE '0' LE CH LE '7' DO\r
+        $(      RES_(RES<<3)-'0'+CH\r
+                CH_INCH()\r
+        $)\r
+        UNLESS NUMBARGS() PUTBACK(INPUT,CH)\r
+        RESULTIS RES\r
+$)\r
+AND READNAME(NM) BE\r
+$(      LET N,CH,LINEV=0,?,VEC NAMELENGTH\r
+        WRITE(TTY,"NAME: ")\r
+        READCH(INPUT,@CH)\r
+        WHILE 'A'<=(CH BITOR #40)<='Z' DO\r
+        $(      N+:1\r
+                UNLESS N>NAMELENGTH LINEV!N:='A'<=CH<='Z'->CH+#40,CH\r
+                READCH(INPUT,@CH)\r
+        $)\r
+        !LINEV:=N>NAMELENGTH->NAMELENGTH,N\r
+        PACKSTRING(LINEV,NM)\r
+        UNTIL CH='*L' DO READCH(INPUT,@CH)\r
+$)      REPEATUNTIL LENGTH OF NM\r
+AND DOT() BE\r
+$(      LET STFL,NO,CH=0,?,?\r
+        WRITES(TTY,"PLEASE ENTER THE JOB NUMBER OF THE ABOUT TO BE DOTTED JOB*C*L(0 FOR ALL OF THEM)*C*L")\r
+        WRITES(TTY,"**")\r
+        NO_RDNO(TTY)\r
+        $(      LET RES=?\r
+                WRITES(TTY,"DOTTED NICELY OR HORRIBLY N/H? ")\r
+                $[      $CLRBFI\r
+                        $INCHRW  CH\r
+                $]\r
+                STFL_0\r
+                IF CH='H' \/ CH='H' THEN STFL_'H'<>WRITES(TTY,"ORRIBLY*C*L")\r
+                IF CH='N' \/ CH='N' THEN STFL_'N'<>WRITES(TTY,"ICELY*C*L")\r
+                UNLESS STFL WRITES(TTY,"*BINVALID CHARACTER*C*L")<>LOOP\r
+                TEST NO THEN RES_DISPOSE(STFL, NO)\r
+                OR FOR I=1 TO 200 IF DISPOSE(STFL, I) RES_TRUE\r
+                UNLESS RES WRITES(TTY, "*C*L?POWIDW - IT DIDN'T WORK SO STOP PISSING AROUND.*C*L")\r
+                FINISH  \r
+        $) REPEAT\r
+$)\r
+AND DISPOSE(STFL, NO) BE\r
+$[      $SETO 1,0\r
+        $PJOB 3,0\r
+        $HRRZ 2,STFL\r
+        $ADD  2,3\r
+        $HRL  2,NO\r
+        $CALLI 2,#175\r
+        $SETZ 1,0\r
+$]\r
+AND NAMESAME(NAM1,NAM2)=\r
+(!NAM1>>1)=(!NAM2>>1)/\((LENGTH OF NAM1<=4)\/(1!NAM1>>1)=(1!NAM2>>1))\r
+AND STRAT() BE\r
+$(      LET RESP=?\r
+\r
+\r
+\r
+\r
+\r
+\r
+        $(      WRITES(TTY, "*C*LMUD OR VALLEY? ")\r
+                $[      $INCHRW         1\r
+                        $TRZ    1,      ' '\r
+                        $MOVEM  1,      RESP\r
+                $]\r
+        $) REPEATUNTIL RESP='V' \ RESP='M'\r
+        WRITES(TTY, RESP='V'->"ALLEY*C*L", "UD*C*L")\r
+        RESP_RESP='V'->$6"VALLEY", $6 "MUD"\r
+        OUTPUT_CREATETMP(RESP)\r
+        READNAME(NAME)\r
+        WRITES(TTY, "*C*LROOM: ")\r
+        $[ $CLRBFI      $]\r
+        FOR I=0 TO 5 DO\r
+        $(      LET LETTER = BYTE 6:30-6*I\r
+                AND NEXT = VALOF $[ $INCHRW    1 $]\r
+                IF 'A' LE NEXT LE 'Z' NEXT-_'A'-'A'\r
+                IF NEXT = '*C' BREAK\r
+                LETTER FROM ROOM _ NEXT-' '\r
+        $)\r
+        $[ $CLRBFI      $]\r
+        OUT(":S*^C:N*$:N*$:N",  NAME,\r
+                                VALOF $[ $MSTIME 1, 0 $],\r
+                                VALOF $[ $MSTIME 1, 0 $],\r
+                                ROOM)\r
+        CLOSE(OUTPUT)\r
+        RUN($6 "DSK", RESP, $6 "EXE", 0)\r
+$)\r
+\r
+AND SETUP() BE\r
+$(      !CBL_(-BUFFERS<<18)BITOR(DMPBUF-1)\r
+        1!CBL_0\r
+        IF FALSE\r
+        $(\r
+DOGONEIT:       PERPUT_CREATEFILE($6"DSK",$6"MUD",$6".PM",0,0,#17,1)\r
+                ENQ(SC.CHANNEL^PERPUT)\r
+                USETO(PERPUT,2)\r
+                OUTUUO(PERPUT,CBL)\r
+                CLOSE(PERPUT)\r
+                DEQ(SC.CHANNEL^PERPUT)\r
+        $)\r
+        PERPUT_UPDATEFILE($6"DSK",$6"MUD",".PM",0,LABEL(DOGONEIT),#17,1)\r
+        ENQ(SC.CHANNEL^PERPUT)\r
+        USETI(PERPUT,1)\r
+$)\r
+\r
+AND LEV(PTS, FEM)=VALOF\r
+$(      LET SC=EXP.STEP\r
+        FOR I=0 TO 9\r
+        $(      IF SC GE PTS RESULTIS I\r
+                SC+_SC\r
+        $)\r
+        RESULTIS 9\r
+$)!(FEM!(TABLE\r
+                (TABLE  "NOVICE",\r
+                        "WARRIOR",\r
+                        "HERO",\r
+                        "CHAMPION",\r
+                        "SUPERHERO",\r
+                        "ENCHANTER",\r
+                        "SORCERER",\r
+\r
+\r
+\r
+\r
+\r
+\r
+                        "NECROMANCER",\r
+                        "LEGEND",\r
+                        "WIZARD"\r
+                ),\r
+                (TABLE  "NOVICE",\r
+                        "WARRIOR",\r
+                        "HEROINE",\r
+                        "CHAMPION",\r
+                        "SUPERHEROINE",\r
+                        "ENCHANTRESS",\r
+                        "SORCERESS",\r
+                        "NECROMANCESS",\r
+                        "LEGEND",\r
+                        "WITCH"\r
+                )\r
+        )\r
+)\r
+\r
+AND ENQ(CHAN) BE\r
+$(      LET ADDR=VEC 4\r
+        !ADDR_#1000005\r
+        1!ADDR_142857\r
+        2!ADDR_CHAN\r
+        3!ADDR_$AZ"MUD"+(-1<<18)\r
+        4!ADDR_0\r
+        OUT("*C*LENQ. ERROR CODE :8*C*L", VALOF\r
+        $[      $MOVE   1,      ADDR\r
+                $ENQ.   1,      0\r
+                $TRNA\r
+                $(      RETURN  $)\r
+        $])\r
+$)\r
+\r
+AND DEQ(CHAN) BE\r
+$(      LET ADDR=VEC 1\r
+        !ADDR_#1000005\r
+        1!ADDR_142857\r
+        OUT("*C*LDEQ.ERROR CODE :8*C*L", VALOF\r
+        $[      $MOVE   1,      ADDR\r
+                $HRLI   1,      1\r
+                $DEQ.   1,      0\r
+                $TRNA\r
+                $(      RETURN  $)\r
+        $])\r
+$)\r
+AND TRANSFER() BE\r
+$(      LET PEEP, BCNT=?, 1\r
+        OUTS("WHERE FROM? (0 FOR EVERYWHERE) ")\r
+        PEEP_INOCT(TRUE)\r
+        SETUP()\r
+        $(      INUUO(PERPUT, CBL)\r
+                REC_DMPBUF\r
+                WHILE PN OF REC\r
+                $(      IF PN OF REC=PEEP \ PEEP=0\r
+                        $(      OUT(":S: [**,:8] -> ", REC+1, PN OF REC)\r
+                                PN OF REC_GETNO(PN, TRUE)\r
+                        $)\r
+                        REC+_RECLENGTH\r
+                $)\r
+                USETO(PERPUT, BCNT)\r
+\r
+\r
+\r
+\r
+\r
+\r
+                OUTUUO(PERPUT, CBL)\r
+                UNLESS REC=DMPBUF+LASTREC & REC!1 BREAK\r
+                BCNT+_2\r
+        $) REPEAT\r
+        CLOSE(PERPUT)\r
+        DEQ(SC.CHANNEL^PERPUT)\r
+$)\r
+\r
+AND LEAGUE() BE\r
+$(      SETUP()\r
+        $(      INUUO(PERPUT,CBL)\r
+                REC_DMPBUF\r
+                WHILE PN OF REC\r
+                $(      TREE_INSERT(SCRE OF REC, TREE)\r
+                        REC+_RECLENGTH\r
+                $)\r
+                UNLESS REC=DMPBUF+LASTREC & REC!1 THEN BREAK\r
+        $) REPEAT\r
+        CLOSE(PERPUT)\r
+        DEQ(SC.CHANNEL^PERPUT)\r
+        OUTREE(TREE)\r
+        WHILE ME\r
+        $(      LET P=LH OF ME\r
+                OUT("RICHARD*T*T[**,:8]:C*T34359738369*T999*TWIZARD*C*L",P, P LS #1000->'*T','*0')\r
+                ME OF_RH\r
+        $)\r
+$)\r
+AND ENUMERATE() BE\r
+$(      LET NOW=VALOF\r
+        $[      $HRLI   1,      #53\r
+                $HRRI   1,      #11\r
+                $GETTAB 1,      0\r
+                $TRN\r
+                $HLRZ   1,      1\r
+        $]\r
+        SETUP()\r
+        OUTPUT_CREATEFILE($6"DSK",$6"POWER",$6"ENM", 0, LABEL(RATS))\r
+        OUTS("ENUMERATION OF PERSONAS AS OF ")\r
+        OUTTIME()\r
+        OUTS(" ON ")\r
+        OUTDATE()\r
+        OUTS("::*C*L*L")\r
+        $(      INUUO(PERPUT,CBL)\r
+                REC_DMPBUF\r
+                WHILE PN OF REC\r
+                $(      LET T, SX, WZ=NOW-(LH FROM LSTM OF REC), (WRD1 OF REC) BITAND 1, WIZD OF REC\r
+                        OUT("NAME:*T*T:S*C*LPPN:*T*T[**,:8]*C*LSCORE:*T*T:N*C*LSTRENGTH:*T:N*C*LDEXTERITY:*T:N*C*LSTAMINA:*T:N*TMAX \r
+:N*C*L",\r
+                                REC+1,PN OF REC,SCRE OF REC,STRN OF REC,DXTY OF REC,STNA OF REC,STMX OF REC)\r
+                                OUT("LAST GAME:*T:N DAY:S AGO*C*LGAMES:*T*T:N*C*LSEX:*T*T:SMALE*C*L",\r
+                                        T,T=1->"","S",GAMES OF REC,SX->"FE","")\r
+                                IF WZ BITAND 1 OUT("MODE:*T*TWI:S*C*L", SX->"TCH","ZARD")\r
+                                IF WZ BITAND 4 OUTS("MODE:*T*TBERSERK*C*L")\r
+                                OUTS("*C*L*L")\r
+                        REC+_RECLENGTH\r
+                $)\r
+                UNLESS REC=DMPBUF+LASTREC & REC!1 THEN BREAK\r
+        $) REPEAT\r
+        CLOSE(PERPUT)\r
+        DEQ(SC.CHANNEL^PERPUT)\r
+\r
+\r
+\r
+\r
+\r
+\r
+        CLOSE(OUTPUT)\r
+        WRITES(TTY,"*C*LENUMERATED IN DSK:POWER.ENM*C*L")\r
+        IF FALSE\r
+RATS:           WRITES(TTY,"*C*LCAN'T CREATE DSK:POWER.ENM*C*L")\r
+$)\r
+\r
+AND INSERT(SC, TREE)=VALOF\r
+$(      IF TREE TEST SC LS SCRE OF TREE THEN\r
+        $(      LEFT OF TREE_INSERT(SC, LEFT OF TREE)\r
+                RESULTIS TREE\r
+        $) OR IF SC GR SCRE OF TREE THEN\r
+        $(      RIGHT OF TREE_INSERT(SC, RIGHT OF TREE)\r
+                RESULTIS TREE\r
+        $)\r
+        SC_NEWVEC(TREESIZE)\r
+        FOR I=0 TO RECLENGTH SC!I_REC!I\r
+        SC!(RH FROM RIGHT)_0\r
+        IF TREE\r
+        $(      CHAIN OF SC_CHAIN OF TREE\r
+                CHAIN OF TREE_SC\r
+                RESULTIS TREE\r
+        $)\r
+        CHAIN OF SC_0\r
+        RESULTIS SC\r
+$)\r
+\r
+AND OUTREE(TREE) BE IF TREE\r
+$(      LET L, R, N, P=LEFT OF TREE, RIGHT OF TREE, TREE+1, PN OF TREE\r
+        OUTREE(L)\r
+        TEST !N=!"RICHARD" THEN\r
+        $(      LET M=NEWVEC(0)\r
+                LH OF M_P\r
+                RH OF M_ME\r
+                ME_M\r
+        $) OR\r
+        OUT(":S:C*T[**,:8]:C*T:N*T:N:S:S*C*L",N, LENGTH OF N GE 8 -> '*0', '*T', P, P LS #1000->'*T','*0', SCRE OF TREE, GAMES OF TR\r
+EE,\r
+                (WIZD OF TREE BITAND 4)-> "*TBERSERK", "",(WIZD OF TREE BITAND 1)->WRD1 OF TREE BITAND 1->"*TWITCH","*TWIZARD", "")\r
+        OUTREE(CHAIN OF TREE)\r
+        OUTREE(R)\r
+$)\r
+\r
+$[      FN:     $EXIT   1,      0\r
+                $JRST           FN\r
+$]\r