.PAGE
;******************************************************
;*						      *
;*		  FILL COMMAND			      *
;*						      *
;*  COPYRIGHT (c) 1982, 1983 SAGE Computer Technology *
;*  All Rights Reserved				      *
;*						      *
;******************************************************

CMF
	LEA	SCMF,A1		;Find command in table
	BRA	SRCHCMND

;FB [$X+]XXXXXX,[#,$X+]XXXXXXXX,DD - Fill byte

CMFB
	MOVE.L	#255.,D2	;Max data size
	BSR.S	FILLCNVT	;Get address and data
	BNE	CMNDERRA	;Error detected in address/data field
	MOVE.B	D0,D5		;Copy low byte into next higher byte
	ASL.W	#8,D0
	MOVE.B	D5,D0
	BRA.S	CMFW1		;Repeat operation for word

;FW [$X+]XXXXXX,[#,$X+]XXXXXXXX,DDDD - Fill word

CMFW
	MOVE.L	#0FFFFH,D2	;Max data size
	BSR.S	FILLCNVT	;Get address and data
	BNE	CMNDERRA	;Error detected in address/data field
CMFW1
	MOVE.W	D0,D5		;Dup lower word into upper word
	SWAP	D0
	MOVE.W	D5,D0
	BRA.S	CMFL1		;Fill memory

;FL [$X+]XXXXXX,[#,$X+]XXXXXXXX,DDDDDDDD - Fill long

CMFL
	CLR.L	D2		;No max data size
	BSR.S	FILLCNVT	;Get address and data
	BNE	CMNDERRA	;Error detected in address/data field
CMFL1
	LEA	MSG23,A0	;Fill starting
	BSR	TERMTEXT
	BSR	SETBE		;Set Bus Error trap
$1
	ROL.L	#8,D0		;Move next data byte stored to low byte
	MOVE.B	D0,(A1)+	;Store byte 
	SUBQ.L	#1,D4		;Decr bytes to go
	BNE	$1
	MOVE.L	A2,BE_TRAP	;Restore trap vector
	RTS

; Get starting and ending address
;			A0 : Input buffer pointing to first address
;	BSR	FILLADDR
;			A0 : Points to character after last delimiter
;			A1 : First address
;			A2 : Last address
;			D4 : Bytes between first and last address
;			nz : Error

FILLADDR:
	MOVEM.L D0-D3,-(A7)	;Save working registers
	BSR	CNVTADDR	;Get stating address
	BNE.S	$3		;Error in address
	MOVE.L	A1,D4		;Save physical address
	BSR	CNVTADDR	;Get ending address/size
	MOVEA.L A1,A2		;Set last address (if not #XXXXXX)
	EXG	A1,D4		;Swap beginning and ending addressed
	BMI.S	$3		;Error detected
	BGT.S	$1		;#XXXXXX for ending address
	SUB.L	A1,D4		;Compute transfer size
	ADDQ.L	#1,D4
	BRA.S	$2
$1
	ADDA.L	A1,A2		;Convert #XXXXXX to address
	SUBQ.L	#1,A2
$2
	CLR.L	D0		;No errors
$3
	MOVEM.L (A7)+,D0-D3	;Restore working registers
	RTS
	
;Convert address/data of fill command
;			A0 : Pointer to first address in buffer
;			D2 : Max number
;	BSR	FILLCNVT
;			A0 : Pointer to after delimiter
;			A1 : First address
;			A2 : Last address 
;			D0 : Data
;			nz : Error

FILLCNVT
	BSR	FILLADDR	;Set address
	BNE.S	$1
	MOVE.L	D2,D1		;Set maximum data size
	BSR	GETDATA
$1
	RTS
.PAGE
;************************************************
;*						*
;*	 EXAMINE MEMORY COMMAND FOR DATA	*
;*						*
;*  COPYRIGHT (c) 1983 SAGE Computer Technology *
;*						*
;************************************************

;Convert address/data of search command
;			A0 : Pointer to first address in buffer
;			D2 : Max number
;			D7 : Minimum transfer size
;	BSR	SRCHCNVT
;			A0 : Pointer to after delimiter
;			A1 : First address
;			A2 : Last address
;			D0 : Mask
;			D6 : Data
;		     Error : Returns error to Command (CMNDERRA)

SRCHCNVT
	BSR	FILLCNVT	;Set address
	BNE.S	$1
	MOVE.L	D0,D6		;Save data
	SUB.L	D7,D4		;Actual number of bytes to check
	BLT	CMNDERRA	;Too small report error
	MOVEQ	#-1,D0		;Assume no mask
	TST.B	(A0)		;Any mask?
	BEQ.S	$2
	MOVE.L	D2,D1
	BSR	GETDATA		;Read mask
$1
	BNE	CMNDERRA	;Error detected in address/data field
$2
	LEA	MSG35,A0	;Print Searching memory...
	BSR	TERMTEXT
	BSR	SETBE		;Setup for memory error
	RTS

CMX
	LEA	SCMX,A1		;Find command in table
	BRA	SRCHCMND

;XB [$X+]XXXXXX,[#,$X+]XXXXXXXX,DD,[MM] - Search memory for byte

CMXB
	MOVE.L	#255.,D2	;Max data size
	MOVEQ	#1,D7		;Min process size - 1
	BSR	SRCHCNVT	;Get address and data
$1
	MOVE.B	(A1)+,D1	;Get byte to be checked
	AND.B	D0,D1		;Apply mask
	CMP.B	D6,D1		;Match?
	BEQ.S	$2		;Yes
$15
	SUBQ.L	#1,D4		;More to check
	BGE	$1
$2
	BSR	CMSCHK		;Prints results - does not return if
				;		  no more to check
	BRA	$15		;Continue test

;XW [$X+]XXXXXX,[#,$X+]XXXXXXXX,DDDD,[MMMM] - Search memory for word

CMXW
	MOVE.L	#0FFFFH,D2	;Max data size
	MOVEQ	#2,D7		;Min size -1
	BSR	SRCHCNVT	;Get address and data
$1
	MOVE.B	(A1)+,D1	;Get byte to be checked
	ROL.L	#8,D1		;Make room for next byte
	MOVE.B	(A1),D1		;Get next byte
	AND.W	D0,D1		;Apply mask
	CMP.W	D6,D1		;Match?
	BEQ.S	$2		;Yes
$15
	SUBQ.L	#1,D4		;More to check
	BGE	$1
$2
	BSR	CMSCHK		;Prints results - does not return if
				;		  no more to check
	BRA	$15		;Continue test

;XL [$X+]XXXXXX,[#,$X+]XXXXXXXX,DDDDDDDD,[MMMMMMMM] - Search memory for long

CMXL
	CLR.L	D2		;Max data size
	MOVEQ	#4,D7		;Min size - 1
	BSR	SRCHCNVT	;Get address and data
	MOVEA.L A1,A3		;Set second word index
	ADDQ.L	#2,A3
$1
	MOVE.B	(A1)+,D1	;Get byte to be checked
	ROL.L	#8,D1		;Make room for next byte
	MOVE.B	(A1),D1		;Get next byte
	ROL.L	#8,D1		;Make room for next byte
	MOVE.B	(A3)+,D1	;Get byte to be checked
	ROL.L	#8,D1		;Make room for next byte
	MOVE.B	(A3),D1		;Get next byte
	AND.L	D0,D1		;Apply mask
	CMP.L	D6,D1		;Match?
	BEQ.S	$2		;Yes
$15
	SUBQ.L	#1,D4		;More to check
	BGE	$1
$2
	BSR	CMSCHK		;Prints results - does not return if
				;		  no more to check
	BRA	$15		;Continue test

;XM [$X+]XXXXXX,[#,$X+]XXXXXX,[$X+]XXXXXX,[#,$X+]XXXXXX - Search mem to mem

CMXM
	BSR	FILLADDR	;Get search string address
	BNE	CMNDERRA	;Error detected in address/data field
	MOVEM.L A1-A2/D4,-(A7)	;Save search string info
	BSR	FILLADDR	;Get string to be searched
	BNE	CMNDERRA
	MOVEA.L A1,A5		;A5 : First address to be searched
	MOVE.L	D4,D6		;D6 : Size of string to be searched
	MOVEM.L (A7)+,A1-A2/D4	;Restore source data
	EXG	A1,A5		;Swap source and search string
	LEA	MSG35,A0	;Print Searching memory...
	BSR	TERMTEXT
	BSR	SETBE		;Setup for memory error
	SUB.L	D4,D6		;Calculate max search loop size
	BCS.S	$4		;Report no match
$1
	MOVEA.L A1,A4		;Starting string to be searched
	ADDQ.L	#1,A1		;Setup for next
	MOVE.L	D4,D7		;Set source search size
	MOVEA.L A5,A3		;Set source search string
$2
	MOVE.B	(A4)+,D1	;Char to be searched
	CMP.B	(A3)+,D1	;Match search char
	BNE.S	$3		;Try next group
	SUBQ.L	#1,D7		;Character matched try next
	BNE	$2
	BSR.S	CMSCHK		;Report find
$3
	SUBQ.L	#1,D6		;Try one up
	BGE	$1
$4
	BSR.S	CMSCHK		;Prints results - does not return if
				;		  no more to check
	NOP			;Assembler bug
	
;Report results of search

;			nz : String not found
;			A1 : Location of first match
;	BSR	CMSCHK
;			   : Returns if more to search
;			   : Goes to command level (DEBUG) if 
;			     no more to search

CMSCHK
	MOVEM.L A1-A6/D0-D6,-(A7) ;Save working register set
	BNE.S	$2		;Done no match found
	LEA	MSG36,A0	;Print Found match at:
	BSR	TERMTEXT
	SUBQ.L	#1,A1		;Set to proper address
	MOVE.L	A1,D0		;Print address
	BSR	PRNTADDR
	BSR	TERMCOLN
	MOVEQ	#3,D1		;Get value
$1
	ROL.L	#8,D0
	MOVE.B	(A1)+,D0
	DBF	D1,$1
	BSR	TERMHEXL	;Print long word value
	LEA	MSG37,A0	;Print Continue search ( C = Yes)?
	BSR	TERMTEXT
	BSR	KEYBCH		;Get response
	CMPI.B	#"C",D0		;Get C
	BNE.S	$3		;No - quit
	BSR	TERMCHAR	;Print character
	MOVEM.L (A7)+,A1-A6/D0-D6 ;Restore working register set
	RTS			;Return & continue processing
$2
	LEA	MSG34,A0	;Print No match found
	BSR	TERMTEXT
$3
	MOVEM.L (A7)+,A1-A6/D0-D6 ;Restore working register set
	MOVE.L	A2,BE_TRAP	;Restore trap
	BRA	DEBUG		;Quit 
	
                                                                                                                                              