Compucolor.org – Virtual Media

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	MENU PROGRAM FOR USE WITH LIGHT PEN
;
;	VALUES ON ENTRY ARE IRRELEVANT
;
;	RETURNS:
;	   DE = BLOCK NUMBER IN THE LIST
;		(THE BLOCKS ARE NUMBERED STARTING AT ONE
;		 AT THE BEGINNING OF THE LIST.)
;		A ZERO INDICATES THAT THE PEN WAS NOT
;		POINTED AT ONE OF THE BLOCKS.
;
;	NOTE: DE IS USED FOR COMPATIBILITY WITH BASIC
;
;
;	DESTROYS ALL REGISTERS
;
;
;	   THE ROUTINE IS TABLE DRIVEN, WITH THE DATA FOR THE
;	MENU BLOCKS CONTAINED IN THE FOLLOWING PUBLIC TABLE.
;	ALL BLOCKS ARE THE SAME SIZE AND SHAPE, AND THEIR
;	POSITION IS SPECIFIED BY THEIR X-Y COORDS. IT IS NOT
;	NECESSARY THAT THE COORDS BE IN ANY ORDER.
;
	PUBLIC	BLKTAB

BLKTAB:
NOBLKS:	DB	12	;NUMBER OF BLOCKS
WIDTH:	DB	3	;WIDTH OF A BLOCK (IN CHRS)
HEIGHT:	DB	3	;HEIGHT
;
;	COMPOSITE COLOR CODES AND
;	X-Y ADDRESS OF TOP-LEFT CORNER FOR EACH BLOCK
;
ADDRS:	DB	8,10,4
	DB	16,10,9
	DB	32,10,14
	DB	24,10,19
	DB	48,10,24
	DB	40,10,29
	DB	8,40,4
	DB	16,40,9
	DB	32,40,14
	DB	24,40,19
	DB	48,40,24
	DB	40,40,29

	DS	24	;EXTRA SPACE FOR UP TO 20 BLOCKS

	EXTRN	BLOCK,LPTEST,SPULSE


	ENTRY	MENU

MENU:	LDA	NOBLKS
	LXI	H,ADDRS
MENU10:	PUSH	PSW
	MVI	D,' '	;SET FILL CHR AS SPACE
	MOV	E,M	;GET CCI
	INX	H
	CALL	NEWBLK	;DRAW NEXT BLOCK
	POP	PSW
	DCR	A	;ANY MORE ?
	JNZ	MENU10	;YES

	CALL	SPULSE	;NO, WAIT FOR TRIGGER
	CALL	LPTEST	;TEST PEN OUTPUT
	MOV	A,E
	ORA	D	;LIGHT DETECTED ?
	JZ	BAD	;NO

	LDA	NOBLKS	;YES, SCAN BLOCKS
	LXI	H,ADDRS
MENU20:	PUSH	PSW
	MVI	D,' '
	XRA	A
	MOV	E,A	;SET COLOR TO BLACK ON BLACK
	INX	H
	CALL	NEWBLK
	CALL	LPTEST	;CHECK PEN
	MOV	A,E
	ORA	D	;NO LIGHT ?
	PUSH	PSW	;SAVE RESULT OF TEST
	DCX	H	;BACKUP IN LIST
	DCX	H
	DCX	H
	MVI	D,' '
	MOV	E,M
	INX	H
	CALL	NEWBLK	;REDRAW THE BLOCK
	POP	PSW	;GET PEN STATUS BACK - LIGHT PRESENT ?
	JZ	FOUND	;NO - GOT IT!
	POP	PSW	;YES
	DCR	A	;ANOTHER BLOCK ?
	JNZ	MENU20	;YES

BAD:	XRA	A	;NO - ALL DONE AND NOT FOUND
	MOV	D,A	;RETURN ZERO
	MOV	E,A
	MOV	B,A
	MVI	A,' '
	STA	7FFEH
	RET

FOUND:	POP	PSW	;CALCULATE BLOCK NUMBER
	MOV	B,A
	LDA	NOBLKS
	SUB	B
	ADI	1
	MOV	E,A	;RETURN IN DE
	ADI	'0'
	STA	7FFEH	;INDICATE ON SCREEN
	XRA	A
	MOV	D,A
	MOV	B,A
	RET

;
;	DRAW A BLOCK ACCORDING TO PARAMETERS IN MEMORY
;
	ENTRY	NEWBLK

NEWBLK:	MOV	B,M	;GET BLOCK PARAMETERS
	INX	H
	MOV	C,M
	INX	H
	PUSH	H	;SAVE POINTER TO PARAMETERS
	LDA	WIDTH
	MOV	H,A
	LDA	HEIGHT
	MOV	L,A
	CALL	BLOCK	;DRAW THE BLOCK
	POP	H	;RESTORE PARAMETER POINTER
	RET

	END	MENU