Compucolor.org – Virtual Media

Listing of file='SOUND2.MAC;04' on disk='vmedia/asm_utility_routines-sideB-sector.ccvf'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	SOUNDWARE ROUTINE USING TIMER #2
;
;	BECAUSE THE SOUNDS ARE INTERRUPT DRIVEN, THE MAIN
;	PROGRAM CAN CONTINUE EXECUTING.
;
;	VALUES ON ENTRY:
;	   THE PUBLIC VARIABLES BELOW MUST BE INITIALISED FOR
;	THE REQUIRED SOUND.
;
;	RETURNS:
;	   NOTHING. FINFLG IS SET WHEN THE SOUND IS FINISHED.
;
;	DESTROYS:
;	   ALL REGISTERS
;	   THE PUBLIC VARIABLES ARE ALSO DESTROYED AND MUST
;	BE RELOADED BEFORE EACH CALL. (DEFAULT IS 'PING')
;

	ENTRY	SOUND
	PUBLIC	PITCH,DURN,NSTEPS,STEP1,STEP2
	PUBLIC	FINFLG

	EXTRN	SAVE

CMDREG	EQU	04
TM2INT	EQU	81C8H
TIMER2	EQU	10

SOUND:	MVI	A,8	;MASK FOR 5501 BREAK BIT
	STA	MASK
	MVI	A,0C3H	;SETUP JUMP TO INTERRUPT ROUTINE
	LXI	H,PLAY
	STA	TM2INT	;   FOR TIMER #2
	SHLD	TM2INT+1
	LDA	STEP1
	MOV	B,A
	LDA	STEP2
	ORA	A	;MAKE STEP2 = STEP1 IF IT IS ZERO
	JNZ	OVER
	MOV	A,B
	STA	STEP2
OVER:	XRA	A	;CLEAR THE "FINISHED" FLAG
	STA	FINFLG
	LHLD	DURN	;MAKE COPIES OF PITCH AND DURN
	SHLD	DURSAV
	LHLD	PITCH
	SHLD	PITSAV
	LDA	MASK	;SET BREAK BIT IN 5501
	OUT	CMDREG
	MOV	A,L	;START TIMER #2
	OUT	TIMER2	;   AND RETURN TO MAIN PROGRAM ---
	EI		;   EVERYTHING WORKS BY INTERRUPTS NOW
	RET

;
;	TIMER #2 INTERRUPT ROUTINE
;

PLAY:	CALL	SAVE	;SAVE REGISTERS
	LHLD	PITCH	;CHECK PITCH EXPIRED ...
	DCR	H
	SHLD	PITCH
	JNZ	RETIME	;... NO, KEEP TICKING AWAY
	LHLD	PITSAV	;RESTORE THE PITCH COUNTERS
	SHLD	PITCH
	LDA	MASK
	XRI	02	;TOGGLE THE BREAK BIT
	STA	MASK
	OUT	CMDREG	;SEND IT TO THE 5501 CHIP
	LHLD	DURN	;CHECK DURATION EXPIRED
	DCX	H
	SHLD	DURN
	MOV	A,H
	ORA	L
	LHLD	PITCH
	JNZ	RETIME	;AND REPEAT IF NOT
	LHLD	DURSAV	;RESET THE DURATION
	SHLD	DURN
	LDA	NSTEPS
	ORA	A	;SEE IF ANY STEPS LEFT TO GO
	JZ	FINISH
	DCR	A
	STA	NSTEPS
	LHLD	PITCH
	LDA	STEP1	;CHANGE THE PITCH
	MOV	B,A
	ADD	L
	MOV	L,A
	SHLD	PITCH
	SHLD	PITSAV
	LDA	STEP2	;SWAP STEP1 AND STEP2 FOR NEXT TIME
	STA	STEP1
	MOV	A,B
	STA	STEP2
RETIME:	MOV	A,L	;RESTART THE TIMER FOR NEXT ONE
	OUT	TIMER2
	RET

FINISH:	STA	STEP2	;STORE ZEROS (TRICKY!)
	STA	STEP1
	STA	NSTEPS
	LXI	H,15	;SET UP FOR A 'PING' SOUND
	SHLD	DURN
	LXI	H,0132H
	SHLD	PITCH
	MVI	A,0FFH	;SET THE "FINISHED" FLAG
	STA	FINFLG
	RET

;
;	SOUND PARAMETERS
;

PITCH:	DB	50,1	;DEFAULTS FOR 'PING' SOUND
PITSAV:	DB	50,1
DURN:	DB	15,0
DURSAV:	DB	15,0
NSTEPS:	DB	0
STEP1:	DB	0
STEP2:	DB	0
MASK:	DB	8
FINFLG:	DB	0

	END