; TVFrench module v1.01 by Vincent Lefvre - 11/08/2001

		GET	h:RegNames
		GET	h:SWINames

NCHAN		EQU	100	;Number of channels.

		AREA	TVFrench, CODE, PIC, READONLY
		ENTRY

BaseAddr	DCD	0
		DCD	RM_Init   -BaseAddr
		DCD	0
		DCD	0
		DCD	RM_Title  -BaseAddr
		DCD	RM_Help   -BaseAddr
		DCD	0
		DCD	&055880
		DCD	RM_Handler-BaseAddr
		DCD	RM_SWIdec -BaseAddr
		DCD	0

unknown		DCD	&1E6
		DCB	"Unknown TVFrench SWI",0
RM_Title	DCB	"TVFrench",0
RM_Help		DCB	"TVFrench",9,"1.01 (11 Aug 2001)",0
RM_SWIdec	DCB	"TV",0
		DCB	"Channel",0
		DCB	"TuneChannel",0
		DCB	0
too_high	DCD	0
		DCB	"Channel too high",0
bad_freq	DCD	0
		DCB	"Bad channel frequency",0

RM_Init		STMFD	SP!, {LR}
		LDR	R0, [R12]
		TEQ	R0, #0
		LDMNEFD	SP!, {PC}		;Return if reinit.
		MOV	R0, #6
		MOV	R3, #4*NCHAN
		SWI	XOS_Module		;Claim.
		LDMVSFD	SP!, {PC}		;Error if not enough memory.
		STR	R2, [R12]		;R2: pointer to workspace.
		MOV	R0, #0
init_loop	STR	R0, [R2], #4		;Clear the tune data.
		SUBS	R3, R3, #4
		BNE	init_loop
		LDMFD	SP!, {PC}

RM_Handler	CMP	R11, #2
		ADDCC	PC, PC, R11, LSL #2
		B	unknown_swi
		B	Channel
		B	TuneChannel

unknown_swi	ADR	R0, unknown
		ORRS	PC, LR, #VFlag

Channel		CMP	R0, #NCHAN
		ADRCS	R0, too_high
		ORRCSS	PC, LR, #VFlag		;Error if channel too high.
		LDR	R1, [R12]		;R1: pointer to workspace.
		MOV	R10, LR
		LDR	R6, [R1, R0, LSL #2]
		MOV	R2, #4
		ADD	R1, R1, R0, LSL #2
		MOV	R0, #&C2
		TEQ	R6, #0
		SWINE	XIIC_Control
		MOV	PC, R10

TuneChannel	CMP	R0, #NCHAN
		ADRCS	R0, too_high
		ORRCSS	PC, LR, #VFlag		;Error if channel too high.
		LDR	R12, [R12]		;R12: pointer to workspace.
		CMP	R2, #64
		MOVGT	R2, #64			;Fine tune <= 64.
		CMP	R2, #-64
		MOVLT	R2, #-64		;Fine tune >= -64.
		CMP	R1, #21
		RSBCS	R6, R1, #69
		LDRCS	R3, =&1562368E		;If 21 <= freq <= 69.
		BCS	store
		CMP	R1, #5
		RSBCS	R6, R1, #12
		LDRCS	R3, =&0AE2968E		;If 5 <= freq <= 12.
		ADRCC	R0, bad_freq
		ORRCCS	PC, LR, #VFlag		;Error if bad frequency.
store		ADD	R3, R3, R1, LSL #23
		ADD	R3, R3, R2, LSL #16
		MOV	R4, R3, LSL #16
		AND	R5, R3, #&00FF0000
		ORR	R4, R4, R5, LSR #8
		ORR	R4, R4, R3, LSR #24
		STR	R4, [R12, R0, LSL #2]
		MOV	PC, LR

		END
