A large commit.
[pdp8.git] / sw / src / adventure / SPEAK.RA
diff --git a/sw/src/adventure/SPEAK.RA b/sw/src/adventure/SPEAK.RA
new file mode 100644 (file)
index 0000000..a89e095
--- /dev/null
@@ -0,0 +1,566 @@
+/      SPEAK - Types out messages from the database\r
+/      Also includes TTY output routines that unpack\r
+/      packed sixbit into mixed case ASCII.\r
+/\r
+       FIELD1  ADVTTY\r
+\r
+TTY,   0                       / TTY Output routine, dupe of FRTS\r
+       IOF                     / Protect from race conditions\r
+       SNA                     / Input or output?\r
+       JMP     KBD             / Input - read character\r
+       DCA     HANGPT          / Output - save char\r
+       RDF\r
+       TAD     CDIF00\r
+       DCA     CDFX\r
+       CDF     0\r
+       TAD%    TOCHR           / Output character status in FRTS\r
+       SMA SZA CLA             / If gt 0, char backed up\r
+       JMP     BUSY            / Else must wait\r
+LOOP,  TAD%    TOCHR           / Get the status\r
+       CLL RAL                 /Busy flag in link\r
+       CLA CML RAR             /Complement of busy in sign\r
+       TAD     HANGPT\r
+       SPA                     /If tty not busy, \r
+       TLS                     /Send it\r
+       DCA%    TOCHR           /Store pos or neg, backed up or busy\r
+TTYRET,        ION                     /Interrupts back on\r
+CDFX,  HLT                     /Caller's field\r
+       JMP%    TTY             /Return\r
+\r
+CDIF00,        CIF CDF\r
+\r
+BUSY,  CDF     10              /Busy, must wait. Call Field 0 HANG routine\r
+       CIF     0\r
+       JMS%    HANGPT+1\r
+       0451                    / TTUHNG\r
+       CDF     0\r
+       JMP     LOOP            / Try output again\r
+\r
+KBD,   RDF\r
+       TAD     CDIF00\r
+       DCA     CDFX\r
+       CDF     0\r
+       TAD%    TICHR           / Any input?\r
+       SNA CLA\r
+       JMP     WAIT            / No, wait\r
+GETIN, TAD%    TICHR           / Get character\r
+       DCA     HANGPT          / Save\r
+       DCA%    TICHR           / Clear buffer\r
+       TAD     HANGPT\r
+       JMP     TTYRET          / Return\r
+\r
+WAIT,  CDF     10\r
+       CIF     0\r
+       JMS%    HANGPT+1        /Hang\r
+       465                     /KBUHNG\r
+       CDF     0\r
+       JMP     GETIN   /Get input\r
+TOCHR, 4\r
+TICHR, 5\r
+HANGPT,        ADDR    #HANG\r
+/\r
+/ Terminal line input routine. Used because the FRTS input is quite limited.\r
+/ This one handles scope rubouts and allows lower case input.\r
+/ Inputs: Array        Returned characters, stored one sixbit per array word\r
+/              (The FORTRAN input routine is set up this way to unpack)\r
+/      Size    Number of characters to allow\r
+/      Prompt Prompt string\r
+       FIELD1  RDLIN\r
+/\r
+       ENTRY   RDLINE\r
+RDLINE,        JA      #RLST\r
+#RLXR, ORG     .+10\r
+       TEXT    +RDLINE+\r
+#RLRET,        SETX    #RLXR\r
+       SETB    #RLBAS\r
+       JA      .+3\r
+#RLBAS,        ORG     .+6\r
+BUFPT, ORG     .+3\r
+BUFLEN,        ORG     .+3\r
+\r
+       ORG     #RLBAS+30\r
+       FNOP\r
+       JA      #RLRET\r
+       FNOP\r
+#RGOBK,        0;0\r
+#RLRTN,        BASE    #RLBAS\r
+       JA      #RGOBK\r
+#RLST, STARTD\r
+       0210\r
+       FSTA    #RGOBK,0\r
+       0200\r
+       SETX    #RLXR\r
+       SETB    #RLBAS\r
+       LDX     0,1\r
+       FSTA    #RLBAS\r
+       FLDA%   #RLBAS,1+\r
+       FSTA    BUFPT\r
+       FLDA%   #RLBAS,1+\r
+       FSTA    BUFLEN\r
+       STARTF\r
+/\r
+/      Pass down size to '8' code\r
+/\r
+       SETX    BUFSIZ  \r
+       FLDA%   BUFLEN\r
+       FNEG                    / Make it negative\r
+       ATX     0               / Pass buffer len\r
+       SETX    #RLXR\r
+       TRAP4   GETLIN          / Get input line\r
+       JA      #RLRTN          / And return\r
+/ Input reader\r
+\r
+       FIELD1  GETLN\r
+\r
+GETLIN,        0\r
+       CLA\r
+       DCA     OFFSET          / Start at offset zero\r
+       TAD%    SCOPT\r
+       AND     K200\r
+       DCA     SCOPE\r
+       TAD%    BUFFLD+1        / Get CDF for buffer\r
+       AND     FLDMSK\r
+       CLL RTL\r
+       RAL\r
+       TAD     CDFG\r
+       DCA     BUFCDF\r
+/\r
+/ Go get an input character\r
+/\r
+GETNXT,        JMS%    PTTY+1          / Called with zero to get char\r
+       DCA     INCH            / Save input\r
+/\r
+/ Specials?\r
+/\r
+       TAD     INCH\r
+       TAD     MDEL            / Delete?\r
+       SNA CLA\r
+       JMP     DELETE          / Handle that\r
+       TAD     INCH\r
+       TAD     MCR             / CR?\r
+       SNA CLA\r
+       JMP     ENTER           / End of line, let's go.\r
+       TAD     INCH\r
+       TAD     MSPC            / Less than space?\r
+       SPA CLA\r
+       JMP     BELL            / Nope, ignore\r
+       TAD     OFFSET\r
+       TAD     BUFSIZ          / Room left?\r
+       SMA CLA\r
+       JMP     BELL            / Bell if not\r
+       TAD     INCH\r
+       JMS%    PTTY+1          / Echo it\r
+       TAD     INCH\r
+       TAD     LWRA            / Is it lowercase?\r
+       SPA CLA\r
+       JMP     UPPER           / No, store it\r
+       TAD     INCH\r
+       TAD     LWRZ\r
+       SMA CLA\r
+       JMP     UPPER           / More than lowercase z\r
+       TAD     INCH\r
+       TAD     AMINA           / Adjust to uppercase\r
+       DCA     INCH\r
+UPPER, JMS     STORE           / Store this character\r
+       JMP     GETNXT          / Get more\r
+/ Store a character in the output buffer\r
+/ using the current offset\r
+/\r
+\r
+STORE, 0\r
+       TAD     OFFSET\r
+       TAD     OFFSET\r
+       TAD     OFFSET          / Count FPP words\r
+       TAD%    BUFPTR+1        / Pointer to exponent word\r
+       DCA     BPT\r
+       TAD     K27             / Exponent 27 for integer\r
+       JMS     STO\r
+       JMS     STO             / Zero high word\r
+       TAD     INCH            / Char value\r
+       AND     SIXMSK          / Convert to sixbit\r
+       JMS     STO             / Store in buffer\r
+       CDF     10              / Back to my field\r
+       ISZ     OFFSET          / One more in the buffer\r
+SPC,    240                    / Really shouldn't overflow; harmless AND\r
+       JMP%    STORE           / Return\r
+STO,   0\r
+BUFCDF,        HLT                     / Gets CDF for buffer field\r
+       DCA%    BPT\r
+       ISZ     BPT             / Next word\r
+       JMP%    STO             / Return if no skip\r
+       TAD     BUFCDF\r
+       TAD     BS              / Next field\r
+       DCA     BUFCDF\r
+       JMP%    STO\r
+\r
+BELL,  TAD     BEL             / Warn the user\r
+       JMS%    PTTY+1\r
+       JMP     GETNXT\r
+\r
+DELETE,        TAD     OFFSET          / How far into the buffer are we?\r
+       SNA CLA\r
+       JMP     BELL            / Ignore extra deletes\r
+       TAD     SCOPE\r
+       SNA CLA\r
+       JMP     DUMBDL          / Simple fortran-format delete\r
+       TAD     BS\r
+       JMS%    PTTY+1\r
+       TAD     SPC\r
+       JMS%    PTTY+1\r
+       TAD     BS\r
+       JMS%    PTTY+1\r
+       JMP     FIXOFF          / Fix the offset\r
+DUMBDL,        TAD     K334            / Backslash\r
+       JMS%    PTTY+1\r
+FIXOFF,        CLA CMA\r
+       TAD     OFFSET\r
+       DCA     OFFSET\r
+       JMP     GETNXT\r
+\r
+ENTER, TAD     CR              / Send a RETURN\r
+       JMS%    PTTY+1\r
+CLRLP, TAD     OFFSET          / Is there space available?\r
+       TAD     BUFSIZ\r
+       SMA CLA\r
+       JMP     CLRDN\r
+       TAD     SPC\r
+       DCA     INCH\r
+       JMS     STORE\r
+       JMP     CLRLP\r
+CLRDN, CIF CDF 0\r
+       JMP%    GETLIN\r
+\r
+BUFSIZ,        0\r
+SCOPT, 7726                    / Scope flag in OS/8\r
+K200,  200\r
+MDEL,  -377                    / Delete \r
+MCR,   -215\r
+CR,    215\r
+MSPC,  -240\r
+BEL,   207\r
+LWRA,  -341\r
+LWRZ,  -373\r
+AMINA, -40                     / Add to "a" to make "A"\r
+BPT,\r
+BUFFLD,        ADDR BUFPT+1\r
+SCOPE,\r
+BUFPTR,        ADDR    BUFPT+2\r
+OFFSET,\r
+PTTY,  ADDR    TTY\r
+BS,    10\r
+K334,  334\r
+CDFG,  CDF 0\r
+K27,   27\r
+SIXMSK,        77\r
+FLDMSK,        7\r
+INCH,  0\r
+\r
+/\r
+/ Fortran-callable message printer\r
+/ Put here to avoid wasting the rest of the page.\r
+/ Arguments:\r
+/      BUF             Buffer pointer\r
+/      COUNT           Number of characters to write, zero to look for end\r
+/      CRFLAG          Carriage return flags.\r
+/                      Bit 11 (1) = no lead LF\r
+/                      Bit 10 (2) = no trail CR\r
+/                      Bit 9  (4) = start lowercase\r
+/\r
+       ENTRY   SIXOUT\r
+SIXOUT,        JA      #STRT\r
+#SXR,  ORG     .+10\r
+       TEXT    +SIXOUT+\r
+#SRET, SETX    #SXR\r
+       SETB    #SBASE\r
+       JA      .+3\r
+#SBASE,        ORG     .+6\r
+CNT,   ORG     .+3\r
+SFLAG, ORG     .+3\r
+\r
+       ORG     #SBASE+30\r
+       FNOP\r
+       JA      #SRET\r
+       FNOP\r
+#SGOBK,        0;0\r
+#SRTN, BASE    #SBASE\r
+       JA      #SGOBK\r
+#STRT, STARTD\r
+       0210\r
+       FSTA    #SGOBK,0\r
+       0200\r
+       SETX    #SXR\r
+       SETB    #SBASE\r
+       LDX     0,1\r
+       FSTA    #SBASE\r
+       FLDA%   #SBASE,1+\r
+       FSTA    BUF             / Buffer pointer\r
+       FLDA%   #SBASE,1+       / Count\r
+       FSTA    CNT\r
+       FLDA%   #SBASE,1+       / Carriage control flag\r
+       FSTA    SFLAG\r
+       STARTF\r
+       FLDA%   CNT\r
+       SETX    COUNT\r
+       ATX     0\r
+       FLDA%   SFLAG\r
+       ATX     1\r
+       SETX    #SXR\r
+       TRAP4   SIX8            /Call the 8-mode output routine\r
+       JA      #SRTN\r
+\r
+       FIELD1  SXOUT\r
+       ENTRY   SIX8            / Mixed case output routine\r
+\r
+SIX8,  0\r
+       TAD     CRFLAG          /Suppresss carriage control?\r
+       RAR                     /Low bit suppresses lead LF\r
+       SZL CLA\r
+       JMP     .+4             /No leading LF\r
+       CDF     10              / My field\r
+       TAD     LF              /Linefeed\r
+       JMS%    TTYPTR+1        /Output it\r
+       TAD     CRFLAG\r
+       AND     K4              /Start in lower case?\r
+       SZA CLA\r
+       TAD     K40             /Yes\r
+       TAD     HUN             /Reset conversion factor\r
+       DCA     SHIFT\r
+       TAD     BUF             /Buffer field\r
+       AND     K7              /Just the field bits\r
+       CLL RAL\r
+       RTL                     /Into place\r
+       TAD     CDF0            /Into CDF instruction\r
+       DCA     CDF1\r
+       TAD     CDF1\r
+       DCA     CDF2\r
+       TAD     COUNT           /Get buffer length\r
+       SNA\r
+       JMP     NOTRIM          /Zero means it has a terminating "@"\r
+/\r
+/ Find the end of the string\r
+/\r
+       CLA CMA                 /End is start + len - 1\r
+       TAD     COUNT           /String len in words\r
+       TAD     BUF+1           /End of the string\r
+       DCA     PTR             /Pointer to end\r
+       TAD     COUNT           /Invert count\r
+       CMA IAC\r
+       DCA     COUNT\r
+CDF1,  HLT\r
+FNDEND,        TAD%    PTR\r
+       TAD     K3740           / - '  ' (two spaces)\r
+       SZA CLA                 / Skip if blank\r
+       JMP     NONBLK\r
+       ISZ     COUNT           /Count another\r
+       SKP\r
+       JMP     NONBLK          /If empty, done\r
+       CLA CMA                 / -1\r
+       TAD     PTR\r
+       DCA     PTR             /Back pointer up\r
+       JMP     FNDEND          /Keep looking\r
+\r
+NONBLK,        TAD     COUNT\r
+       SNA CLA                 /Skip if output left\r
+       JMP     DONE            /Nothing if count zero already\r
+NOTRIM,        TAD     BUF+1           /Reset pointer to start\r
+       DCA     PTR\r
+CDF2,  HLT\r
+       TAD%    PTR             /Get word\r
+       DCA     STEMP           /Save\r
+       TAD     STEMP\r
+       RTR\r
+       RTR\r
+       RTR                     /First sixbit\r
+       JMS     OUTONE          /Convert and output it\r
+       TAD     STEMP           /Second sixbit\r
+       JMS     OUTONE\r
+       ISZ     PTR             /Bump pointer\r
+       SKP                     /OK if no skip\r
+       JMP     NEWFLD          /Next field otherwise\r
+INCCNT,        ISZ     COUNT\r
+       JMP     CDF2            /Keep outputting\r
+DONE,  CLA\r
+       TAD     CRFLAG          /Suppress trailing CR?\r
+       RTR                     /2 bit suppresses trailing CR\r
+       SZL CLA                 /If zero, write it.\r
+       JMP     OUT             /Yes, leave now\r
+       CDF     10              /My field\r
+       TAD     CRTN\r
+       JMS%    TTYPTR+1\r
+OUT,   CIF CDF 0\r
+       JMP%    SIX8\r
+\r
+NEWFLD,        TAD     CDF1\r
+       TAD     K10             /Next field\r
+       DCA     CDF1\r
+       TAD     CDF1\r
+       DCA     CDF2\r
+       JMP     INCCNT\r
+\r
+OUTONE,        0\r
+       AND     K77             /Mask\r
+       SNA\r
+       JMP     DONE            / End of string\r
+       TAD     K7743           / minus '['\r
+       SNA\r
+       JMP     SETLWR          /Set to lowercase shift\r
+       TAD     K2              / ok, ']'?\r
+       SNA\r
+       JMP     SETUPR          /Set to uppercase\r
+       TAD     K7773           /Restore\r
+       SPA\r
+       TAD     SHIFT           /For positive, shift it\r
+       TAD     K40             /Else it's not alphabetic\r
+       CDF     10              /My field\r
+       JMS%    TTYPTR+1        /Output it\r
+       JMP%    OUTONE          /Done\r
+\r
+SETLWR,        TAD     K40             /Reset shift\r
+SETUPR,        TAD     HUN             /For upper/lower\r
+       DCA     SHIFT\r
+       JMP%    OUTONE\r
+\r
+TTYPTR,        ADDR TTY\r
+SHIFT, 140             /Shift value\r
+/ COUNT and CRFLAG must stay together\r
+COUNT, 0               /Num words to output. \r
+CRFLAG,        0               /1 - no leading LF, 2 no trailing CR\r
+PTR,   0\r
+CRTN,  15\r
+LF,    12\r
+K3740, 3740                    /minus blank\r
+BUF,   0;0;0                   /Buffer 15-bit address\r
+STEMP, 0\r
+K77,   77                      /sixbit mask\r
+K7,    7\r
+K4,    4\r
+K40,   40\r
+CDF0,  CDF\r
+HUN,   100\r
+K7743, 7743\r
+K7773, 7773\r
+K10,   10                      /Field increment\r
+K2,    2\r
+\r
+       SECT    SPEAK\r
+/C\r
+/      SUBROUTINE SPEAK(N)\r
+/C\r
+/C PRINT THE MESSAGE IN RECORD N OF THE RANDOM ACCESS MESSAGE FILE.\r
+/C\r
+/      IMPLICIT INTEGER (A-Z)\r
+/      COMMON /TXTCOM/ RTEXT,LINES,ASCVAR\r
+/      COMMON /ALPHAS/ BLANK,EOF\r
+/      DIMENSION RTEXT(205),LINES(36)\r
+/C\r
+       EXTERN  IO\r
+       EXTERN  #HANG\r
+       JA      #ST\r
+#XR,   ORG     .+10\r
+       TEXT    +SPEAK+\r
+#RET,  SETX    #XR\r
+       SETB    #BASE\r
+       JA      .+3\r
+#BASE, ORG     .+6\r
+N,     ORG     .+3\r
+#DOTMP,        ORG     .+3\r
+BLANK, TEXT +      +\r
+EOF,   TEXT +>$<   +\r
+ONE,   F 1.0\r
+FOUR,  F 4.0\r
+       ORG     #BASE+30\r
+       FNOP\r
+       JA      #RET\r
+       FNOP\r
+#GOBAK,        0;0\r
+I,     ORG     .+0003\r
+L,     ORG     .+0003\r
+OLDLOC,        ORG     .+0003\r
+       #LBL=.\r
+       COMMON  TXTCOM\r
+RTEXT, ORG     .+1147\r
+LINES, ORG     .+0044\r
+ASCVAR,        ORG     .+0003\r
+TXTLOC,        ORG     .+0003\r
+DATA,  ORG     .+0352\r
+       ORG     #LBL\r
+#RTN,  BASE    #BASE\r
+       JA      #GOBAK\r
+#ST,   STARTD\r
+       0210\r
+       FSTA    #GOBAK,0\r
+       0200\r
+       SETX    #XR\r
+       SETB    #BASE\r
+       LDX     0,1\r
+       FSTA    #BASE\r
+       FLDA%   #BASE,1+\r
+       FSTA    N\r
+       STARTF\r
+/       IF(N.EQ.0)RETURN\r
+       FLDA%   N\r
+       JEQ     #RTN\r
+/       READ(2'N) LOC,LINES\r
+       FLDA    N\r
+       STARTD\r
+       FSTA    #G0002\r
+       STARTF\r
+       JSR     IO\r
+       JA      .+0004\r
+#G0002,        JA      .\r
+/       IF(LINES(1).EQ.EOF)RETURN\r
+       FLDA    ONE\r
+       ATX     7\r
+       FLDA    LINES-0003,7\r
+       FSUB    EOF\r
+       JEQ     #RTN\r
+/1      OLDLOC = LOC\r
+#1,    FLDA    TXTLOC\r
+       FSTA    OLDLOC\r
+       FLDA    ONE\r
+       FSTA    I\r
+\r
+/       DO 3 I=36,1,-1\r
+/      Set COUNT to the number of words (36 or 44 octal)\r
+       SETX    COUNT\r
+       LDX     44,0            /44 words\r
+       LDX     0,1             /With carriage control\r
+       SETX    #XR\r
+/       L=I\r
+/3      CONTINUE\r
+/5      TYPE 2,(LINES(I),I=1,L)\r
+#5,    FLDA    LINEPT\r
+       FSTA    BUF             /Set buffer pointer\r
+       TRAP4   SIX8\r
+\r
+       FLDA%   N\r
+       FADD    ONE\r
+       FSTA%   N\r
+       FLDA    N\r
+/       READ(2'ASCVAR) LOC,LINES\r
+       STARTD\r
+       FSTA    #G0006\r
+       STARTF\r
+       JSR     IO\r
+       JA      .+0004\r
+#G0006,        JA      .\r
+/       IF(LOC .EQ. OLDLOC) GO TO 1\r
+       FLDA    TXTLOC\r
+       FSUB    OLDLOC\r
+       JEQ     #1\r
+       EXTERN  #WRITO\r
+       TRAP3   #WRITO\r
+       JA      FOUR\r
+       JA      #10+2\r
+       EXTERN  #RENDO\r
+       TRAP3   #RENDO\r
+\r
+/10     RETURN\r
+#10,   JA      #RTN\r
+/       (1X)\r
+       5061\r
+       3051\r
+/2      FORMAT(' ',36A2) PDP/8: (' ',12A6)\r
+LINEPT,        ADDR    LINES\r
+       0\r
+       END\r