// DiExPatt.bcpl

get "DiEx.defs"


static PattCnt
static [ @RandomNum = #123456; @PattHint=0 ]  //local statics

let DisplayPatterns(Update) be
	[ Active = false
	let str = "This pattern will be complemented and shifted between passes"
	PattHint = str
	DisplayParam(PattR, 9, 4)
	DisplayParam(PattA, 9, Tab1)
	DisplayParam(Patt000, 9, Tab2)
	DisplayParam(Patt001, 9, Tab3)
	DisplayParam(Patt003, 9, Tab4)
	DisplayParam(Patt007, 9, Tab5)
	]

and PattR() be
	[
	if NewBoolian("Will generate a new 'Random' pattern for each pass.") then
		T>>P.PattR = not T>>P.PattR
	PrintParam("Random Patt: $S",T>>P.PattR?"Yes","No")
	]

and PattA() be
	[
	if NewBoolian("Data word 0=0, 1=1, 2=2, etc.") then T>>P.PattA = not T>>P.PattA
	PrintParam("Addr Patt: $S",T>>P.PattA?"Yes","No")
	]

and Patt000() be
	[
	if NewBoolian(PattHint) then T>>P.Patt000 = not T>>P.Patt000
	PrintParam("Wrd Patt=0: $S",T>>P.Patt000?"Yes","No")
	]

and Patt001() be
	[
	if NewBoolian(PattHint) then T>>P.Patt001 = not T>>P.Patt001
	PrintParam("Wrd Patt=1: $S",T>>P.Patt001?"Yes","No")
	]

and Patt003() be
	[
	if NewBoolian(PattHint) then T>>P.Patt003 = not T>>P.Patt003
	PrintParam("Wrd Patt=3: $S",T>>P.Patt003?"Yes","No")
	]

and Patt007() be
	[
	if NewBoolian(PattHint) then T>>P.Patt007 = not T>>P.Patt007
	PrintParam("Wrd Patt=7:$S",T>>P.Patt007?"Yes","No")
	]


and makePattern(buff,count) be
	[
	let pattern,none = nil,0
	LookPattern:
	if none eq 2 then return; none = none+1
	switchon PattCnt into
		[
		default: 
		case 1: PattCnt = 2; if T>>P.PattR then
			[ RandomNum = MakeRandom(buff,count,RandomNum); return ]
		case 2: PattCnt = 4; if T>>P.PattA then [ for i = 0 to count-1 do buff!i = i; return ]
		case 4: PattCnt = #10; if T>>P.Patt000 then [ pattern=0;endcase ]
		case #10: PattCnt = #20; if T>>P.Patt001 then [ pattern=1;endcase ]
		case #20: PattCnt = #40; if T>>P.Patt003 then [ pattern=3;endcase ]
		case #40: PattCnt = #1; if T>>P.Patt007 then [ pattern=7;endcase ]
		goto LookPattern
		]
	let s = (pass&#37)-1
		[ if s le 0 then break; s=s-2
		pattern = pattern ls 0? (pattern lshift 1)+1,pattern lshift 1
		] repeat
	if (pass & 1) ne 0 then pattern = not pattern
	SetBlock(buff,pattern,count)
	]

and MakeRandom(block,count,Num) = valof
	[ external RandomASM
	let buff = vec 2
	buff!0 = Num
	buff!1 = count
	buff!2 = block
	resultis RandomASM(buff)
	]