Compucolor.org – Virtual Media

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	DRWSYM - DRAW A FIGURE ON THE SCREEN
;
;	VALUES ON ENTRY:
;
;	   B,C	=   X,Y SCREEN CO-ORDS
;			(COORDS ARE 0-63 FOR X AND 0-31 FOR Y,
;			 BUT OFF-SCREEN VALUES ARE HANDLED OK)
;	   DE	=>  POINTER TO GRAPHICS FIGURE
;	   H,L	=   WIDTH (BYTES INC. COMPOSITE COLOR CODE),
;			HEIGHT (NO. OF LINES)
;
;	ALL REGISTERS DESTROYED
;

	ENTRY	DRWSYM

LPS	EQU	32	;LINES PER SCREEN
CPL	EQU	64	;CHARACTERS PER LINE
BPL	EQU	128	;BYTES PER LINE

DRWSYM:	MOV	A,B	; ... STORE ALL THE NEEDED INFO
	STA	XCOORD	;
	MOV	A,H	;
	STA	WIDTH	;
	MOV	A,L
	STA	HEIGHT
	XCHG
	SHLD	GRPTR
	XCHG
	CALL	XYADDR	;GET ADDRESS IN REFRESH RAM
	PUSH	H
	SHLD	CRTRAM
	LDA	HEIGHT
	MOV	L,A
DRWS1:	MOV	A,C	;GO THROUGH EACH LINE OF THE FIGURE
	ORA	A
	JP	DRWS2
	JMP	DRWEND
DRWS2:	CPI	LPS	;SEE IF OFF BOTTOM OF SCREEN
	JNC	FIN	;AND RETURN IF TRUE
	LDA	WIDTH	;OTHERWISE LOOK AT X-COORD
	RRC		;DIVIDE BY TWO
	ANI	7FH
	MOV	H,A
	LDA	XCOORD
	MOV	B,A
DRWS3:	MOV	A,B	;CHECK X-COORD FOR EACH CHARACTER
	ORA	A
	JP	DRWS6
DRWS4:	XTHL		;OFF SCREEN TO LEFT, INCREMENT
	INX	H
	INX	H
	XTHL
	INX	D
	INX	D
DRWS5:	INR	B	;UPDATE X-COORD
	DCR	H	;SEE IF THIS LINE OF FIGURE FINISHED
	JNZ	DRWS3
	JMP	DRWEND
DRWS6:	CPI	CPL	;CHECK FOR OFF SCREEN TO RIGHT ...
	JNC	DRWEND
	XTHL		;... IF NOT, MOVE BYTE TO REFRESH RAM.
DRWS7:	LDAX	D
	MOV	M,A	;MOVE THE CHARACTER
	INX	D
	INX	H
	LDAX	D	;COMPOSITE COLOR CODE TOO
	MOV	M,A
DRWS8:	INX	D
	INX	H
	XTHL
	JMP	DRWS5
DRWEND:	INR	C	;GO TO NEXT LINE OF FIGURE
	DCR	L
	JZ	FIN	;RETURN IF NONE LEFT
	XTHL
	LHLD	CRTRAM	;UPDATE REFRESH RAM ADDRESS
	PUSH	D
	LXI	D,BPL
	DAD	D
	POP	D
	SHLD	CRTRAM
	XTHL
	PUSH	H
	LHLD	GRPTR	;UPDATE GRAPHICS POINTER
	LDA	WIDTH
	MOV	E,A
	MVI	D,0
	DAD	D
	SHLD	GRPTR
	XCHG
	POP	H
	JMP	DRWS1	;REPEAT FOR THIS LINE
FIN:	POP	H	;HL IS STARTING ADDRESS IN REFRESH RAM
	RET

;
;	TEMPORARY STORAGE AREA
;

XCOORD:	DS	1	;STARTING X-COORD OF FIGURE
WIDTH:	DS	1	;NUMBER OF BYTES IN FIGURE
HEIGHT:	DS	1	;NUMBER OF LINES IN FIGURE
CRTRAM:	DS	2	;ADDRESS IN REFRESH RAM
GRPTR:	DS	2	;POINTER TO GRAPHIC FOR FIGURE

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	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