1 / SPEAK - Types out messages from the database
2 / Also includes TTY output routines that unpack
3 / packed sixbit into mixed case ASCII.
7 TTY, 0 / TTY Output routine, dupe of FRTS
8 IOF / Protect from race conditions
10 JMP KBD / Input - read character
11 DCA HANGPT / Output - save char
16 TAD% TOCHR / Output character status in FRTS
17 SMA SZA CLA / If gt 0, char backed up
18 JMP BUSY / Else must wait
19 LOOP, TAD% TOCHR / Get the status
20 CLL RAL /Busy flag in link
21 CLA CML RAR /Complement of busy in sign
25 DCA% TOCHR /Store pos or neg, backed up or busy
26 TTYRET, ION /Interrupts back on
27 CDFX, HLT /Caller's field
32 BUSY, CDF 10 /Busy, must wait. Call Field 0 HANG routine
37 JMP LOOP / Try output again
43 TAD% TICHR / Any input?
46 GETIN, TAD% TICHR / Get character
48 DCA% TICHR / Clear buffer
62 / Terminal line input routine. Used because the FRTS input is quite limited.
63 / This one handles scope rubouts and allows lower case input.
64 / Inputs: Array Returned characters, stored one sixbit per array word
65 / (The FORTRAN input routine is set up this way to unpack)
66 / Size Number of characters to allow
67 / Prompt Prompt string
102 / Pass down size to '8' code
106 FNEG / Make it negative
107 ATX 0 / Pass buffer len
109 TRAP4 GETLIN / Get input line
110 JA #RLRTN / And return
117 DCA OFFSET / Start at offset zero
121 TAD% BUFFLD+1 / Get CDF for buffer
128 / Go get an input character
130 GETNXT, JMS% PTTY+1 / Called with zero to get char
131 DCA INCH / Save input
138 JMP DELETE / Handle that
142 JMP ENTER / End of line, let's go.
144 TAD MSPC / Less than space?
146 JMP BELL / Nope, ignore
148 TAD LWRA / Is it lowercase?
150 JMP UPPER / No, store it
154 JMP UPPER / More than lowercase z
156 TAD AMINA / Adjust to uppercase
160 TAD BUFSIZ / Room left?
162 JMP BELL / Bell if not
164 JMS% PTTY+1 / Echo it
165 JMS STORE / Store this character
166 JMP GETNXT / Get more
167 / Store a character in the output buffer
168 / using the current offset
174 TAD OFFSET / Count FPP words
175 TAD% BUFPTR+1 / Pointer to exponent word
177 TAD K27 / Exponent 27 for integer
179 JMS STO / Zero high word
180 TAD INCH / Char value
181 AND SIXMSK / Convert to sixbit
182 JMS STO / Store in buffer
183 CDF 10 / Back to my field
184 ISZ OFFSET / One more in the buffer
185 / NOP / Really shouldn't overflow
188 BUFCDF, HLT / Gets CDF for buffer field
191 JMP% STO / Return if no skip
197 BELL, TAD BEL / Warn the user
201 DELETE, TAD OFFSET / How far into the buffer are we?
203 JMP BELL / Ignore extra deletes
206 JMP DUMBDL / Simple fortran-format delete
213 JMP FIXOFF / Fix the offset
214 DUMBDL, TAD K334 / Backslash
221 ENTER, TAD CR / Send a RETURN
223 CLRLP, TAD OFFSET / Is there space available?
235 SCOPT, 7726 / Scope flag in OS/8
244 AMINA, -40 / Add to "a" to make "A"
260 / Fortran-callable message printer
261 / Put here to avoid wasting the rest of the page.
290 FSTA BUF / Buffer pointer
291 FLDA% #SBASE,1+ / Count
293 FLDA% #SBASE,1+ / Carriage control flag
302 TRAP4 SIX8 /Call the 8-mode output routine
306 ENTRY SIX8 / Mixed case output routine
309 TAD CRFLAG /Suppresss carriage control?
310 RAR /Low bit suppresses lead LF
312 JMP .+4 /No leading LF
315 JMS% TTYPTR+1 /Output it
316 TAD HUN /Reset conversion factor
318 TAD BUF /Buffer field
319 AND K7 /Just the field bits
322 TAD CDF0 /Into CDF instruction
326 TAD COUNT /Get buffer length
328 JMP NOTRIM /Zero means it has a terminating "@"
330 / Find the end of the string
332 CLA CMA /End is start + len - 1
333 TAD COUNT /String len in words
334 TAD BUF+1 /End of the string
335 DCA PTR /Pointer to end
336 TAD COUNT /Invert count
341 TAD K3740 / - ' ' (two spaces)
342 SZA CLA / Skip if blank
344 ISZ COUNT /Count another
346 JMP NONBLK /If empty, done
349 DCA PTR /Back pointer up
350 JMP FNDEND /Keep looking
353 SNA CLA /Skip if output left
354 JMP DONE /Nothing if count zero already
355 NOTRIM, TAD BUF+1 /Reset pointer to start
364 JMS OUTONE /Convert and output it
365 TAD STEMP /Second sixbit
367 ISZ PTR /Bump pointer
369 JMP NEWFLD /Next field otherwise
371 JMP CDF2 /Keep outputting
373 TAD CRFLAG /Suppress trailing CR?
374 RTR /2 bit suppresses trailing CR
375 SZL CLA /If zero, write it.
376 JMP OUT /Yes, leave now
393 JMP DONE / End of string
394 TAD K7743 / minus '['
396 JMP SETLWR /Set to lowercase shift
399 JMP SETUPR /Set to uppercase
402 TAD SHIFT /For positive, shift it
403 TAD K40 /Else it's not alphabetic
405 JMS% TTYPTR+1 /Output it
408 SETLWR, TAD K40 /Reset shift
409 SETUPR, TAD HUN /For upper/lower
414 SHIFT, 140 /Shift value
415 / COUNT and CRFLAG must stay together
416 COUNT, 0 /Num words to output.
417 CRFLAG, 0 /1 - no leading LF, 2 no trailing CR
421 K3740, 3740 /minus blank
422 BUF, 0;0;0 /Buffer 15-bit address
431 K10, 10 /Field increment
436 / SUBROUTINE SPEAK(N)
438 /C PRINT THE MESSAGE IN RECORD N OF THE RANDOM ACCESS MESSAGE FILE.
440 / IMPLICIT INTEGER (A-Z)
441 / COMMON /TXTCOM/ RTEXT,LINES,ASCVAR
442 / COMMON /ALPHAS/ BLANK,EOF
443 / DIMENSION RTEXT(205),LINES(36)
492 / READ(2'N) LOC,LINES
500 / IF(LINES(1).EQ.EOF)RETURN
513 / Set COUNT to the number of words (36 or 44 octal)
516 LDX 0,1 /With carriage control
520 /5 TYPE 2,(LINES(I),I=1,L)
522 FSTA BUF /Set buffer pointer
529 / READ(2'ASCVAR) LOC,LINES
536 / IF(LOC .EQ. OLDLOC) GO TO 1
552 /2 FORMAT(' ',36A2) PDP/8: (' ',12A6)