Compucolor.org – Virtual Media

Listing of file='XYADDR.MAC;01' on disk='vmedia/asm_utility_routines-sideA-sector.ccvf'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	XHGCHR - EXCHANGE A CHARACTER WITH ONE ON THE SCREEN
;
;	VALUES ON ENTRY:
;	   B,C  =  X,Y SCREEN CO-ORDS
;	   D,E  =  CHARACTER AND CCI TO EXCHANGE
;
;	RETURNS:
;	   D,E  =  CHARACTER AND CCI FROM THE SCREEN
;
;	DESTROYS NOTHING
;
;	NOTE: COORDS MUST BE ON THE SCREEN
;

	ENTRY XHGCHR

XHGCHR:	PUSH	H
	PUSH	B
	CALL	XYADDR	;GET ADDRESS IN REFRESH RAM
	MOV	B,M	;RETRIEVE CHR AND CCI
	INX	H
	MOV	C,M
	MOV	M,E	;STORE NEW CHR AND CCI
	DCX	H
	MOV	M,D
	MOV	D,B	;RETURN OLD CHR AND CCI
	MOV	E,C
	POP	B
	POP	H
	RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	XYADDR - CONVERT SCREEN COORDS TO REFRESH RAM ADDR
;
;
;	VALUES ON ENTRY:
;	   B,C	=   X,Y SCREEN CO-ORDS - TWO'S COMPLEMENT
;			(COORDS: 0-63 FOR X, 0-31 FOR Y.
;			 MAY BE OFF SCREEN I.E. OUTSIDE THESE
;			 RANGES, AND WILL STILL RETURN A VALID
;			 ADDRESS OUTSIDE REFRESH RAM)
;
;	RETURNS:
;	   HL	=   ADDRESS 'IN' REFRESH RAM (IF ON SCREEN)
;
;	DESTROYS NOTHING
;
;	NOTE: COORDS MAY BE OFF SCREEN. THIS IS DONE TO ALLOW
;	      FIGURES TO MOVE PARTIALLY OFF SCREEN.
;

	ENTRY	XYADDR

SCREEN	EQU	7000H	;START OF REFRESH RAM

XYADDR:	PUSH	D
	MOV	L,C
	MVI	H,0
	XRA	A	;SEE IF Y-COORD NEGATIVE
	ADD	C
	JP	MUL128
	MVI	H,0FFH	;MAKE ALL 16 BITS NEGATIVE
MUL128:	DAD	H	; MULTIPLY BY 128 - X 2
	DAD	H	;    X 4
	DAD	H	;    X 8
	DAD	H	;    X 16
	DAD	H	;    X 32
	DAD	H	;    X 64
	DAD	H	;    X 128
	LXI	D,SCREEN
	DAD	D
	MOV	E,B
	MVI	D,0
	XRA	A	;SEE IF X-COORD NEGATIVE
	ADD	B
	JP	ADD2
	MVI	D,0FFH	;AND EXTEND SIGN IF NECESSARY
ADD2:	DAD	D
	DAD	D
	POP	D
	RET

	END