scrmbl.1 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. TITLE SCRMBL
  2. .MLLIT=1
  3. A=1
  4. B=2
  5. C=3
  6. D=4
  7. E=5
  8. X1=6
  9. X2=7
  10. X3=10
  11. X4=11
  12. DPT=12
  13. T=13
  14. TT=14
  15. SCR=16
  16. P=17
  17. TYIC==1 ; tty input
  18. TYOC==2 ; tty output
  19. DKIC==3 ; input source
  20. DKOC==4 ; output sink
  21. DTYOC==5 ; display output (for smearing)
  22. REVRSE: 0 ; 0 for scramble, -1 for unscramble
  23. ; starting location
  24. GO: MOVEI P,PDL
  25. SETZB DPT,EOF'
  26. SETZ OUTPTR'
  27. ; open tty channels
  28. .OPEN TYIC,[24,,'TTY]
  29. .LOSE
  30. .OPEN TYOC,[5,,'TTY]
  31. .LOSE
  32. .CALL [SETZ ? 'CNSGET ? MOVEI TYOC ? MOVEM ? MOVEM ? SETZM A]
  33. SETZB A,SOFTTY'
  34. CAIN A,%TNSFW
  35. SETOM SOFTTY ; software tty
  36. .STATUS TYOC,A
  37. ANDI A,77
  38. SETZM DISTTY
  39. CAIE A,2
  40. JRST RDJCL
  41. ; here display tty, so open a channel in display mode
  42. SETOM DISTTY' ; display tty
  43. .OPEN DTYOC,[21,,'TTY]
  44. .LOSE
  45. ; read command, if any
  46. RDJCL: .SUSET [.ROPTION,,A]
  47. TLNN A,40000 ; any jcl?
  48. JRST NOJCL
  49. .BREAK 12,[5,,JCLBUF] ; get it
  50. MOVE A,[440700,,JCLBUF]
  51. MOVEM A,COMPTR'
  52. ; I THINK DEFAULT SHOULD BE LCF = 99% OF USAGE (MARC -- 2/13/78)
  53. ; dir defaults to sname
  54. ; .SUSET [.RSNAME,,A]
  55. ; MOVEM A,INDIR
  56. .SUSET [.RXJNAME,,A]
  57. CAMN A,[SIXBIT /UNSCR/]
  58. SETOM REVRSE
  59. ; parse jcl
  60. MOVEI E,INDEV
  61. PUSHJ P,SCNAME
  62. MOVEI E,OUTDEV
  63. PUSHJ P,SCNAME
  64. PUSHJ P,GETSYL
  65. ; set up default for unscrambling
  66. ; if scrambling, default is fn1 plus letter Z on end
  67. ; if unscrambling, default is fn1 with letter Z removed from end
  68. INDEF: SKIPE OUTFN1
  69. JRST DODEF
  70. SKIPN REVRSE
  71. JRST SCRDEF
  72. ; here unscrambling
  73. MOVE A,[440600,,INFN1]
  74. INLOOP: ILDB B,A
  75. CAIE B,'Z
  76. JRST INDEF1
  77. CAMN A,[600,,INFN1]
  78. JRST INMAKE
  79. MOVE C,A
  80. ILDB B,C
  81. JUMPN B,INLOOP
  82. INMAKE: SETZ C, ; dump a space
  83. JRST DMAKE
  84. INDEF1: CAME A,[600,,INFN1]
  85. JRST INLOOP
  86. JRST INMAKE
  87. ; set up defaults for scrambling
  88. SCRDEF: MOVE A,[440600,,INFN1]
  89. OULOOP: CAMN A,[600,,INFN1]
  90. JRST OUMAKE
  91. ILDB B,A
  92. JUMPE B,OUMAKE
  93. JRST OULOOP
  94. OUMAKE: MOVEI C,'Z ; dump a Z
  95. ; here dump a space or a Z into file name
  96. DMAKE: MOVE B,INFN1
  97. MOVEM B,OUTFN1
  98. HRRI A,OUTFN1
  99. DPB C,A
  100. ; set up output file defaults
  101. DODEF: MOVE A,INDEV
  102. SKIPN OUTDEV
  103. MOVEM A,OUTDEV
  104. MOVE A,INFN1
  105. SKIPN OUTFN1
  106. MOVEM A,OUTFN1
  107. MOVE A,INFN2
  108. SKIPN OUTFN2
  109. MOVEM A,OUTFN2
  110. MOVE A,INDIR
  111. SKIPN OUTDIR
  112. MOVEM A,OUTDIR
  113. ; here to hack second name cruftage: if no second name given, it
  114. ; is set up so that input and output files will have same second name
  115. ; creation dates of files are always set up to be the same
  116. SKIPE INFN2
  117. JRST OPNFLS
  118. MOVSI A,(SIXBIT ">")
  119. MOVEM A,INFN2
  120. ; open input file
  121. OPNFLS: .CALL [SETZ ? SIXBIT /OPEN/ ? [.BII,,DKIC]
  122. INDEV ? INFN1 ? INFN2 ? INDIR ? SETZB LSTERR']
  123. JRST INFAIL
  124. ; read its creation date
  125. .CALL [SETZ ? 'RFDATE ? MOVEI DKIC ? SETZM CDATE']
  126. .LOSE
  127. SKIPE OUTFN2
  128. JRST SMASH
  129. ; read its second name if necessary
  130. .CALL [SETZ ? SIXBIT /RCHST/ ? MOVEI DKIC ? MOVEM ? MOVEM ? MOVEM OUTFN2 ? SETZM]
  131. .LOSE
  132. MOVE A,OUTFN2
  133. MOVEM A,INFN2
  134. ; check if (un)scring to self
  135. SMASH: MOVE A,INFN1
  136. CAME A,OUTFN1
  137. JRST ASK
  138. MOVE A,INFN2
  139. CAME A,OUTFN2
  140. JRST ASK
  141. MOVE A,INDEV
  142. CAME A,OUTDEV
  143. JRST ASK
  144. MOVE A,INDIR
  145. CAME A,OUTDIR
  146. JRST ASK
  147. ; going to same file, ask for confirmation
  148. MOVEI A,[ASCIZ /Uns/]
  149. SKIPN REVRSE
  150. MOVEI A,[ASCIZ /S/]
  151. PUSHJ P,TYPE7
  152. MOVEI A,[ASCIZ /crambling to self? Confirm? /]
  153. PUSHJ P,TYPE7
  154. PUSHJ P,YESNO
  155. CAIN A,"Y
  156. JRST ASK
  157. MOVEI A,[ASCIZ /Aborted./]
  158. PUSHJ P,TYPE7
  159. JRST KILL
  160. ; ask yes/no question
  161. YESNO: .IOT TYIC,A
  162. CAIN A,^Q
  163. JRST KILL ; ^Q means kill
  164. CAIL A,"a
  165. CAILE A,"z
  166. CAIA
  167. SUBI A,40
  168. .IOT TYOC,[^M]
  169. .IOT TYOC,[^J]
  170. POPJ P,
  171. ; get password
  172. REASK: .IOT TYOC,[^M]
  173. .IOT TYOC,[^J]
  174. ASK: MOVEI A,[ASCIZ /Password? /]
  175. PUSHJ P,TYPE7
  176. PUSHJ P,GETSCR ; read password
  177. ; confirm password
  178. CONFRM: .IOT TYOC,[^M]
  179. .IOT TYOC,[^J]
  180. MOVE A,SCR
  181. PUSHJ P,WTYPE6 ; type it out (briefly)
  182. PUSHJ P,PERASE ; now flush it
  183. ; get confirmation
  184. DBLCHK: MOVEI A,[ASCIZ /Okay? /] ; confirm the password
  185. PUSHJ P,TYPE7
  186. PUSHJ P,YESNO
  187. CAIN A,"N ; N is no
  188. JRST REASK
  189. CAIN A,"R
  190. JRST CONFRM ; R is reconfirm
  191. CAIE A,"Y
  192. JRST DBLCHK ; Y is yes, anything else asks again
  193. ; open output file
  194. .CALL [SETZ ? SIXBIT /OPEN/ ? [.BIO,,DKOC]
  195. OUTDEV ? [SIXBIT "_SCRM_"] ? [SIXBIT ">"] ? OUTDIR ? SETZB LSTERR]
  196. JRST OUTFAI
  197. ; encryption
  198. ; SCR/ password
  199. MOVSI E,-4
  200. MOVE TT,SCR
  201. BYTLUP: LSHC T,9
  202. ANDI T,377
  203. HRLM T,X1(E)
  204. MOVE T,ROUT(E)
  205. HRRM T,X1(E)
  206. AOBJN E,BYTLUP
  207. CAMG X1,X2
  208. EXCH X1,X2
  209. CAMG X3,X4
  210. EXCH X3,X4
  211. CAMG X1,X3
  212. EXCH X1,X3
  213. CAMG X2,X4
  214. EXCH X2,X4
  215. CAMG X2,X3
  216. EXCH X2,X3
  217. LDB A,[320100,,SCR]
  218. HRRZ B,16
  219. SKIPE A
  220. HLRZ B,16
  221. LDB A,[100100,,SCR]
  222. JUMPE A,[LSH B,1 ? JRST .+2]
  223. HRL B,A
  224. LDB A,[210100,,SCR]
  225. SKIPE A
  226. MOVN B,B
  227. MOVEM B,RAN'
  228. MOVSI C,-4
  229. SETZ E,
  230. HLLM E,X1(C)
  231. PUSHJ P,@(C)X1
  232. AOBJN C,.-2
  233. SKIPN REVRSE
  234. JRST SCRBEG
  235. MOVE A,SC1
  236. EXCH A,SC4
  237. MOVEM A,SC1
  238. MOVE A,SC2
  239. EXCH A,SC3
  240. MOVEM A,SC2
  241. HRLZ A,SHFSIZ
  242. MOVN A,A
  243. HLRM A,SHFSIZ
  244. SCRBEG:
  245. SCRLUP: PUSHJ P,GETWRD
  246. SKIPE REVRSE
  247. JRST SC1
  248. PUSHJ P,RANDOM
  249. XOR A,B
  250. SC1: 0
  251. SC2: 0
  252. SC3: 0
  253. SC4: 0
  254. SKIPN REVRSE
  255. JRST SCRL50
  256. PUSHJ P,RANDOM
  257. XOR A,B
  258. SCRL50: MOVEM A,-1(DPT) ; output encrypted word
  259. JRST SCRLUP ; and loop
  260. ; encryption routines
  261. RANDOM: MOVE B,RAN'
  262. FMPB B,RAN
  263. TSC B,B
  264. CPOPJ: POPJ P,
  265. ROUT: XCMPL
  266. XSWAP
  267. XXOR
  268. XROT
  269. XCMPL: LDB A,[331000,,SCR]
  270. IDIVI A,3
  271. ANDI A,1
  272. MOVE B,COMPL(A)
  273. MOVEM B,SC1(C)
  274. POPJ P,
  275. XSWAP: LDB A,[221000,,SCR]
  276. LDB B,[111000,,SCR]
  277. ANDCM A,B
  278. IDIVI A,3
  279. ANDI A,1
  280. MOVE A,SWAP(A)
  281. MOVEM A,SC1(C)
  282. POPJ P,
  283. XXOR: LDB A,[111000,,SCR]
  284. LDB B,[331000,,SCR]
  285. ADD A,B
  286. LSH A,-3
  287. ANDI A,1
  288. MOVE A,MASK(A)
  289. MOVEM A,SC1(C)
  290. POPJ P,
  291. XROT: MOVE A,SCR
  292. IMUL A,A
  293. ANDI A,77
  294. LDB B,[000100,,SCR]
  295. SKIPE B
  296. MOVN A,A
  297. HRRM A,SHFSIZ
  298. MOVE A,SHIFT
  299. MOVEM A,SC1(C)
  300. POPJ P,
  301. COMPL: SETCM A,A
  302. JFCL
  303. SWAP: MOVS A,A
  304. JFCL
  305. MASK: XOR A,SCR
  306. JFCL
  307. SHIFT: ROT A,@SHFSIZ
  308. SHFSIZ: 0
  309. ; i/o routine: the buffer at datloc is used for both input and output,
  310. ; with the encrypted words replacing the unencrypted ones. this sort of
  311. ; makes it tough to have the encryption process be based on more than one
  312. ; word at a time.
  313. ; get a word of input
  314. GETWRD: MOVE A,(DPT)
  315. AOBJN DPT,CPOPJ
  316. ; output old buffer
  317. SKIPN A,OUTPTR
  318. JRST GETBUF
  319. ADD A,[1,,0] ; kludge for aobjn
  320. .IOT DKOC,A
  321. JUMPL A,[.LOSE]
  322. ; read a new buffer
  323. GETBUF: SKIPE EOF
  324. JRST EXIT ; done, no more input
  325. MOVE DPT,[-DATLEN,,DATLOC]
  326. .IOT DKIC,DPT
  327. JUMPGE DPT,[MOVE DPT,[-<DATLEN+1>,,DATLOC]
  328. MOVEM DPT,OUTPTR'
  329. JRST GETWRD]
  330. ; partial buffer
  331. ADD DPT,[DATLEN,,0]
  332. MOVN DPT,DPT
  333. HRRI DPT,DATLOC
  334. MOVEM DPT,OUTPTR
  335. SETOM EOF
  336. JUMPL DPT,GETWRD
  337. ; end
  338. EXIT: .CALL [SETZ ? SIXBIT "RENMWO" ? MOVEI DKOC ? OUTFN1 ? SETZ OUTFN2]
  339. .LOSE
  340. .CALL [SETZ ? 'SFDATE ? MOVEI DKOC ? SETZ CDATE]
  341. .LOSE
  342. .CLOSE DKIC,
  343. .CLOSE DKOC,
  344. KILL: .BREAK 16,124000
  345. ; various error messages
  346. NOJCL: MOVEI A,[ASCIZ /JCL must be given: <infile>,<outfile>
  347. /]
  348. PUSHJ P,TYPE7
  349. JRST KILL
  350. INFAIL: MOVEI A,[ASCIZ /Input open of /]
  351. MOVEI B,INDEV
  352. FAIL: PUSHJ P,TYPE7
  353. PUSHJ P,PFILE
  354. MOVEI A,[ASCIZ / failed: /]
  355. PUSHJ P,TYPE7
  356. .CALL [SETZ ? SIXBIT "OPEN" ? [0,,0] ? [SIXBIT "ERR"] ? [4] ? SETZ LSTERR]
  357. .LOSE
  358. FAILUP: .IOT 0,A
  359. CAIN A,^L
  360. JRST FAILX
  361. JUMPLE A,FAILX
  362. .IOT TYOC,A
  363. JRST FAILUP
  364. FAILX: .CLOSE 0,
  365. JRST KILL
  366. OUTFAI: MOVEI A,[ASCIZ /Output open of /]
  367. MOVEI B,OUTDEV
  368. JRST FAIL
  369. RENFAI: MOVEI A,[ASCIZ /Rename to /]
  370. MOVEI B,OUTDEV
  371. JRST FAIL
  372. PFILE: MOVE A,(B)
  373. PUSHJ P,TYPE6
  374. .IOT TYOC,[":]
  375. MOVE A,3(B)
  376. PUSHJ P,TYPE6
  377. .IOT TYOC,[";]
  378. MOVE A,1(B)
  379. PUSHJ P,TYPE6
  380. .IOT TYOC,[" ]
  381. MOVE A,2(B)
  382. PUSHJ P,TYPE6
  383. POPJ P,
  384. ; password reading and printing
  385. ; smear password after giving luser brief glance
  386. ; on display consoles, erase smear as well
  387. PERASE: MOVEI A,15.
  388. .SLEEP A,
  389. MOVE A,[440700,,SMEAR]
  390. MOVEI B,.SML
  391. .CALL [SETZ ? SIXBIT "SIOT" ? MOVEI TYOC ? A ? SETZ B]
  392. JFCL
  393. MOVE A,[440700,,[.BYTE 7 ? ^P ? "H ? 8 ? ^P ? "L]]
  394. MOVEI B,5
  395. SKIPE DISTTY
  396. .CALL [SETZ ? SIXBIT "SIOT" ? MOVEI DTYOC ? A ? SETZ B]
  397. JFCL
  398. .IOT TYOC,[^M]
  399. .IOT TYOC,[^J]
  400. MOVE A,[441000,,TDNOP]
  401. MOVEI B,.TDL
  402. SKIPE SOFTTY
  403. .CALL [SETZ ? SIXBIT "SIOT" ? MOVSI %TJSIO ? MOVEI TYOC ? A ? SETZ B]
  404. JFCL
  405. POPJ P,
  406. ; a buffer full of tdnops
  407. TDNOP: .BYTE 10
  408. REPEAT 400,%TDNOP
  409. .TDL==.BYTC
  410. .BYTE
  411. ; a smear
  412. SMEAR: .BYTE 7
  413. ^M ? "W ? "X ? "M ? "Q ? "S ? "Y
  414. ^M ? "X ? "M ? "Q ? "S ? "Y ? "W
  415. ^M ? "M ? "Q ? "S ? "Y ? "W ? "X
  416. ^M ? "Q ? "S ? "Y ? "W ? "X ? "M
  417. ^M ? "S ? "Y ? "W ? "X ? "M ? "Q
  418. ^M ? "Y ? "W ? "X ? "M ? "Q ? "S
  419. .SML==.BYTC
  420. .BYTE
  421. WTYPE6: MOVEM A,WORD6'
  422. MOVE A,[440600,,WORD6]
  423. MOVEM A,WD6PT'
  424. MOVEI A,6
  425. MOVEM A,CNT6'
  426. ILDB A,WD6PT
  427. ADDI A,40
  428. .IOT TYOC,A
  429. SOSLE CNT6
  430. JRST .-4
  431. POPJ P,
  432. TYPE6: PUSH P,A
  433. HRRI A,(P)
  434. HRLI A,440600
  435. TYP6LP: TLNN A,770000
  436. JRST POPAJ
  437. ILDB 0,A
  438. JUMPE 0,POPAJ
  439. ADDI 0,40
  440. .IOT TYOC,0
  441. JRST TYP6LP
  442. POPAJ: POP P,A
  443. POPJ P,
  444. TYPE7: HRLI A,440700 ; set up byte pointer (addr in a as arg.)
  445. MOVEM A,PT7' ; store so don't need extra acc
  446. PSHOUT: ILDB A,PT7 ; get char
  447. JUMPE A,CPOPJ ; stop when zero char reached (^@)
  448. .IOT TYOC,A
  449. JRST PSHOUT ; loop forever
  450. GETSCR: MOVE C,CHPT
  451. .IOT TYIC,A
  452. CAIN A,^Q
  453. JRST KILL
  454. CAIN A,177
  455. JRST RUBOUT
  456. CAIN A,^M
  457. JRST RETURN
  458. HLLZ B,C
  459. CAMN B,[-1,,0]
  460. JRST GETSCR+1
  461. PUSH C,A
  462. JRST GETSCR+1
  463. RETURN: CAMN C,CHPT
  464. JRST GETSCR
  465. RETUR1: HLLZ A,C
  466. CAMN A,[-1,,0]
  467. JRST FULL
  468. PUSH C,[40]
  469. JRST RETUR1
  470. FULL: MOVE C,[440600,,SCR]
  471. MOVSI B,-6
  472. FULLUP: MOVE A,SCRLOC(B)
  473. SUBI A,40
  474. CAIL A,100
  475. SUBI A,40
  476. IDPB A,C
  477. AOBJN B,FULLUP
  478. POPJ P,
  479. RUBOUT: CAMN C,CHPT
  480. JRST GETSCR
  481. POP C,A
  482. JRST GETSCR+1
  483. ; file name reading
  484. INDEV: SIXBIT /DSK/
  485. INFN1: 0
  486. INFN2: 0
  487. INDIR: SIXBIT /LCF/
  488. OUTDEV: SIXBIT /DSK/
  489. OUTFN1: 0
  490. OUTFN2: 0
  491. OUTDIR: 0
  492. SCNAME: MOVSI C,-4
  493. HRRI C,1(E)
  494. SCNGET: PUSHJ P,GETSYL
  495. JUMPE B,SCNX
  496. CAIN A,':
  497. MOVEM B,(E)
  498. CAIN A,';
  499. MOVEM B,3(E)
  500. JUMPG A,SCNGET
  501. MOVEM B,(C)
  502. JUMPL A,SCNX
  503. AOBJN C,SCNGET
  504. SCNX: POPJ P,
  505. ; get a syllable from command buffer
  506. GETSYL: PUSH P,[0]
  507. MOVEI B,(P)
  508. HRLI B,440600
  509. GETSLP: PUSHJ P,GETCCA
  510. JUMPL A,GETSX
  511. CAIN A,"/
  512. JRST GETSWT
  513. CAIN A,^Q
  514. JRST GETQOT
  515. SUBI A,40
  516. JUMPL A,GETSX
  517. JUMPE A,GETSP
  518. CAIE A,':
  519. CAIN A,';
  520. JRST GETSX
  521. GETSPT: CAIL A,100
  522. SUBI A,40
  523. TLNN B,770000
  524. JRST GETSLP
  525. IDPB A,B
  526. JRST GETSLP
  527. GETSWT: PUSHJ P,GETCCA
  528. SUBI A,40
  529. CAIL A,100
  530. SUBI A,40
  531. CAIN A,'U
  532. SETOM REVRSE
  533. JRST GETSLP
  534. GETQOT: ILDB A,COMPTR
  535. SUBI A,40
  536. JUMPGE A,GETSPT
  537. JRST GETSX
  538. GETSP: TLNE B,400000
  539. JRST GETSLP
  540. GETSX: POP P,B ; character word
  541. POPJ P,
  542. GETCCA: ILDB A,COMPTR
  543. JUMPE A,GETCCX
  544. CAIN A,^I
  545. MOVEI A,40
  546. CAIE A,^C
  547. CAIN A,^M
  548. JRST GETCCX
  549. CAIN A,",
  550. GETCCX: SETOM A
  551. POPJ P,
  552. CHPT: -7,,SCRLOC-1
  553. SCRLOC: BLOCK 7
  554. PDL: BLOCK 70
  555. JCLBUF: BLOCK 50
  556. DATLEN==2000
  557. DATLOC: BLOCK DATLEN
  558. END GO
  559.