	.TITLE	WRID5M


;	* * * ID-5500 SOFTWARE MODULE * * *


;	PERFORMS A DOUBLE-BUFFERED READ OF A SELECTED INTERLEAVED 512*512*8 BIT
;	IMAGE FILE, THEN WRITES IT TO AN ID-5500 IMAGE DISPLAY SYSTEM.

;	THE SINGLE CALLING ARGUMENT PASSES THE POINTER TO THE DATA BUFFERS.

;	ALL NEW CODE: 2 MAY 78
;	MODIFIED TO INCLUDE SUPPLIED CSR BITS: 4 NOVEMBER 78

;	PROGRAMMER: KEN DINWIDDIE

	.MCALL	..V2..,.REGDEF,.CSISPC,.LOOKUP,.QSET,.READ,.WAIT,.CLOSE

	..V2..

	.REGDEF

	.GLOBL	WRID5M

;	ID-5500 REGISTER DEFINITIONS:

	XREG	= 166000
	YREG	= 166002
	BPMR	= 166004
	CSR	= 166006
	DREG	= 166010
	.PAGE
	.SBTTL	DOUBLE-BUFFERED READ LOOP


WRID5M:	.QSET	#QUEUE,#3	; ADD 3 ELEMENTS TO I/O QUEUE
	.CSISPC	#IMFILE,#DEFEXT	; PICK UP INPUT FILE NAME
	TST	(SP)+		; NO SWITCHES - BUMP UP STACK POINTER
	.LOOKUP	#AREA,#0,#IMFIL1
	CLR	BLK		; SET TO FILE START
	TST	(R5)+		; POINT TO BUFFER ADDRESS
	MOV	(R5)+,BUFF1	; PICK UP BUFFER POINTER
	MOV	@(R5)+,R3	; PICK UP DESIRED CSR BITS
	BIS	#53,R3		; OR IN RASTER WRITE WITH GO BIT
	MOV	BUFF1,BUFF2
	ADD	#4096.,BUFF2	; OFFSET TO SECOND BUFFER
	MOV	#377,@#BPMR	; ENABLE LOWER 8 BITS OF BIT PLANE MASK
	MOV	#777,R2		; START AT TOP OF MEMORY (IES)
	.READ	#AREA,#0,BUFF1,#2048.,BLK	; READ A BUFFER FULL
FILLB:	.WAIT	#0		; WAIT FOR READ COMPLETION
	ADD	#10,BLK		; ADVANCE TO NEXT BLOCK
	.READ	#AREA,#0,BUFF2,#2048.,BLK	; READ A BUFFER FULL
	MOV	BUFF1,R1	; POINT TO BUFFER # 1
	JSR	PC,SHOW		; DISPLAY BUFFER # 1
	.WAIT	#0		; WAIT FOR READ COMPLETION
	ADD	#10,BLK		; ADVANCE TO NEXT BLOCK
	.READ	#AREA,#0,BUFF1,#2048.,BLK	; READ A BUFFER FULL
	MOV	BUFF2,R1	; POINT TO BUFFER # 2
	JSR	PC,SHOW		; DISPLAY BUFFER # 2
	BR	FILLB
	.PAGE
	.SBTTL	WRITE 8 INTERLEAVED LINES TO ID-5500 MEMORY

SHOW:	MOV	#10,R5		; INITIALIZE BLOCK COUNTER
	MOV	#DREG,R0	; INITIALIZE FOR SINGLE-INSTRUCTION OPERATION
SHOW1:	CLR	@#XREG		; INITIALIZE X REGISTER TO LINE BUFFER START
	.REPT	512.
	MOVB	(R1)+,(R0)	; FILL LINE BUFFER FROM DATA BUFFER
	.ENDR
	MOV	R2,@#YREG	; SET ROW NUMBER
	MOV	R3,@#CSR	; ENABLE RASTER TRANSFER
WAIT:	TSTB	@#CSR		; WAIT FOR READY TO SHOW
	BPL	WAIT
	TST	R2		; LAST ROW TO SHOW ?
	BEQ	DONE		; QUIT IF SO
	SUB	#200,R2		; DROP DOWN 128 ROWS
	BPL	SHOW3		; SKIP BIASING STEP IF STILL POSITIVE
	ADD	#777,R2		; MOVE BACK NEAR IMAGE TOP IF BELOW BOTTOM
SHOW3:	DEC	R5		; ACCOUNT FOR THIS ROW
	BEQ	SHOW5		; GO RETURN IF EIGHT LINES OUT
	JMP	SHOW1		; GO GET THE NEXT LINE IF MORE TO DO
SHOW5:	RTS	PC

DONE:	TST	(SP)+		; BUMP STACK POINTER UP ONE
	.CLOSE	#0		; CLOSE DISK FILE
	RTS	PC		; AND RETURN TO CALLING PROGRAM
	.PAGE
	.SBTTL	BUFFERS, POINTERS, VARIABLES, ETC.


BLK:	.WORD	0		; DISK TRANSFER BLOCK NUMBER
AREA:	.BLKW	6		; SPACE FOR REQUEST BLOCK
BUFF1:	.WORD	0		; POINTER TO BUFFER # 1
BUFF2:	.WORD	0		; POINTER TO BUFFER # 2
DEFEXT:	.RAD50	/PIC/		; DEFAULT IMAGE FILE EXTENSION
	.WORD	0,0,0
IMFILE:	.BLKW	17		; SPACE FOR OUTPUT FILE SPECS
IMFIL1:	.BLKW	30		; SPACE FOR INPUT FILE SPECIFICATION
QUEUE:	.BLKW	7*3		; SPACE FOR 3 MORE I/O QUEUE ELEMENTS
	.END
 