Compucolor.org – Virtual Media

Listing of file='BLOCK.MAC;02' on disk='vmedia/sound_light_pen-sector.ccvf'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	BLOCK - DRAW A BLOCK 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)
;	   D,E  =   FILL CHARACTER, COMPOSITE COLOR CODE
;	   H,L	=   WIDTH (BYTES INC. COMPOSITE COLOR CODE),
;			HEIGHT (NO. OF LINES)
;
;	ALL REGISTERS DESTROYED
;

	EXTRN	XYADDR

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

	ENTRY	BLOCK

BLOCK:	MOV	A,B	; ... STORE ALL THE NEEDED INFO
	STA	XCOORD
	SHLD	HEIGHT
	XCHG
	SHLD	CCI
	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
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:	LDA	CHR
	MOV	M,A	;MOVE THE CHARACTER
	INX	H
	LDA	CCI	;COMPOSITE COLOR CODE TOO
	MOV	M,A
DRWS8:	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
	JMP	DRWS1	;REPEAT FOR THIS LINE
FIN:	POP	H	;HL IS STARTING ADDRESS IN REFRESH RAM
	RET

;
;	TEMPORARY STORAGE AREA
;

CCI:	DB	0	;COMPOSITE COLOR CODE TO USE
CHR:	DB	' '	;FILL CHARACTER
XCOORD:	DS	1	;STARTING X-COORD OF FIGURE
HEIGHT:	DB	3	;NUMBER OF LINES IN FIGURE
WIDTH:	DB	3	;NUMBER OF BYTES IN FIGURE
CRTRAM:	DS	2	;ADDRESS IN REFRESH RAM

	END