123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628 |
- TITLE SCRMBL
- .MLLIT=1
- A=1
- B=2
- C=3
- D=4
- E=5
- X1=6
- X2=7
- X3=10
- X4=11
- DPT=12
- T=13
- TT=14
- SCR=16
- P=17
- TYIC==1 ; tty input
- TYOC==2 ; tty output
- DKIC==3 ; input source
- DKOC==4 ; output sink
- DTYOC==5 ; display output (for smearing)
- REVRSE: 0 ; 0 for scramble, -1 for unscramble
- ; starting location
- GO: MOVEI P,PDL
- SETZB DPT,EOF'
- SETZ OUTPTR'
- ; open tty channels
- .OPEN TYIC,[24,,'TTY]
- .LOSE
- .OPEN TYOC,[5,,'TTY]
- .LOSE
- .CALL [SETZ ? 'CNSGET ? MOVEI TYOC ? MOVEM ? MOVEM ? SETZM A]
- SETZB A,SOFTTY'
- CAIN A,%TNSFW
- SETOM SOFTTY ; software tty
- .STATUS TYOC,A
- ANDI A,77
- SETZM DISTTY
- CAIE A,2
- JRST RDJCL
- ; here display tty, so open a channel in display mode
- SETOM DISTTY' ; display tty
- .OPEN DTYOC,[21,,'TTY]
- .LOSE
- ; read command, if any
- RDJCL: .SUSET [.ROPTION,,A]
- TLNN A,40000 ; any jcl?
- JRST NOJCL
- .BREAK 12,[5,,JCLBUF] ; get it
- MOVE A,[440700,,JCLBUF]
- MOVEM A,COMPTR'
- ; I THINK DEFAULT SHOULD BE LCF = 99% OF USAGE (MARC -- 2/13/78)
- ; dir defaults to sname
- ; .SUSET [.RSNAME,,A]
- ; MOVEM A,INDIR
- .SUSET [.RXJNAME,,A]
- CAMN A,[SIXBIT /UNSCR/]
- SETOM REVRSE
- ; parse jcl
- MOVEI E,INDEV
- PUSHJ P,SCNAME
- MOVEI E,OUTDEV
- PUSHJ P,SCNAME
- PUSHJ P,GETSYL
- ; set up default for unscrambling
- ; if scrambling, default is fn1 plus letter Z on end
- ; if unscrambling, default is fn1 with letter Z removed from end
- INDEF: SKIPE OUTFN1
- JRST DODEF
- SKIPN REVRSE
- JRST SCRDEF
- ; here unscrambling
- MOVE A,[440600,,INFN1]
- INLOOP: ILDB B,A
- CAIE B,'Z
- JRST INDEF1
- CAMN A,[600,,INFN1]
- JRST INMAKE
- MOVE C,A
- ILDB B,C
- JUMPN B,INLOOP
- INMAKE: SETZ C, ; dump a space
- JRST DMAKE
- INDEF1: CAME A,[600,,INFN1]
- JRST INLOOP
- JRST INMAKE
- ; set up defaults for scrambling
- SCRDEF: MOVE A,[440600,,INFN1]
- OULOOP: CAMN A,[600,,INFN1]
- JRST OUMAKE
- ILDB B,A
- JUMPE B,OUMAKE
- JRST OULOOP
- OUMAKE: MOVEI C,'Z ; dump a Z
- ; here dump a space or a Z into file name
- DMAKE: MOVE B,INFN1
- MOVEM B,OUTFN1
- HRRI A,OUTFN1
- DPB C,A
- ; set up output file defaults
- DODEF: MOVE A,INDEV
- SKIPN OUTDEV
- MOVEM A,OUTDEV
- MOVE A,INFN1
- SKIPN OUTFN1
- MOVEM A,OUTFN1
- MOVE A,INFN2
- SKIPN OUTFN2
- MOVEM A,OUTFN2
- MOVE A,INDIR
- SKIPN OUTDIR
- MOVEM A,OUTDIR
- ; here to hack second name cruftage: if no second name given, it
- ; is set up so that input and output files will have same second name
- ; creation dates of files are always set up to be the same
- SKIPE INFN2
- JRST OPNFLS
- MOVSI A,(SIXBIT ">")
- MOVEM A,INFN2
- ; open input file
- OPNFLS: .CALL [SETZ ? SIXBIT /OPEN/ ? [.BII,,DKIC]
- INDEV ? INFN1 ? INFN2 ? INDIR ? SETZB LSTERR']
- JRST INFAIL
- ; read its creation date
- .CALL [SETZ ? 'RFDATE ? MOVEI DKIC ? SETZM CDATE']
- .LOSE
- SKIPE OUTFN2
- JRST SMASH
- ; read its second name if necessary
- .CALL [SETZ ? SIXBIT /RCHST/ ? MOVEI DKIC ? MOVEM ? MOVEM ? MOVEM OUTFN2 ? SETZM]
- .LOSE
- MOVE A,OUTFN2
- MOVEM A,INFN2
- ; check if (un)scring to self
- SMASH: MOVE A,INFN1
- CAME A,OUTFN1
- JRST ASK
- MOVE A,INFN2
- CAME A,OUTFN2
- JRST ASK
- MOVE A,INDEV
- CAME A,OUTDEV
- JRST ASK
- MOVE A,INDIR
- CAME A,OUTDIR
- JRST ASK
- ; going to same file, ask for confirmation
- MOVEI A,[ASCIZ /Uns/]
- SKIPN REVRSE
- MOVEI A,[ASCIZ /S/]
- PUSHJ P,TYPE7
- MOVEI A,[ASCIZ /crambling to self? Confirm? /]
- PUSHJ P,TYPE7
- PUSHJ P,YESNO
- CAIN A,"Y
- JRST ASK
- MOVEI A,[ASCIZ /Aborted./]
- PUSHJ P,TYPE7
- JRST KILL
-
- ; ask yes/no question
- YESNO: .IOT TYIC,A
- CAIN A,^Q
- JRST KILL ; ^Q means kill
- CAIL A,"a
- CAILE A,"z
- CAIA
- SUBI A,40
- .IOT TYOC,[^M]
- .IOT TYOC,[^J]
- POPJ P,
- ; get password
- REASK: .IOT TYOC,[^M]
- .IOT TYOC,[^J]
- ASK: MOVEI A,[ASCIZ /Password? /]
- PUSHJ P,TYPE7
- PUSHJ P,GETSCR ; read password
- ; confirm password
- CONFRM: .IOT TYOC,[^M]
- .IOT TYOC,[^J]
- MOVE A,SCR
- PUSHJ P,WTYPE6 ; type it out (briefly)
- PUSHJ P,PERASE ; now flush it
- ; get confirmation
- DBLCHK: MOVEI A,[ASCIZ /Okay? /] ; confirm the password
- PUSHJ P,TYPE7
- PUSHJ P,YESNO
- CAIN A,"N ; N is no
- JRST REASK
- CAIN A,"R
- JRST CONFRM ; R is reconfirm
- CAIE A,"Y
- JRST DBLCHK ; Y is yes, anything else asks again
- ; open output file
- .CALL [SETZ ? SIXBIT /OPEN/ ? [.BIO,,DKOC]
- OUTDEV ? [SIXBIT "_SCRM_"] ? [SIXBIT ">"] ? OUTDIR ? SETZB LSTERR]
- JRST OUTFAI
- ; encryption
- ; SCR/ password
- MOVSI E,-4
- MOVE TT,SCR
- BYTLUP: LSHC T,9
- ANDI T,377
- HRLM T,X1(E)
- MOVE T,ROUT(E)
- HRRM T,X1(E)
- AOBJN E,BYTLUP
- CAMG X1,X2
- EXCH X1,X2
- CAMG X3,X4
- EXCH X3,X4
- CAMG X1,X3
- EXCH X1,X3
- CAMG X2,X4
- EXCH X2,X4
- CAMG X2,X3
- EXCH X2,X3
- LDB A,[320100,,SCR]
- HRRZ B,16
- SKIPE A
- HLRZ B,16
- LDB A,[100100,,SCR]
- JUMPE A,[LSH B,1 ? JRST .+2]
- HRL B,A
- LDB A,[210100,,SCR]
- SKIPE A
- MOVN B,B
- MOVEM B,RAN'
- MOVSI C,-4
- SETZ E,
- HLLM E,X1(C)
- PUSHJ P,@(C)X1
- AOBJN C,.-2
- SKIPN REVRSE
- JRST SCRBEG
- MOVE A,SC1
- EXCH A,SC4
- MOVEM A,SC1
- MOVE A,SC2
- EXCH A,SC3
- MOVEM A,SC2
- HRLZ A,SHFSIZ
- MOVN A,A
- HLRM A,SHFSIZ
- SCRBEG:
- SCRLUP: PUSHJ P,GETWRD
- SKIPE REVRSE
- JRST SC1
- PUSHJ P,RANDOM
- XOR A,B
- SC1: 0
- SC2: 0
- SC3: 0
- SC4: 0
- SKIPN REVRSE
- JRST SCRL50
- PUSHJ P,RANDOM
- XOR A,B
- SCRL50: MOVEM A,-1(DPT) ; output encrypted word
- JRST SCRLUP ; and loop
- ; encryption routines
- RANDOM: MOVE B,RAN'
- FMPB B,RAN
- TSC B,B
- CPOPJ: POPJ P,
- ROUT: XCMPL
- XSWAP
- XXOR
- XROT
- XCMPL: LDB A,[331000,,SCR]
- IDIVI A,3
- ANDI A,1
- MOVE B,COMPL(A)
- MOVEM B,SC1(C)
- POPJ P,
- XSWAP: LDB A,[221000,,SCR]
- LDB B,[111000,,SCR]
- ANDCM A,B
- IDIVI A,3
- ANDI A,1
- MOVE A,SWAP(A)
- MOVEM A,SC1(C)
- POPJ P,
- XXOR: LDB A,[111000,,SCR]
- LDB B,[331000,,SCR]
- ADD A,B
- LSH A,-3
- ANDI A,1
- MOVE A,MASK(A)
- MOVEM A,SC1(C)
- POPJ P,
- XROT: MOVE A,SCR
- IMUL A,A
- ANDI A,77
- LDB B,[000100,,SCR]
- SKIPE B
- MOVN A,A
- HRRM A,SHFSIZ
- MOVE A,SHIFT
- MOVEM A,SC1(C)
- POPJ P,
- COMPL: SETCM A,A
- JFCL
- SWAP: MOVS A,A
- JFCL
- MASK: XOR A,SCR
- JFCL
- SHIFT: ROT A,@SHFSIZ
- SHFSIZ: 0
- ; i/o routine: the buffer at datloc is used for both input and output,
- ; with the encrypted words replacing the unencrypted ones. this sort of
- ; makes it tough to have the encryption process be based on more than one
- ; word at a time.
- ; get a word of input
- GETWRD: MOVE A,(DPT)
- AOBJN DPT,CPOPJ
- ; output old buffer
- SKIPN A,OUTPTR
- JRST GETBUF
- ADD A,[1,,0] ; kludge for aobjn
- .IOT DKOC,A
- JUMPL A,[.LOSE]
- ; read a new buffer
- GETBUF: SKIPE EOF
- JRST EXIT ; done, no more input
- MOVE DPT,[-DATLEN,,DATLOC]
- .IOT DKIC,DPT
- JUMPGE DPT,[MOVE DPT,[-<DATLEN+1>,,DATLOC]
- MOVEM DPT,OUTPTR'
- JRST GETWRD]
- ; partial buffer
- ADD DPT,[DATLEN,,0]
- MOVN DPT,DPT
- HRRI DPT,DATLOC
- MOVEM DPT,OUTPTR
- SETOM EOF
- JUMPL DPT,GETWRD
- ; end
- EXIT: .CALL [SETZ ? SIXBIT "RENMWO" ? MOVEI DKOC ? OUTFN1 ? SETZ OUTFN2]
- .LOSE
- .CALL [SETZ ? 'SFDATE ? MOVEI DKOC ? SETZ CDATE]
- .LOSE
- .CLOSE DKIC,
- .CLOSE DKOC,
- KILL: .BREAK 16,124000
- ; various error messages
- NOJCL: MOVEI A,[ASCIZ /JCL must be given: <infile>,<outfile>
- /]
- PUSHJ P,TYPE7
- JRST KILL
- INFAIL: MOVEI A,[ASCIZ /Input open of /]
- MOVEI B,INDEV
- FAIL: PUSHJ P,TYPE7
- PUSHJ P,PFILE
- MOVEI A,[ASCIZ / failed: /]
- PUSHJ P,TYPE7
- .CALL [SETZ ? SIXBIT "OPEN" ? [0,,0] ? [SIXBIT "ERR"] ? [4] ? SETZ LSTERR]
- .LOSE
- FAILUP: .IOT 0,A
- CAIN A,^L
- JRST FAILX
- JUMPLE A,FAILX
- .IOT TYOC,A
- JRST FAILUP
- FAILX: .CLOSE 0,
- JRST KILL
- OUTFAI: MOVEI A,[ASCIZ /Output open of /]
- MOVEI B,OUTDEV
- JRST FAIL
- RENFAI: MOVEI A,[ASCIZ /Rename to /]
- MOVEI B,OUTDEV
- JRST FAIL
- PFILE: MOVE A,(B)
- PUSHJ P,TYPE6
- .IOT TYOC,[":]
- MOVE A,3(B)
- PUSHJ P,TYPE6
- .IOT TYOC,[";]
- MOVE A,1(B)
- PUSHJ P,TYPE6
- .IOT TYOC,[" ]
- MOVE A,2(B)
- PUSHJ P,TYPE6
- POPJ P,
- ; password reading and printing
- ; smear password after giving luser brief glance
- ; on display consoles, erase smear as well
- PERASE: MOVEI A,15.
- .SLEEP A,
- MOVE A,[440700,,SMEAR]
- MOVEI B,.SML
- .CALL [SETZ ? SIXBIT "SIOT" ? MOVEI TYOC ? A ? SETZ B]
- JFCL
- MOVE A,[440700,,[.BYTE 7 ? ^P ? "H ? 8 ? ^P ? "L]]
- MOVEI B,5
- SKIPE DISTTY
- .CALL [SETZ ? SIXBIT "SIOT" ? MOVEI DTYOC ? A ? SETZ B]
- JFCL
- .IOT TYOC,[^M]
- .IOT TYOC,[^J]
- MOVE A,[441000,,TDNOP]
- MOVEI B,.TDL
- SKIPE SOFTTY
- .CALL [SETZ ? SIXBIT "SIOT" ? MOVSI %TJSIO ? MOVEI TYOC ? A ? SETZ B]
- JFCL
- POPJ P,
- ; a buffer full of tdnops
- TDNOP: .BYTE 10
- REPEAT 400,%TDNOP
- .TDL==.BYTC
- .BYTE
- ; a smear
- SMEAR: .BYTE 7
- ^M ? "W ? "X ? "M ? "Q ? "S ? "Y
- ^M ? "X ? "M ? "Q ? "S ? "Y ? "W
- ^M ? "M ? "Q ? "S ? "Y ? "W ? "X
- ^M ? "Q ? "S ? "Y ? "W ? "X ? "M
- ^M ? "S ? "Y ? "W ? "X ? "M ? "Q
- ^M ? "Y ? "W ? "X ? "M ? "Q ? "S
- .SML==.BYTC
- .BYTE
- WTYPE6: MOVEM A,WORD6'
- MOVE A,[440600,,WORD6]
- MOVEM A,WD6PT'
- MOVEI A,6
- MOVEM A,CNT6'
- ILDB A,WD6PT
- ADDI A,40
- .IOT TYOC,A
- SOSLE CNT6
- JRST .-4
- POPJ P,
- TYPE6: PUSH P,A
- HRRI A,(P)
- HRLI A,440600
- TYP6LP: TLNN A,770000
- JRST POPAJ
- ILDB 0,A
- JUMPE 0,POPAJ
- ADDI 0,40
- .IOT TYOC,0
- JRST TYP6LP
- POPAJ: POP P,A
- POPJ P,
- TYPE7: HRLI A,440700 ; set up byte pointer (addr in a as arg.)
- MOVEM A,PT7' ; store so don't need extra acc
- PSHOUT: ILDB A,PT7 ; get char
- JUMPE A,CPOPJ ; stop when zero char reached (^@)
- .IOT TYOC,A
- JRST PSHOUT ; loop forever
- GETSCR: MOVE C,CHPT
- .IOT TYIC,A
- CAIN A,^Q
- JRST KILL
- CAIN A,177
- JRST RUBOUT
- CAIN A,^M
- JRST RETURN
- HLLZ B,C
- CAMN B,[-1,,0]
- JRST GETSCR+1
- PUSH C,A
- JRST GETSCR+1
- RETURN: CAMN C,CHPT
- JRST GETSCR
- RETUR1: HLLZ A,C
- CAMN A,[-1,,0]
- JRST FULL
- PUSH C,[40]
- JRST RETUR1
- FULL: MOVE C,[440600,,SCR]
- MOVSI B,-6
- FULLUP: MOVE A,SCRLOC(B)
- SUBI A,40
- CAIL A,100
- SUBI A,40
- IDPB A,C
- AOBJN B,FULLUP
- POPJ P,
- RUBOUT: CAMN C,CHPT
- JRST GETSCR
- POP C,A
- JRST GETSCR+1
- ; file name reading
- INDEV: SIXBIT /DSK/
- INFN1: 0
- INFN2: 0
- INDIR: SIXBIT /LCF/
- OUTDEV: SIXBIT /DSK/
- OUTFN1: 0
- OUTFN2: 0
- OUTDIR: 0
- SCNAME: MOVSI C,-4
- HRRI C,1(E)
- SCNGET: PUSHJ P,GETSYL
- JUMPE B,SCNX
- CAIN A,':
- MOVEM B,(E)
- CAIN A,';
- MOVEM B,3(E)
- JUMPG A,SCNGET
- MOVEM B,(C)
- JUMPL A,SCNX
- AOBJN C,SCNGET
- SCNX: POPJ P,
- ; get a syllable from command buffer
- GETSYL: PUSH P,[0]
- MOVEI B,(P)
- HRLI B,440600
- GETSLP: PUSHJ P,GETCCA
- JUMPL A,GETSX
- CAIN A,"/
- JRST GETSWT
- CAIN A,^Q
- JRST GETQOT
- SUBI A,40
- JUMPL A,GETSX
- JUMPE A,GETSP
- CAIE A,':
- CAIN A,';
- JRST GETSX
- GETSPT: CAIL A,100
- SUBI A,40
- TLNN B,770000
- JRST GETSLP
- IDPB A,B
- JRST GETSLP
- GETSWT: PUSHJ P,GETCCA
- SUBI A,40
- CAIL A,100
- SUBI A,40
- CAIN A,'U
- SETOM REVRSE
- JRST GETSLP
- GETQOT: ILDB A,COMPTR
- SUBI A,40
- JUMPGE A,GETSPT
- JRST GETSX
- GETSP: TLNE B,400000
- JRST GETSLP
- GETSX: POP P,B ; character word
- POPJ P,
- GETCCA: ILDB A,COMPTR
- JUMPE A,GETCCX
- CAIN A,^I
- MOVEI A,40
- CAIE A,^C
- CAIN A,^M
- JRST GETCCX
- CAIN A,",
- GETCCX: SETOM A
- POPJ P,
- CHPT: -7,,SCRLOC-1
- SCRLOC: BLOCK 7
- PDL: BLOCK 70
- JCLBUF: BLOCK 50
- DATLEN==2000
- DATLOC: BLOCK DATLEN
- END GO
|