tell.1 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189
  1. %%<PROG (C)
  2. <CRLF ,OUTCHAN>
  3. <PRINC "Is this assembly for Tenex? ">
  4. <COND (<MEMQ <TYI ,INCHAN> "YyTt">
  5. <SETG 10X T>)
  6. (<SETG 10X <>>)>
  7. <CRLF ,OUTCHAN>>
  8. %%<AND ,10X <USE "JSYS"> <CRLF ,OUTCHAN>>
  9. %%<OR <GASSIGNED? IFN10X>
  10. <DEFINE IFN10X ('10X 'ITS)
  11. <COND (,10X <CHTYPE .10X SPLICE>) (<CHTYPE .ITS SPLICE>)>>>
  12. <SETG RUBOUT? <>>
  13. <SETG RUVEC <IUVECTOR 4>>
  14. <SETG NO-TELL 0>
  15. <SETG IN-TELL 0>
  16. <SETG TELL-VEC <IUVECTOR 7>>
  17. ;"Print some strings to ,OUTCHAN"
  18. <TITLE TELL>
  19. <DECLARE ("VALUE" ATOM <PRIMTYPE STRING> "OPTIONAL" FIX
  20. <OR STRING FALSE> <OR STRING FALSE>)>
  21. <MOVE A* AB>
  22. LOOP <PUSH TP* (AB)>
  23. <PUSH TP* 1(AB)>
  24. <ADD AB* [<(2) 2>]>
  25. <JUMPL AB* LOOP>
  26. <HLRES A>
  27. <ASH A* -1>
  28. <ADDI A* TABEND>
  29. <PUSHJ P* @ (A) 1>
  30. <JRST FINIS>
  31. <TELL4>
  32. <TELL3>
  33. <TELL2>
  34. TABEND <TELL1>
  35. <INTERNAL-ENTRY TELL1 1> ; "push 1"
  36. <PUSH TP* <TYPE-WORD FIX>>
  37. <PUSH TP* [1]>
  38. <INTERNAL-ENTRY TELL2 2>
  39. <PUSH TP* <TYPE-WORD FALSE>>
  40. <PUSH TP* [0]>
  41. <INTERNAL-ENTRY TELL3 3>
  42. <PUSH TP* <TYPE-WORD FALSE>>
  43. <PUSH TP* [0]>
  44. <INTERNAL-ENTRY TELL4 4>
  45. <SUBM M* (P)>
  46. <INTGO>
  47. <PUSHJ P* SETUP> ; "SETUP FOR INTERRUPTS"
  48. <JRST [<PUSH TP* <TYPE-WORD FALSE>>
  49. <PUSH TP* [0]>
  50. <DPUSH TP* <PQUOTE <STRING <ASCII 13> <ASCII 10>>>>
  51. <MOVE C* <MQUOTE <RGLOC OUTCHAN T>>>
  52. <ADD C* GLOTOP 1>
  53. <MOVE C* 1(C)>
  54. <PUSH P* 1(C)>
  55. <PUSHJ P* DOSIOT> ; "PRINT CRLF"
  56. <SUB TP* [<(2) 2>]>
  57. <JRST INTLV>]>
  58. INTLV <JRST [<SUB P* [<(1) 1>]>
  59. <JRST RLDONE1>]> ; "RETURN FROM NON-PRINT"
  60. <MOVE C* <MQUOTE <RGLOC OUTCHAN T>>>
  61. <ADD C* GLOTOP 1>
  62. <MOVE C* 1(C)>
  63. <MOVE C* 1(C)> ; "CHANNEL NUMBER IN C"
  64. <PUSH P* C> ; "SAVE ON STACK"
  65. <MOVE E* <MQUOTE <RGLOC SCRIPT-CHANNEL T>>>
  66. <ADD E* GLOTOP 1>
  67. <PUSH TP* (E)>
  68. <PUSH TP* 1(E)>
  69. <MOVE O* -6(TP)> ; "FIX SPECIFYING WHEN TO DO CR'S"
  70. <TRNN O* 2> ; "SKIP IF PRINT CR BEFORE"
  71. <JRST PTFST>
  72. <PUSH TP* <PQUOTE <STRING <ASCII 13> <ASCII 10>>>>
  73. <PUSH TP* <MQUOTE <STRING <ASCII 13> <ASCII 10>>>>
  74. <PUSHJ P* DOSIOT>
  75. PTFST <PUSH TP* -9(TP)> ; "PUSH ARGS FOR DOSIOT"
  76. <PUSH TP* -9(TP)>
  77. <PUSHJ P* DOSIOT>
  78. <INTGO>
  79. <GETYP O* -5(TP)>
  80. <CAIN O* <TYPE-CODE FALSE>> ; "IS IT FALSE?"
  81. <JRST DONE>
  82. <PUSH TP* -5(TP)>
  83. <PUSH TP* -5(TP)> ; "ARGS"
  84. <PUSHJ P* DOSIOT> ; "DO PRINT"
  85. <GETYP O* -3(TP)>
  86. <CAIN O* <TYPE-CODE FALSE>>
  87. <JRST DONE>
  88. <PUSH TP* -3(TP)>
  89. <PUSH TP* -3(TP)>
  90. <PUSHJ P* DOSIOT>
  91. DONE <MOVE O* -6(TP)>
  92. <TRNN O* 1> ; "CR AFTER?"
  93. <JRST RLDONE>
  94. <PUSH TP* <PQUOTE <STRING <ASCII 13> <ASCII 10>>>>
  95. <PUSH TP* <MQUOTE <STRING <ASCII 13> <ASCII 10>>>>
  96. <PUSHJ P* DOSIOT> ; "PRINT CRLF"
  97. RLDONE <MOVE A* <MQUOTE <RGLOC IN-TELL T>>>
  98. <ADD A* GLOTOP 1>
  99. <SETZM 1(A)> ; "NO LONGER IN TELL"
  100. <SUB P* [<(2) 2>]> ; "CLEAN UP P"
  101. <SUB TP* [<(2) 2>]>
  102. RLDONE1 <SUB TP* [<(8) 8>]>
  103. <MOVE C* <MQUOTE <RGLOC TELL-FLAG T>>> ;"SETG TELL-FLAG"
  104. <ADD C* GLOTOP 1>
  105. <MOVE A* <TYPE-WORD ATOM>>
  106. <MOVEM A* (C)>
  107. <MOVE B* <MQUOTE T>>
  108. <MOVEM B* 1(C)>
  109. <JRST MPOPJ>
  110. ; "SET UP FOR INTERRUPTS"
  111. SETUP <SUBM M* (P)>
  112. <PUSH P* (P)>
  113. <MOVE A* <MQUOTE <RGLOC NO-TELL T>>>
  114. <ADD A* GLOTOP 1>
  115. <SKIPGE 1(A)> ; "IF ALREADY TURNED OFF, JUST LEAVE"
  116. <JRST SPOPJ>
  117. <SKIPL -4(TP)> ; "DO THIS ONLY IF TOLD TO"
  118. <JRST SETUPO>
  119. <MOVE A* <MQUOTE <RGLOC TELL-VEC T>>>
  120. <ADD A* GLOTOP 1>
  121. <MOVE A* 1(A)>
  122. <HLRE B* A>
  123. <ADDI B* 1>
  124. <MOVNS B>
  125. <ADDI B* (A)>
  126. <HRLI A* AB>
  127. <SUB P* [<(1) 1>]>
  128. <BLT A* (B)>
  129. <ADD P* [<(1) 1>]>
  130. <MOVE A* <MQUOTE <RGLOC IN-TELL T>>>
  131. <ADD A* GLOTOP 1>
  132. <SETOM 1(A)> ; "NOW IN TELL"
  133. SETUPO <SOS (P)>
  134. SPOPJ <SOS (P)> ; "SKIP TWICE NORMALLY, ONCE IF NOT PRINTING"
  135. <JRST MPOPJ> ; "SKIP RETURN"
  136. ;"SYSTEM DEPENDENT"
  137. ;"PUSHJ DOSIOT WITH ARGS ON TOP OF TP STACK; CHANNEL/JFN IS -1(P); SCRIPT CHANNEL
  138. IS NEXT FROB ON TP. FORTUNATELY, NO AC'S ARE SACRED."
  139. DOSIOT <SUBM M* (P)>
  140. <HRRZ C* -1(TP)> ; "GET STRING LENGTH"
  141. <MOVE B* (TP)> ; "GET STRING"
  142. <SKIPL -8(TP)>
  143. <JRST DOSIOT1> ; "ONLY ENABLE IF TOLD TO"
  144. <AOSN INTFLG>
  145. <JSR LCKINT> ; "ENABLE INTERRUPTS"
  146. DOSIOT1 <IFN10X (<MOVNS C> ; "GET -LENGTH"
  147. <JUMPE C* DODONE> ; "0 LENGTH STRING"
  148. <MOVE A* -1(P)> ; "GET JFN"
  149. <SOUT> ; "DO IT")
  150. (<*CALL SIOT>
  151. <JFCL>)>
  152. <SKIPGE -6(TP)>
  153. <SETZM INTFLG> ; "DISABLE INTERRUPTS"
  154. <SKIPL -2(TP)> ; "SCRIPTING?"
  155. <JRST DODONE>
  156. <MOVSI A* <TYPE-CODE STRING>>
  157. <HRR A* -1(TP)>
  158. <PUSH TP* A> ; "PUSH STRING"
  159. <PUSH TP* -1(TP)>
  160. <PUSH TP* -5(TP)> ; "PUSH CHANNEL"
  161. <PUSH TP* -5(TP)>
  162. <MCALL 2 PRINTSTRING> ; "DO PRINTSTRING"
  163. DODONE <SUB TP* [<(2) 2>]> ; "GET RID OF ARGS"
  164. <JRST MPOPJ>
  165. <IFN10X ()
  166. (SIOT <SETZ>
  167. <SIXBIT "SIOT">
  168. <MOVSI *4000*> ; "TURN OFF DISPLAYNESS"
  169. <-1(P)>
  170. <B>
  171. <SETZ C>)>
  172. <TITLE CTRL-S>
  173. <DECLARE ("VALUE" <OR ATOM DISMISS> CHARACTER CHANNEL)>
  174. <DPUSH TP* (AB)>
  175. <DPUSH TP* 2(AB)>
  176. <PUSHJ P* ICTRL>
  177. <JRST FINIS>
  178. <INTERNAL-ENTRY ICTRL 2>
  179. <SUBM M* (P)>
  180. <MOVE B* -2(TP)>
  181. <CAIN B* 7> ; "CTRL-G?"
  182. <JRST GACK>
  183. <IFN10X
  184. (<CAIE B* <ASCII !\>>)
  185. (<CAIE B* <ASCII !\>>)>
  186. <JRST [<MOVSI A* <TYPE-CODE ATOM>>
  187. <JRST ICTRL1>]> ; "NOT CTRL-S, SO FLUSH"
  188. <SETZM INTFLG>
  189. <MOVE A* <MQUOTE <RGLOC INCHAN T>>>
  190. <ADD A* GLOTOP 1>
  191. <DPUSH TP* (A)>
  192. <MCALL 1 RESET>
  193. <PUSH TP* <TYPE-WORD FALSE>>
  194. <PUSH TP* [0]>
  195. <MCALL 1 TTY-INIT>
  196. <MOVE A* <MQUOTE <RGLOC NO-TELL T>>>
  197. <ADD A* GLOTOP 1>
  198. <SKIPGE 1(A)> ; "ALREADY TRUE?"
  199. <JRST ICTRLO> ; "YES, SO FLUSH"
  200. <SETOM 1(A)> ; "NO, SO MAKE IT TRUE"
  201. <MOVE A* <MQUOTE <RGLOC IN-TELL T>>>
  202. <ADD A* GLOTOP 1>
  203. <SKIPL 1(A)> ; "IN TELL?"
  204. <JRST ICTRLO> ; "NO, FLUSH"
  205. <SETZM 1(A)> ; "NOT ANY MORE"
  206. <PUSH TP* <TYPE-WORD FIX>>
  207. <PUSH TP* [0]>
  208. <MCALL 1 INT-LEVEL> ; "FIX UP INTERRUPTS"
  209. <MOVE A* <MQUOTE <RGLOC TELL-VEC T>>>
  210. <ADD A* GLOTOP 1> ; "GET POINTER TO SAVED AC'S (N OF THEM)"
  211. <MOVE A* 1(A)> ; "PICK UP POINTER"
  212. <HLRE B* A> ; "# OF AC'S IS IN B"
  213. <ADDI B* P 1> ; "FIRST ONE"
  214. <HRLS A>
  215. <HRR A* B> ; "BLT POINTER IN A"
  216. <BLT A* P> ; "BLT THE AC'S BACK"
  217. <JRST MPOPJ> ; "AND LEAVE"
  218. ICTRLO <MOVSI A* <TYPE-CODE DISMISS>>
  219. ICTRL1 <MOVEI B* <MQUOTE 'T>>
  220. <SUB TP* [<(4) 4>]>
  221. <JRST MPOPJ>
  222. GACK <MOVE A* <MQUOTE <RGLOC INCHAN T>>>
  223. <ADD A* GLOTOP 1>
  224. <DPUSH TP* (A)>
  225. <MCALL 1 RESET>
  226. <PUSH TP* <TYPE-WORD FALSE>>
  227. <PUSH TP* [0]>
  228. <MCALL 1 TTY-INIT>
  229. <PUSH TP* <TYPE-WORD FALSE>>
  230. <PUSH TP* [0]>
  231. <PUSH TP* <TYPE-WORD ATOM>>
  232. <PUSH TP* <MQUOTE CONTROL-G?!-ERRORS>>
  233. <MCALL 2 HANDLE>
  234. <JRST ICTRLO>
  235. ;"Get current time in disk format"
  236. ;"SYSTEM DEPENDENT (GROSSLY)"
  237. <TITLE DSKDATE>
  238. <DECLARE ("VALUE" WORD)>
  239. <PUSHJ P* IDSKDATE>
  240. <JRST FINIS>
  241. <INTERNAL-ENTRY IDSKDATE 0>
  242. <SUBM M* (P)>
  243. <IFN10X (<HRROI B* -1> ; "-1 TO SAY CURRENT TIME"
  244. <MOVEI D* 0> ; "NOTHING FANCY"
  245. <ODCNV> ; "GET IT: B HAS YEAR,,MONTH; C DAY,,; D ,,TIME"
  246. <TLZ D* -1> ; "CLEAN OUT LH OF D"
  247. <ASH D* 1> ; "TIME IN HALF-SECONDS"
  248. <HLRZS C> ; "GET DAY OF MONTH -1"
  249. <ADDI C* 1> ; "DO THE RIGHT THING"
  250. <DPB C* [<(*220500*) D>]> ; "STUFF DAY INTO D"
  251. <IDIV B* [(1)]> ; "SPLIT B IN HALF"
  252. <ADDI C* 1> ; "GET REAL MONTH"
  253. <DPB C* [<(*270400*) D>]> ; "STUFF IN MONTH"
  254. <IDIVI B* 100> ; "GET YEAR OF CENTURY IN C"
  255. <DPB C* [<(*330700*) D>]> ; "STUFF IN YEAR"
  256. <MOVE B* D>
  257. <MOVE A* <TYPE-WORD WORD>>
  258. <JRST MPOPJ>)
  259. (<*CALL RQDATE>
  260. <SETO B*>
  261. <MOVE A* <TYPE-WORD WORD>>
  262. <JRST MPOPJ>
  263. RQDATE <SETZ>
  264. <SIXBIT "RQDATE">
  265. <SETZM B>)>
  266. ;"GET STRING OF USER NAME (OR SOMETHING LIKE THAT)"
  267. <TITLE GXUNAME>
  268. <DECLARE ("VALUE" STRING)>
  269. <PUSHJ P* IXUNAME>
  270. <JRST FINIS>
  271. <INTERNAL-ENTRY IXUNAME 0>
  272. <SUBM M* (P)>
  273. <IFN10X (<GJINF> ; "GET DIRECTORY NUMBER IN B"
  274. <MOVE B* A>
  275. <MOVE C* <MQUOTE <RGLOC SCRATCH-STR T>>>
  276. <ADD C* GLOTOP 1>
  277. <MOVE A* 1(C)>
  278. <DIRST>
  279. <JFCL>
  280. <MOVE B* 1(C)>
  281. <MOVE A* (C)>
  282. <JRST MPOPJ>)
  283. (<*SUSET [<(*74*) A>]>
  284. <PUSH TP* <TYPE-WORD WORD>>
  285. <PUSH TP* A>
  286. <PUSHJ P* ISIXTO>
  287. <JRST MPOPJ>
  288. ;"TAKES WORD ON TOP OF TP, RETURNS STRING"
  289. ISIXTO <SUBM M* (P)>
  290. <LDB O* [<(*000613*) 0>]> ; "LAST BYTE IN WORD"
  291. <MOVEI C* 1>
  292. <JUMPE O* CONTIN>
  293. <MOVEI C* 2> ; "NUMBER OF WORDS REQUIRED"
  294. CONTIN <PUSH P* C> ; "SAVE #WORDS"
  295. <MOVE A* C>
  296. <MOVEI O* IBLOCK>
  297. <PUSHJ P* RCALL> ; "GET UVECTOR (IN A AND B)"
  298. <MOVE A* <TYPE-WORD STRING>>
  299. <POP P* C>
  300. <MOVEI O* 4(C)> ; "LENGTH IS FIVE OR SIX"
  301. <HRR A* O> ; "LENGTH OF STRING"
  302. <ADD C* B>
  303. <MOVEI O* <TYPE-CODE CHARACTER>>
  304. <DPB O* [<(*221503*) 0>]> ; "CLOBBER TYPE SLOT IN DOPE WORDS"
  305. <HRLI B* *440700*> ; "GET STRING POINTER TO UV"
  306. ; "AT THIS POINT, IN A AND B WE HAVE THE TYPE-VALUE WORD, ALMOST READY TO
  307. RETURN. ON TOP OF TP, THE WORD TO BE HACKED."
  308. START <PUSH P* B> ; "SAVE BP TO RETURN"
  309. <MOVE C* (TP)> ; "GET WORD TO HACK IN C"
  310. <MOVE D* [<(*440600*) C>]> ; "AND SIXBIT POINTER IN D"
  311. <HRRZ E* A> ; "LENGTH OF STRING"
  312. <JUMPE E* DONE> ; "CAN'T HACK EMPTY STRING"
  313. <CAILE E* 6>
  314. <MOVEI E* 6> ; "MAX # CHARS"
  315. STRLOP <ILDB O* D> ; "GET CHAR IN O"
  316. <ADDI O* *40*>
  317. <IDPB O* B> ; "STUFF CHAR INTO STRING"
  318. <SOJG E* STRLOP>
  319. DONE <POP P* B> ; "GET OLD BP BACK"
  320. <SUB TP* [<(2) 2>]>
  321. <JRST MPOPJ>)>
  322. ;"Takes channel open to name file, returns string of name"
  323. <IFN10X (
  324. <TITLE GET-NAME>
  325. <DECLARE ("VALUE" <OR FALSE STRING>)>
  326. <PUSHJ P* IGETNAME>
  327. <JRST FINIS>
  328. <INTERNAL-ENTRY IGETNAME 1>
  329. <SUBM M* (P)>
  330. ;"FIRST, WE NEED A JFN TO THE CRETIN FILE WITH THE RIGHT CRETIN BITS."
  331. <MOVSI A* *100001*> ; "I HOPE THIS MEANS GET
  332. EXISTING FILE, SHORT FORM"
  333. <MOVE B* <MQUOTE "DSK:<IMSSS>DATSYS.PMAP">>
  334. ; "FILE NAME, ASCIZ"
  335. <GTJFN>
  336. <JRST OPLOST> ; "LOSE, LOSE"
  337. <TLZ A* -1>
  338. <MOVE B* [<(*440000*) *202200*>]>
  339. ; "36 BYTE SIZE, THAWED MODE, DON'T HANG"
  340. <OPENF>
  341. <JRST OPLOST>
  342. <PUSH P* A> ; "SAVE JFN"
  343. <MOVEI A* 4>
  344. <PUSHJ P* PGFIND> ; "GET FOUR PAGES FROM INTERPRETER"
  345. <JUMPL B* [<ERRUUO* <MQUOTE CANT-GET-PAGES>>]>
  346. <ASH B* 1> ; "CRETIN TENEX"
  347. <PUSH P* B> ; "SAVE PAGE NUMBER"
  348. <TLO B* *400000*> ; "TURN ON 'ME' BIT"
  349. <HRLZ A* -1(P)> ; "GET JFN"
  350. <HRRI A* *60*> ; "PAGE IN FILE"
  351. <MOVE C* [<(*400000*) *10*>]> ; "# OF PAGES"
  352. <PMAP> ; "DO MAP"
  353. <GJINF> ; "DIRNUM IS IN A; B AND C HAVE GONE AWAY"
  354. <IMULI A* 4> ; "OFFSET INTO BLOCK"
  355. <MOVE B* (P)> ; "PAGE #, TENEX STYLE"
  356. <ASH B* *11*> ; "MAKE IT AN ADDRESS"
  357. <ADDI B* (A)> ; "ADDRESS OF BEGINNING OF STRING"
  358. <PUSH P* B> ; "SAVE FOR EVENTUAL BLT"
  359. <HRLI B* *440700*> ; "BYTE POINTER"
  360. <MOVEI A* 0> ; "# OF CHARS"
  361. LENLP <ILDB O* B> ; "GET CHAR"
  362. <JUMPE O* ENDSTR> ; "DONE?"
  363. <AOJA A* LENLP> ; "NO, INCREASE COUNT AND TRY AGAIN"
  364. ENDSTR <PUSH P* A> ; "SAVE LENGTH"
  365. <IDIVI A* 5> ; "# OF WORDS"
  366. <CAIE B* 0> ; "REMAINDER 0?"
  367. <ADDI A* 1> ; "NOPE"
  368. <PUSH P* A> ; "SAVE # WORDS"
  369. <MOVEI O* IBLOCK>
  370. <PUSHJ P* RCALL> ; "GET UV"
  371. ; "# OF WORDS IN STRING IS (P); LENGTH OF STRING IS -1(P); ADDRESS OF SOURCE IS -2(P);
  372. PAGE # OF MAPPED AREA IS -3(P)"
  373. <MOVE D* B>
  374. <HRL D* -2(P)> ; "SOURCE POINTER"
  375. <MOVEI C* -1(D)> ; "DEST POINTER -1"
  376. <ADD C* (P)> ; "END OF DESTINATION"
  377. <BLT D* (C)> ; "GET STRING"
  378. <MOVEI O* <TYPE-CODE STRING>>
  379. <DPB O* [<(*221503*) 1>]> ; "CLOBBER DOPE WORDS"
  380. <HRLI B* *440700*>
  381. <MOVSI A* <TYPE-CODE STRING>>
  382. <HRR A* -1(P)> ; "FINISH STRING POINTER"
  383. <PUSH TP* A> ; "PUSH STRING"
  384. <PUSH TP* B>
  385. <HRROI A* -1> ; "A IS -1 FOR UNMAPPING"
  386. <MOVE B* -3(P)> ; "PAGE #"
  387. <TLO B* *400000*>
  388. <MOVE C* [<(*400000*) *10*>]> ; "# PAGES"
  389. <PMAP> ; "UNMAP"
  390. <MOVE A* -4(P)> ; "JFN"
  391. <CLOSF> ; "CLOSE, RELEASE JFN"
  392. <JFCL>
  393. <MOVE B* -3(P)>
  394. <ASH B* -1>
  395. <MOVEI A* *4*>
  396. <PUSHJ P* PGGIVE> ; "GIVE BACK PAGES"
  397. <POP TP* B>
  398. <POP TP* A> ; "GET STRING BACK"
  399. <SUB P* [<(5) 5>]> ; "CLEAN UP P"
  400. <JRST MPOPJ> ; "DONE"
  401. OPLOST <MOVE A* <TYPE-WORD FALSE>> ; "RETURN FALSE"
  402. <MOVEI B* 0>
  403. <JRST MPOPJ>) ()>
  404. <TITLE STARTER>
  405. <DECLARE ("VALUE" <OR FIX STRING>)>
  406. <PUSHJ P* ISTART>
  407. <JRST FINIS>
  408. <INTERNAL-ENTRY ISTART 0>
  409. <SUBM M* (P)>
  410. <IFN10X (
  411. ; "NOW FIGURE OUT WHAT'S GOING ON WITH DIRECTORIES"
  412. GETDIR <MOVEI A* *2500*> ; "ALMOST GUARANTEED--SHARING WITH SAVE FILE"
  413. <LSH A* -9> ; "10X PAGE #"
  414. <HRLI A* *400000*> ; "THIS PROCESS"
  415. <RMAP> ; "GET JFN IN LH OF B"
  416. <SKIPGE A>
  417. <JRST D*>
  418. <HLRZ B* A> ; "JFN TO THE RIGHT"
  419. <MOVE D* <MQUOTE <RGLOC SCRATCH-STR T>>>
  420. <ADD D* GLOTOP 1>
  421. <MOVE A* 1(D)> ; "DESTINATION"
  422. <MOVSI C* *010000*> ; "DIRECTORY FIELD ONLY"
  423. <JFNS>
  424. <MOVE B* 1(D)>
  425. <MOVE A* (D)>
  426. <JRST MPOPJ> ; "RETURN THE STRING"
  427. OUT <MOVSI A* <TYPE-CODE FIX>>
  428. <MOVEI B*>
  429. <JRST MPOPJ>)
  430. (<*CALL TTYGET>
  431. <JFCL>
  432. <TLO B* *300*>
  433. <*CALL TTYSET>
  434. <JFCL>
  435. <*IOPUS>
  436. <*CALL [<SETZ>
  437. <SIXBIT "OPEN">
  438. [<(0) 0>]
  439. [<SIXBIT "DSK">]
  440. [<SIXBIT "TRIVIA">]
  441. [<SIXBIT "CURFEW">]
  442. <SETZ [<SIXBIT "_MSGS_">]>]>
  443. <JRST [<*IOPOP>
  444. <JRST CORCHK>]>
  445. <*SUSET [<(*74*) A>]>
  446. <CAMN A* [<SIXBIT "GUEST">]>
  447. <JRST FLUSHO>
  448. <*CALL [<SETZ>
  449. <SIXBIT "OPEN">
  450. [<(0) 0>]
  451. [<SIXBIT "DSK">]
  452. [<SIXBIT ".FILE.">]
  453. [<SIXBIT "(DIR)">]
  454. <SETZ A>]>
  455. <JRST FLUSHO>
  456. <*CALL [<SETZ>
  457. <SIXBIT "OPEN">
  458. [<(*20*) 0>] ; "DON'T CHASE LINKS"
  459. [<SIXBIT "DSK">]
  460. [<SIXBIT "_MSGS_">]
  461. <MOVE A>
  462. <SETZ A>]>
  463. <JRST FLUSHO>
  464. <*IOPOP>
  465. <JRST CORCHK>
  466. FLUSHO <*IOPOP>
  467. <MOVEI B* 5>
  468. <JRST LEAVE>
  469. CORCHK <MOVNI A* 1>
  470. <*SUSET [<(*400021*) A>]> ; "FUNNY HACK"
  471. <*CALL [<SETZ> ; "#SHARERS OF 200. INTO B"
  472. <SIXBIT "CORTYP">
  473. <MOVEI 201.>
  474. <MOVEM C>
  475. <MOVEM 0>
  476. <MOVEM 0>
  477. <SETZM B>]>
  478. <*VALUE>
  479. <JUMPL C* NOTPUR>
  480. <TLZ B* -1> ; "CLEAR LH"
  481. LEAVE <MOVSI A* <TYPE-CODE FIX>>
  482. <JRST MPOPJ>
  483. NOTPUR <MOVEI B* 5>
  484. <JRST LEAVE>
  485. TTYGET <SETZ>
  486. <SIXBIT "TTYGET">
  487. <MOVEI 2>
  488. <MOVEM A>
  489. <MOVEM B>
  490. <MOVEM C>
  491. <MOVEM D>
  492. <SETZM E>
  493. TTYSET <SETZ>
  494. <SIXBIT "TTYSET">
  495. <MOVEI 2>
  496. <A>
  497. <B>
  498. <C>
  499. <SETZ D>)
  500. >
  501. <IFN10X (<TITLE GETSYS> ; "RETURN T IF 10X"
  502. <DECLARE ("VALUE" <OR ATOM FALSE>)>
  503. <PUSHJ P* IGETSYS>
  504. <JRST FINIS>
  505. <INTERNAL-ENTRY IGETSYS 0>
  506. <SUBM M* (P)>
  507. <HRROI A* 3>
  508. <HRLOI B* *600015*> ; "NUL/NIL DEVICE"
  509. <MOVEI C* 0>
  510. <DEVST>
  511. <JFCL>
  512. <CAMN C* [<(*472531*) *400000*>]>
  513. <JRST TOPS20>
  514. <MOVSI A* <TYPE-CODE ATOM>>
  515. <MOVE B* <MQUOTE T>>
  516. <JRST MPOPJ>
  517. TOPS20 <MOVSI A* <TYPE-CODE FALSE>>
  518. <MOVEI B*>
  519. <JRST MPOPJ>)
  520. ()>
  521. ; "ATMFIX takes an ATOM and returns a word which is the PNAME of the
  522. atom appropriately XORed."
  523. <TITLE ATMFIX>
  524. <DECLARE ("VALUE" FIX ATOM)>
  525. <DPUSH TP* (AB)>
  526. <PUSHJ P* ATMFIX1>
  527. <JRST FINIS>
  528. <INTERNAL-ENTRY ATMFIX1 1>
  529. <SUBM M* (P)>
  530. <MOVE A* <TYPE-WORD FIX>>
  531. <MOVE B* (TP)>
  532. <MOVE B* 3(B)>
  533. <MOVE C* <MQUOTE <RGLOC SRUNM T>>>
  534. <ADD C* GLOTOP 1>
  535. <MOVE C* 1(C)>
  536. <MOVE C* 1(C)>
  537. <XOR B* C>
  538. <SUB TP* [<2 (2)>]>
  539. <JRST MPOPJ>
  540. ; "FIXSTR is the inverse of ATMFIX. It takes a FIX and returns a STRING
  541. which is the PNAME of the ATOM which was previously given to ATMFIX."
  542. <TITLE FIXSTR>
  543. <DECLARE ("VALUE" STRING FIX)>
  544. <DPUSH TP* (AB)>
  545. <PUSHJ P* FIXSTR1>
  546. <JRST FINIS>
  547. <INTERNAL-ENTRY FIXSTR1 1>
  548. <SUBM M* (P)>
  549. <MOVE B* <MQUOTE <RGLOC SAVSTR T>>>
  550. <ADD B* GLOTOP 1>
  551. <MOVE A* (B)>
  552. <MOVE B* 1(B)>
  553. <SKIPN C* (TP)>
  554. <JRST FIXFLS>
  555. <MOVE D* <MQUOTE <RGLOC SRUNM T>>>
  556. <ADD D* GLOTOP 1>
  557. <MOVE D* 1(D)>
  558. <XOR C* 1(D)>
  559. <MOVEM C* 1(B)>
  560. FIXOUT <SUB TP* [<2 (2)>]>
  561. <JRST MPOPJ>
  562. FIXFLS <MOVE A* <TYPE-WORD FALSE>>
  563. <SETZ B*>
  564. <JRST FIXOUT>
  565. ; "CLEAR-UV BLTs zeros into a UVECTOR."
  566. <TITLE CLEAR-UV>
  567. <DECLARE ("VALUE" UVECTOR UVECTOR)>
  568. <DPUSH TP* (AB)>
  569. <PUSHJ P* CUV>
  570. <JRST FINIS>
  571. <INTERNAL-ENTRY CUV 1>
  572. <SUBM M* (P)>
  573. <MOVE A* (TP)>
  574. <SETZM (A)>
  575. <HLRZ B* A>
  576. <MOVNS B>
  577. <SUBI B* 1>
  578. <ADD B* A>
  579. <HRL A* A>
  580. <ADDI A* 1>
  581. <BLT A* (B)>
  582. <MOVE A* -1(TP)>
  583. <MOVE B* (TP)>
  584. <SUB TP* [<2 (2)>]>
  585. <JRST MPOPJ>
  586. <TITLE DISPATCH>
  587. <DECLARE ("VALUE" ANY OFFSET "OPTIONAL" ANY)>
  588. <MOVE A* AB>
  589. LOOP <DPUSH TP* (AB)>
  590. <ADD AB* [<(2) 2>]>
  591. <JUMPL AB* LOOP>
  592. <HLRES A>
  593. <ASH A* -1>
  594. <ADDI A* TABEND>
  595. <PUSHJ P* @ (A) 1>
  596. <JRST FINIS>
  597. <DISP2>
  598. TABEND <DISP1>
  599. <INTERNAL-ENTRY DISP1 1>
  600. <PUSH TP* <TYPE-WORD FALSE>>
  601. <PUSH TP* [0]>
  602. <INTERNAL-ENTRY DISP2 2>
  603. <SUBM M* (P)>
  604. <MOVE A* <MQUOTE <RGLOC DISPATCH-TABLE T>>>
  605. <ADD A* GLOTOP 1>
  606. <MOVE A* 1(A)> ; "get dispatch table"
  607. <GETYP C* -1(TP)>
  608. <SKIPG B* -2(TP)> ; "pick up offset"
  609. <JRST DOOPT>
  610. <ADDI A* -1(B)> ; "point to instruction"
  611. <CAIE C* <TYPE-CODE FALSE>>
  612. <JRST ONEARG>
  613. NOARG <XCT (A)>
  614. <SUB TP* [<(4) 4>]>
  615. <JRST MPOPJ>
  616. ONEARG <XCT (A)>
  617. <SUB TP* [<(2) 2>]>
  618. <JRST MPOPJ>
  619. DOOPT <MOVNS B>
  620. <CAIE C* <TYPE-CODE FALSE>>
  621. <JRST [<ADDI A* (B)> ; "point to next"
  622. <JRST ONEARG>]>
  623. <ADDI A* -1(B)>
  624. <JRST NOARG>
  625. ;"READER FOR ZORK: TAKES INPUT BUFFER AND PROMPT, RETURNS NUMBER OF
  626. CHARACTERS IN BUFFER.
  627. AC USAGE:
  628. O: RANDOM, MAINLY FOR SIOTING
  629. A: ON ITS, .IOT <INCHAN>,B; ON 10X, PRIMARY INPUT JFN
  630. B: USUALLY CHARACTER LAST READ, BUT CLOBBERED FOR SIOTS AND SOUTS
  631. C: USUALLY COUNT OF CHARACTERS READ; MAY BE FROBBED TEMPORARILY WHEN SOUTING
  632. D: ILDB POINTER TO NEXT CHAR IN BUFFER
  633. E: <0 --> RUBOUT SHOULD FLUSH A CHAR
  634. =0 --> RUBOUT SHOULD ECHO \<RUBBED OUT>
  635. >0 --> RUBOUT SHOULD ECHO <RUBBED OUT>--USED BY WDFLS
  636. PVP: OUTCHAN
  637. P: # CHARS IN BUFFER
  638. ARGS: INPUT BUFFER PROMPT ALTMODE ONLY TERMINATOR?"
  639. <TITLE READST>
  640. <DECLARE ("VALUE" FIX STRING STRING <OR ATOM FALSE>)>
  641. <DPUSH TP* (AB)>
  642. <DPUSH TP* 2(AB)>
  643. <DPUSH TP* 4(AB)>
  644. <PUSHJ P* IREADST>
  645. <JRST FINIS>
  646. <INTERNAL-ENTRY IREADST 1>
  647. <SUBM M* (P)>
  648. <IFN10X
  649. (<MOVEI E* 0>
  650. <MOVEI A* *400000*>
  651. <MOVEI B* 0>
  652. <STIW> ; "NO INTERRUPTS IN HERE")
  653. (<MOVE A* <MQUOTE <RGLOC RUBOUT? T>>>
  654. <ADD A* GLOTOP 1>
  655. <MOVEI E* 0>
  656. <SKIPGE 1(A)>
  657. <MOVNI E* 1>)>
  658. <MOVE A* <MQUOTE <RGLOC OUTCHAN T>>>
  659. <ADD A* GLOTOP 1>
  660. <MOVE A* 1(A)>
  661. <MOVE PVP* 1(A)> ; "OUTPUT CHANNEL/JFN"
  662. <MOVE A* <MQUOTE <RGLOC INCHAN T>>>
  663. <ADD A* GLOTOP 1>
  664. <MOVE A* 1(A)>
  665. <MOVE A* 1(A)> ; "GET CHANNEL #"
  666. <IFN10X
  667. ()
  668. (<LSH A* *27*>
  669. <IOR A* [<*IOT B>]>)> ; "JFN FOR 10X, I/O INS FOR ITS"
  670. <PUSHJ P* PPRMPT>
  671. <HRRZ C* -5(TP)>
  672. <PUSH P* C> ; "# CHARS IN STRING"
  673. <MOVEI C* 0>
  674. <MOVE D* -4(TP)> ; "BUFFER POINTER"
  675. CHRLOP <IFN10X
  676. (<BIN>)
  677. (<XCT A>)> ; "GET CHAR IN B"
  678. <SKIPGE INTFLG>
  679. <JRST INTHAK> ; "INTERRUPTS?"
  680. INTBCK <CAIGE B* *40*> ; "NOT SPECIAL?"
  681. <JRST SPCCHR>
  682. <CAIN B* *177*> ; "RUBOUT?"
  683. <JRST RUBOUT>
  684. PUTCHR <PUSHJ P* PUTCHR1>
  685. <JRST CHRLOP>
  686. <MOVEI B* *33*> ; "PUTCHR1 SKIPS IF BUFFER FULL"
  687. SPCCHR <CAIE B* *15*>
  688. <CAIN B* *37*> ; "EOL"
  689. <JRST CRHACK>
  690. <CAIN B* *33*> ; "ALTMODE"
  691. <JRST [<PUSHJ P* PCRLF>
  692. <JRST RDDONE>]>
  693. <JUMPE B* BUFFLS>
  694. <CAIE B* %<ASCII !\>>
  695. <CAIN B* %<ASCII !\>>
  696. <JRST BUFFLS> ; "KILL BUFFER"
  697. <CAIN B* %<ASCII !\>>
  698. <JRST WDFLS>
  699. <CAIN B* *10*>
  700. <JRST RUBOUT> ; "BS=RUBOUT"
  701. <CAIE B* %<ASCII !\>>
  702. <CAIN B* %<ASCII !\>>
  703. <JRST REBUF>
  704. <CAIN B* *14*>
  705. <JRST CREBUF> ; "BUFFER REDISPLAY"
  706. <CAIN B* 7>
  707. <JRST FAKINT> ; "CTRL-G SHOULD BE PROCESSED"
  708. <CAIN B* *12*> ; "IGNORE CTRL-J, SINCE ^M ADDS IT"
  709. <JRST CHRLOP>
  710. <JRST PUTCHR>
  711. PUTCHR1 <IDPB B* D> ; "STUFF IT OUT"
  712. <ADDI C* 1>
  713. <CAML C* -1(P)> ; "BUFFER FULL?"
  714. <AOS (P)> ; "YES, SKIP"
  715. <POPJ P*>
  716. FAKINT <PUSH P* A>
  717. <PUSH P* E>
  718. <PUSH P* PVP>
  719. <EXCH C* -3(P)>
  720. <SUB C* -3(P)>
  721. <HRLI C* <TYPE-CODE STRING>>
  722. <PUSH TP* C>
  723. <PUSH TP* D> ; "MAKE RESTED STRING TO PUSH"
  724. <PUSH TP* <PQUOTE "CHAR">>
  725. <PUSH TP* <MQUOTE "CHAR">>
  726. <PUSH TP* <TYPE-WORD CHARACTER>>
  727. <PUSH TP* B>
  728. <PUSH TP* <TYPE-WORD CHANNEL>>
  729. <MOVE B* <MQUOTE <RGLOC INCHAN T>>>
  730. <ADD B* GLOTOP 1>
  731. <PUSH TP* 1(B)>
  732. <IFN10X
  733. (<MOVEI A* *400000*>
  734. <MOVE B* [<(*002000*) *200000*>]>
  735. <STIW>)
  736. ()>
  737. <MCALL 3 INTERRUPT>
  738. <IFN10X
  739. (<MOVEI A* *400000*>
  740. <MOVEI B* 0>
  741. <STIW>)
  742. ()>
  743. <POP TP* D>
  744. <POP TP* C>
  745. <ADD C* -3(P)>
  746. <EXCH C* -3(P)>
  747. <POP P* PVP>
  748. <POP P* E>
  749. <POP P* A>
  750. <PUSHJ P* PPRMPT> ; "REDISPLAY PROMPT TO SHOW THAT BACK FROM INT"
  751. <JRST CHRLOP>
  752. INTHAK <PUSH P* PVP> ; "SAVE OUTCHAN"
  753. <EXCH C* -1(P)>
  754. <SUB C* -1(P)>
  755. <HRLI C* <TYPE-CODE STRING>> ; "MAKE C HAVE A VALID TYPE WORD FOR STRING"
  756. <#OPCODE!-OP!-PACKAGE *5000000000* [<(*001111*) *000311*>]>
  757. <POP P* PVP>
  758. <HRRZS C>
  759. <ADD C* (P)>
  760. <EXCH C* (P)>
  761. <JRST INTBCK> ; "RESTORE EVERYTHING, AND BACK"
  762. CRHACK <IFN10X
  763. (<CAIE B* *37*> ; "TURN EOL INTO CRLF"
  764. <JRST CRHACK1>
  765. <MOVEI B* *15*>
  766. <PUSHJ P* CHROUT>
  767. <MOVEI B* *12*>
  768. <PUSHJ P* CHROUT>
  769. <MOVEI B* *15*>)
  770. ()>
  771. CRHACK1 <SKIPL (TP)> ; "CAN CR TERMINATE?"
  772. <JRST RDDONE> ; "YES!"
  773. <PUSHJ P* PUTCHR1>
  774. <CAIA>
  775. <JRST RDDONE>
  776. <MOVEI B* *12*> ; "FOLLOW WITH LF"
  777. <JRST PUTCHR>
  778. <IFN10X ()
  779. (
  780. SIOT <SETZ>
  781. <SIXBIT "SIOT">
  782. <MOVSI *4000*> ; "TURN OFF DISPLAYNESS"
  783. <MOVE PVP>
  784. <B>
  785. <SETZ O>
  786. DSIOT <SETZ>
  787. <SIXBIT "SIOT">
  788. <MOVE PVP>
  789. <B>
  790. <SETZ O>)>
  791. CHROUT <IFN10X
  792. (<PUSH P* A>
  793. <MOVE A* PVP>
  794. <BOUT>
  795. <POP P* A>)
  796. (<*CALL [<SETZ>
  797. <SIXBIT "IOT">
  798. <MOVE PVP>
  799. <SETZ B>]>
  800. <*LOSE 1000>)>
  801. <POPJ P*>
  802. RDDONE <MOVE A* <MQUOTE <RGLOC SCRIPT-CHANNEL T>>>
  803. <ADD A* GLOTOP 1>
  804. <SKIPL 1(A)> ; "SKIPS IF SCRIPTING ON"
  805. <JRST RDDONE1>
  806. <PUSH P* C> ; "SAVE CHARACTER COUNT"
  807. <PUSH TP* (A)>
  808. <PUSH TP* 1(A)>
  809. <PUSH TP* -5(TP)> ; "PROMPT"
  810. <PUSH TP* -5(TP)>
  811. <PUSH TP* (A)>
  812. <PUSH TP* 1(A)>
  813. <MCALL 2 PRINTSTRING>
  814. <PUSH TP* -7(TP)>
  815. <PUSH TP* -7(TP)> ; "BUFFER"
  816. <PUSH TP* -3(TP)>
  817. <PUSH TP* -3(TP)> ; "SCRIPT CHANNEL"
  818. <PUSH TP* <TYPE-WORD FIX>>
  819. <PUSH TP* (P)> ; "# CHARACTERS"
  820. <MCALL 3 PRINTSTRING>
  821. <DPUSH TP* <PQUOTE <STRING <ASCII 13> <ASCII 10>>>>
  822. <PUSH TP* -3(TP)>
  823. <PUSH TP* -3(TP)>
  824. <PUSH TP* <TYPE-WORD FIX>>
  825. <PUSH TP* [2]>
  826. <MCALL 3 PRINTSTRING>
  827. <SUB TP* [<(2) 2>]>
  828. <POP P* C>
  829. RDDONE1 <IFN10X
  830. (<MOVEI A* *400000*>
  831. <MOVE B* [<(*002004*) *000000*>]>
  832. <STIW>)
  833. ()>
  834. <MOVSI A* <TYPE-CODE FIX>>
  835. <MOVE B* C>
  836. <SUB P* [<(1) 1>]>
  837. <SUB TP* [<(6) 6>]>
  838. <JRST MPOPJ>
  839. CREBUF <IFN10X
  840. (<JRST REBUF>)
  841. (<MOVEI O* 2>
  842. <MOVE B* <MQUOTE "C">>
  843. <*CALL DSIOT> ; "THIS HAS DISPLAY BIT ON"
  844. <*LOSE 1000>
  845. <JRST REBUF1>)>
  846. REBUF <IFN10X
  847. (<PUSH P* C>
  848. <PUSHJ P* PCRLF> ; "CR"
  849. <PUSHJ P* PPRMPT>
  850. <MOVE B* -4(TP)>
  851. <MOVN C* (P)>
  852. <SKIPE C>
  853. <SOUT> ; "BUFFER"
  854. <POP P* C>)
  855. (<PUSHJ P* PCRLF>
  856. REBUF1 <PUSHJ P* PPRMPT> ; "COMMON CODE FOR CTRL-D AND CTRL-L"
  857. <MOVE B* -4(TP)>
  858. <MOVE O* C>
  859. <*CALL SIOT>
  860. <*LOSE 1000>)>
  861. <JRST CHRLOP> ; "GO BACK FOR NEXT CHAR"
  862. PCRLF <IFN10X
  863. (<MOVE B* <MQUOTE %<STRING <ASCII 13> <ASCII 10>>>>
  864. <PUSH P* C>
  865. <MOVNI C* 2>
  866. <SOUT>
  867. <POP P* C>)
  868. (<MOVE B* <MQUOTE %<STRING <ASCII 13> <ASCII 10>>>>
  869. <MOVEI O* 2>
  870. <*CALL SIOT>
  871. <*LOSE 1000>)>
  872. <POPJ P*>
  873. PPRMPT <IFN10X
  874. (<MOVE B* -2(TP)>
  875. <PUSH P* C>
  876. <HRRZ C* -3(TP)>
  877. <MOVNS C>
  878. <SKIPE C>
  879. <SOUT>
  880. <POP P* C>)
  881. (<MOVE B* -2(TP)>
  882. <HRRZ O* -3(TP)>
  883. <*CALL SIOT>
  884. <*LOSE 1000>)>
  885. <POPJ P*>
  886. BUFFLS <MOVEI C* 0> ; "THROW EVERYTHING AWAY"
  887. <MOVE D* -4(TP)>
  888. <PUSHJ P* PCRLF>
  889. <PUSHJ P* PPRMPT>
  890. <JRST CHRLOP>
  891. RUBOUT <PUSHJ P* RRUBOUT>
  892. <JRST CHRLOP>
  893. RRUBOUT <JUMPE C* [<SUB P* [<(1) 1>]>
  894. <JRST REBUF>]> ; "IF RUBBING OUT PAST BEG OF LINE, REDO PROMPT &C"
  895. <IFN10X
  896. ()
  897. (<JUMPL E* RUBFLS> ; "IF E IS 0, HAVE TO PRINT \ FIRST")>
  898. <JUMPG E* RUBOUT1>
  899. <MOVEI B* <ASCII 92>>
  900. <PUSHJ P* CHROUT>
  901. RUBOUT1 <LDB B* D> ; "GET CHAR BEING FLUSHED"
  902. <PUSHJ P* CHROUT>
  903. RUBOUT2 <ADD D* [<(*70000*) 0>]>
  904. <TLNE D* *400000*>
  905. <ADD D* [<(*347777*) *777777*>]>
  906. <SUBI C* 1>
  907. <POPJ P*>
  908. <IFN10X ()
  909. (
  910. RUBFLS <LDB B* D> ; "GET CHAR"
  911. <CAIN B* *12*>
  912. <JRST [<MOVE B* <MQUOTE <STRING "U">>> ; "LINE STARVE"
  913. <JRST RUBFLO>]>
  914. <CAIN B* *15*>
  915. <JRST RUBFCR>
  916. <MOVE B* <MQUOTE <STRING "X">>>
  917. RUBFLO <MOVEI O* 2>
  918. <*CALL DSIOT>
  919. <*LOSE 1000>
  920. <JRST RUBOUT2>
  921. RUBFCR <PUSH P* C>
  922. <PUSH P* D>
  923. <PUSH P* E>
  924. <MOVE D* -4(TP)> ; "POINTER TO BUFFER"
  925. <HRRZ E* -3(TP)> ; "CURRENT HORIZONTAL POSITION--PROMPT"
  926. <SOJLE C* RUBCRE1> ; "FLUSH CR FROM END"
  927. RUBCRL <ILDB B* D>
  928. <CAIN B* *15*>
  929. <JRST [<MOVEI E* 0>
  930. <JRST RUBCRE>]>
  931. <CAIN B* *12*>
  932. <JRST RUBCRE>
  933. <ADDI E* 1>
  934. RUBCRE <SOJG C* RUBCRL>
  935. RUBCRE1 <ADDI E* 8>
  936. <MOVEI O* 2>
  937. <MOVE B* <MQUOTE "H">>
  938. <*CALL DSIOT>
  939. <*LOSE 1000>
  940. <*CALL [<SETZ>
  941. <SIXBIT "IOT">
  942. <PVP>
  943. <SETZ E>]> ; "SET HORIZONTAL POSITION"
  944. <*LOSE 1000>
  945. <POP P* E>
  946. <POP P* D>
  947. <POP P* C>
  948. <JRST RUBOUT2>)>
  949. WDFLS <JUMPE C* REBUF> ; "NOTHING TO FLUSH"
  950. <JUMPL E* WDFLS1> ; "CAN RUBOUTS HAPPEN?"
  951. <MOVEI B* <ASCII 92>>
  952. <PUSHJ P* CHROUT>
  953. <ADDI E* 1> ; "INHIBIT \ WHEN DOING RUBOUTS"
  954. WDFLS1 <LDB B* D> ; "GET CHAR BEING FLUSHED"
  955. <CAIE B* *40*> ; "SPACE?"
  956. <CAIN B* *15*> ; "CR?"
  957. <JRST WDFLS11>
  958. <CAIE B* *12*>
  959. <CAIN B* *11*>
  960. <JRST WDFLS11>
  961. <CAIE B* *54*> ; "COMMA"
  962. <JRST WDFLS2>
  963. WDFLS11 <PUSHJ P* RRUBOUT> ; "RUB IT OUT"
  964. <JUMPE C* WDFLSO> ; "EMPTY BUFFER"
  965. <JRST WDFLS1>
  966. WDFLS2 <LDB B* D>
  967. <CAIE B* *40*>
  968. <CAIN B* *15*>
  969. <JRST WDFLSO>
  970. <CAIE B* *12*>
  971. <CAIN B* *11*>
  972. <JRST WDFLSO>
  973. <CAIN B* *54*>
  974. <JRST WDFLSO>
  975. <PUSHJ P* RRUBOUT>
  976. <JUMPG C* WDFLS2>
  977. WDFLSO <JUMPLE E* CHRLOP>
  978. <MOVEI B* <ASCII 92>>
  979. <PUSHJ P* CHROUT>
  980. <MOVEI E* 0>
  981. <JRST CHRLOP>
  982. <TITLE TTY-INIT>
  983. <DECLARE ("VALUE" ATOM <OR ATOM FALSE>)>
  984. <DPUSH TP* (AB)>
  985. <PUSHJ P* IINIT>
  986. <JRST FINIS>
  987. <INTERNAL-ENTRY IINIT 1>
  988. <SUBM M* (P)>
  989. <MOVE A* <MQUOTE <RGLOC OUTCHAN T>>>
  990. <ADD A* GLOTOP 1>
  991. <MOVE A* 1(A)> ; "OUTCHAN"
  992. <IFN10X
  993. (<MOVEI B* 70>
  994. <SKIPN 25(A)>
  995. <MOVEM B* 25(A)> ; "MAKE CHANNEL WIDTH NON-ZERO")
  996. ()>
  997. <MOVE A* 1(A)>
  998. <IFN10X
  999. (<SKIPL (TP)> ; "SAVE CURRENT STATE?"
  1000. <JRST STMODE>
  1001. <MOVE E* <MQUOTE <RGLOC RUVEC T>>>
  1002. <ADD E* GLOTOP 1>
  1003. <MOVE E* 1(E)>
  1004. STMODE <RFMOD>
  1005. <SKIPGE (TP)>
  1006. <MOVEM B* (E)> ; "MODE WORD"
  1007. <TRO B* *140000*>
  1008. <TRZ B* *030000*>
  1009. <SFMOD>
  1010. <SKIPL (TP)>
  1011. <JRST SCMODE>
  1012. <RFCOC> ; "CONTROL CHARACTER FORMATTING"
  1013. <MOVEM B* 1(E)>
  1014. <MOVEM C* 2(E)>
  1015. SCMODE <MOVE B* <MQUOTE #2 {0 1 1 1 0 1 1 2 0 3 3 1 2 3 1 1 1 1}>>
  1016. <MOVE B* 1(B)>
  1017. <MOVE C* <MQUOTE #2 {1 1 1 1 1 0 0 1 1 1 1 1 1 0}>>
  1018. <MOVE C* 1(C)>
  1019. <SFCOC> ; "THIS DOES ECHOING FOR CTRL-CHARS"
  1020. <MOVEI A* *400000*>
  1021. <SKIPL (TP)>
  1022. <JRST SIMODE>
  1023. <RTIW>
  1024. <MOVEM B* 3(E)>
  1025. SIMODE <MOVE B* [<(*2004*) 0>]>
  1026. <STIW>
  1027. <SKIPL (TP)>
  1028. <JRST INTSET>
  1029. <MCALL 0 ACTIVATE-CHARS>
  1030. <MOVE C* <MQUOTE <RGLOC ACT-STRING T>>>
  1031. <ADD C* GLOTOP 1>
  1032. <MOVEM A* (C)>
  1033. <MOVEM B* 1(C)>
  1034. INTSET <DPUSH TP* <PQUOTE "">>
  1035. <MCALL 1 ACTIVATE-CHARS>)
  1036. (<*CALL [<SETZ>
  1037. <SIXBIT "CNSGET">
  1038. <A>
  1039. <MOVEM B>
  1040. <MOVEM B>
  1041. <MOVEM B>
  1042. <MOVEM B>
  1043. <SETZM B>]>
  1044. <*LOSE 1000>
  1045. <TLNN B* *40000*> ; "TEST %TOERS"
  1046. <JRST INIT1>
  1047. <MOVE B* <MQUOTE <RGLOC RUBOUT? T>>>
  1048. <ADD B* GLOTOP 1>
  1049. <MOVE C* <MQUOTE T>>
  1050. <MOVEM C* 1(B)>
  1051. <MOVSI C* <TYPE-CODE ATOM>>
  1052. <MOVEM C* (B)> ; "SETG RUBOUT? TO T"
  1053. INIT1 <SKIPL (TP)>
  1054. <JRST DTTYST>
  1055. <MOVE B* <MQUOTE <RGLOC RUVEC T>>>
  1056. <ADD B* GLOTOP 1>
  1057. <MOVE B* 1(B)>
  1058. <*CALL [<SETZ>
  1059. <SIXBIT "TTYGET">
  1060. <A>
  1061. <MOVEM (B)>
  1062. <SETZM 1(B)>]>
  1063. <*LOSE 1000>
  1064. DTTYST <*CALL [<SETZ>
  1065. <SIXBIT "TTYSET">
  1066. <A>
  1067. <MOVE [<(*022020*) *202020*>]>
  1068. <SETZ [<(*032022*) *220222*>]>]>
  1069. <*LOSE 1000>)>
  1070. TTYIDN <SUB TP* [<(2) 2>]>
  1071. <MOVSI A* <TYPE-CODE ATOM>>
  1072. <MOVE B* <MQUOTE T>>
  1073. <JRST MPOPJ>
  1074. <TITLE TTY-UNINIT>
  1075. <DECLARE ("VALUE" ATOM)>
  1076. <PUSHJ P* IUNINIT>
  1077. <JRST FINIS>
  1078. <INTERNAL-ENTRY IUNINIT 0>
  1079. <SUBM M* (P)>
  1080. <MOVE A* <MQUOTE <RGLOC OUTCHAN T>>>
  1081. <ADD A* GLOTOP 1>
  1082. <MOVE A* 1(A)>
  1083. <MOVE A* 1(A)>
  1084. <IFN10X
  1085. (<MOVE D* <MQUOTE <RGLOC RUVEC T>>>
  1086. <ADD D* GLOTOP 1>
  1087. <MOVE D* 1(D)>
  1088. <MOVE B* (D)>
  1089. <SFMOD> ; "RESTORE MODES"
  1090. <MOVE B* 1(D)>
  1091. <MOVE C* 2(D)>
  1092. <SFCOC>
  1093. <MOVEI A* *400000*>
  1094. <MOVE B* 3(D)>
  1095. <STIW>
  1096. <MOVE D* <MQUOTE <RGLOC ACT-STRING T>>>
  1097. <ADD D* GLOTOP 1>
  1098. <PUSH TP* (D)>
  1099. <PUSH TP* 1(D)>
  1100. <MCALL 1 ACTIVATE-CHARS> ; "RESTORE INTERRUPTS")
  1101. (<MOVE B* <MQUOTE <RGLOC RUVEC T>>>
  1102. <ADD B* GLOTOP 1>
  1103. <MOVE B* 1(B)>
  1104. <*CALL [<SETZ>
  1105. <SIXBIT "TTYSET">
  1106. <A>
  1107. <(B)>
  1108. <SETZ 1(B)>]>
  1109. <*LOSE 1000>)>
  1110. <MOVE B* <MQUOTE T>>
  1111. <MOVSI A* <TYPE-CODE ATOM>>
  1112. <JRST MPOPJ>
  1113. <TITLE EXCRUCIATINGLY-UNTASTEFUL-CODE>
  1114. <DECLARE ("VALUE" ATOM)>
  1115. <PUSHJ P* IEUC>
  1116. <JRST FINIS>
  1117. <INTERNAL-ENTRY IEUC 0>
  1118. <SUBM M* (P)>
  1119. <MOVE A* <MQUOTE <RGLOC PRSVEC T>>>
  1120. <ADD A* GLOTOP 1>
  1121. <HRRZ A* 1 (A)>
  1122. <ADDI A* 1>
  1123. <MOVEM A* *60*>
  1124. <ADDI A* 2>
  1125. <MOVEM A* *61*>
  1126. <ADDI A* 2>
  1127. <MOVEM A* *62*>
  1128. <MOVE A* <TYPE-WORD ATOM>>
  1129. <MOVE B* <MQUOTE T>>
  1130. <JRST MPOPJ>