; TRC1D.ASM

; scanner main ctl

; scanner vector table. different
; proc per direction

SCNTB	DW	SCANU,SCAND,SCANR,SCANL
SCANNR	PROC		;on gosub rtn
	LDX	ALTCMS	;ldx with which ship
	DEX
AUTOX2	BNE	:OVER
	LDX	#3
:OVER	LDY	INDEX,X	;ldy with ships direction
	LDA	SCNTB,Y
	STA	SUBVC6+1
	LDA	SCNTB+1,Y
	STA	SUBVC6+2
SUBVC6	JSR	SUBVC6
	RTS

; Scan rtn's. all rtns will follow
; pattern described for this one

SCANU	PROC
	JSR	SENU	;check ahead
	CMP	#0	;if senu returns a
			;0 in A no object ahead
	BEQ	:EXIT	;exit path clear
SCANRL	JSR	SENR	;path blocked check right
	STA	XVC2+1	;store result in cmp byte below
	JSR	SENL	;ckeck left
XVC2	CMP	#0	;compare results
	BEQ	:BOCLR	;both ways clear ask locator
	CMP	#0	;check results of sence left
	BNE	URT	;branch to go right
ULT	LDA	#L	;go left
	STA	INDEX,X	;set new dir.
:EXIT	RTS
URT	LDA	#R
	STA	INDEX,X	;set new dir.
	RTS
:BOCLR	JSR	LOCATR
	RTS

SCAND	PROC
	JSR	SEND
	CMP	#0
	BEQ	:EXIT
	JMP	SCANRL
:EXIT	RTS

SCANL	PROC
	JSR	SENL
	CMP	#0
	BEQ	:EXIT
SCANUD	JSR	SENU
	STA	XVC+1
	JSR	SEND
XVC	CMP	#0
	BEQ	:BOCLR
	CMP	#0
	BNE	DIRUL
LDN	LDA	#D
	STA	INDEX,X
:EXIT	RTS
DIRUL	LDA	#U
	STA	INDEX,X
	RTS
:BOCLR	JSR	LOCATR
	RTS

SCANR	PROC
	JSR	SENR
	CMP	#0
	BEQ	:EXIT
	JMP	SCANUD
:EXIT	RTS

STOX	DB	0

; these sensor subs sense ahead left and
; right they return a 0 on clear a pos.
; num on contact

SENU	PROC
	LDA	PLCOL,X
	STA	COLGET
	LDA	PLROW,X
	SEC
	SBC	#4
	STA	ROWGET
	STX	STOX
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	DEC	COLGET
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	INC	COLGET
	INC	COLGET
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	DEC	COLGET
	INC	ROWGET
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	INC	ROWGET
	JSR	MYGET
:EXIT	LDX	STOX
	RTS

SEND	PROC
	LDA	PLCOL,X
	STA	COLGET
	LDA	PLROW,X
	CLC
	ADC	#4
	STA	ROWGET
	STX	STOX
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	DEC	COLGET
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	INC	COLGET
	INC	COLGET
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	DEC	COLGET
	DEC	ROWGET
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	DEC	ROWGET
	JSR	MYGET
:EXIT	LDX	STOX
	RTS

SENR	PROC
	LDA	PLCOL,X
	CLC
	ADC	#4
	STA	COLGET
	LDA	PLROW,X
	STA	ROWGET
	STX	STOX
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	DEC	ROWGET
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	INC	ROWGET
	INC	ROWGET
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	DEC	ROWGET
	DEC	COLGET
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	DEC	COLGET
	JSR	MYGET
:EXIT	LDX	STOX
	RTS

SENL	PROC
	LDA	PLCOL,X
	SEC
	SBC	#4
	STA	COLGET
	LDA	PLROW,X
	STA	ROWGET
	STX	STOX
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	DEC	ROWGET
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	INC	ROWGET
	INC	ROWGET
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	DEC	ROWGET
	INC	COLGET
	JSR	MYGET
	CMP	#0
	BNE	:EXIT
	INC	COLGET
	JSR	MYGET
:EXIT	LDX	STOX
	RTS

; Locator logic, follow players ship
; called if computer ship needs new dir. &
; both ways are clear. Computer ship 1 
; always picks random direction

LOCATR	PROC
	CPX	#2
	BCS	CONTL
; do rndm for ship #1
	LDA	INDEX,X
	CMP	#3
	BCC	CHGLR
	LDA	RANDOM
	AND	#1
	BEQ	ADJU
	BNE	ADJD

CHGLR	LDA	RANDOM
	AND	#1
	BEQ	ADJL
	BNE	ADJR
:EXIT	RTS
CONTL	LDA	INDEX,X	;do locate for
	CMP	#3	;ship 2 or 3
	BCC	ADJLR	;curr dir u or d
	SEC		;curr dir l or r
	LDA	PLROW
	SBC	PLROW,X
	BCC	ADJU
	BEQ	:EXIT	;if = row no change
ADJD	LDA	#2
	STA	INDEX,X
	RTS
ADJU	LDA	#0
	STA	INDEX,X
	RTS
ADJLR	SEC
	LDA	PLCOL
	SBC	PLCOL,X
	BCC	ADJL
	BEQ	:EXIT2	;exit if c ship col=ply
ADJR	LDA	#4
	STA	INDEX,X
:EXIT2	RTS
ADJL	LDA	#6
	STA	INDEX,X
	RTS

	LINK		D:TRC1E.ASM
