changeset 390:37ee46a0dde7

compal/sym-fw-disasm: some study of buz.obj code
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 01 Apr 2022 04:30:44 +0000
parents 623316d1ece7
children a40557e5b35f
files compal/sym-fw-disasm
diffstat 1 files changed, 543 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/compal/sym-fw-disasm	Thu Mar 31 20:56:56 2022 +0000
+++ b/compal/sym-fw-disasm	Fri Apr 01 04:30:44 2022 +0000
@@ -4,6 +4,9 @@
 ; critical board-specific init functions and in order to better prepare
 ; ourselves for doing similar analysis on other Compal fw versions
 ; for which we don't have any symbols.
+;
+; 2022 update: we have now also done some disassembly of Compal's buzzer
+; melody player code, guided by the linker map and symbol table.
 
        0:	ea000225	b	0x89c
        4:	ea000825	b	0x20a0
@@ -203,6 +206,437 @@
     22f8:	e1a00002	mov	r0, r2
     22fc:	ea061cdf	b	0x189680	; _INC_Initialize
 
+; Compal-original buz.obj .text section
+
+$PWT_BZ_set:
+  16dba8:	49de		ldr	r1, =0xfffef008	; via 0x16df24
+  16dbaa:	2020		mov	r0, #32	; 0x20
+  16dbac:	880a		ldrh	r2, [r1, #0]
+  16dbae:	4310		orr	r0, r2
+  16dbb0:	8008		strh	r0, [r1, #0]
+  16dbb2:	4770		bx	lr
+
+$PWT_BZ_reset:
+  16dbb4:	49db		ldr	r1, =0xfffef008	; via 0x16df24
+  16dbb6:	48dc		ldr	r0, =0xffdf	; via 0x16df28
+  16dbb8:	880a		ldrh	r2, [r1, #0]
+  16dbba:	4010		and	r0, r2
+  16dbbc:	8008		strh	r0, [r1, #0]
+  16dbbe:	4770		bx	lr
+
+$lmi_buzzer_on:
+  16dbc0:	b510		push	{r4, lr}
+  16dbc2:	4bda		ldr	r3, =0xfffe8802	; via 0x16df2c
+  16dbc4:	2201		mov	r2, #1
+  16dbc6:	781c		ldrb	r4, [r3, #0]
+  16dbc8:	4322		orr	r2, r4
+  16dbca:	701a		strb	r2, [r3, #0]
+  16dbcc:	4ad8		ldr	r2, =0xfffe8800	; via 0x16df30
+  16dbce:	7010		strb	r0, [r2, #0]
+  16dbd0:	2001		mov	r0, #1
+  16dbd2:	0049		lsl	r1, r1, #1
+  16dbd4:	4308		orr	r0, r1
+  16dbd6:	7050		strb	r0, [r2, #1]
+  16dbd8:	bd10		pop	{r4, pc}
+
+$lmi_buzzer_off:
+  16dbda:	48d6		ldr	r0, =0xfffe8801	; via 0x16df34
+  16dbdc:	7841		ldrb	r1, [r0, #1]
+  16dbde:	0849		lsr	r1, r1, #1
+  16dbe0:	d305		bcc	0x16dbee
+  16dbe2:	2100		mov	r1, #0
+  16dbe4:	7001		strb	r1, [r0, #0]
+  16dbe6:	21fe		mov	r1, #254	; 0xfe
+  16dbe8:	7842		ldrb	r2, [r0, #1]
+  16dbea:	4011		and	r1, r2
+  16dbec:	7041		strb	r1, [r0, #1]
+  16dbee:	4770		bx	lr
+
+$pick_tempo_shift:
+  16dbf0:	1e80		sub	r0, r0, #2
+  16dbf2:	2800		cmp	r0, #0
+  16dbf4:	d012		beq	0x16dc1c
+  16dbf6:	3801		sub	r0, #1
+  16dbf8:	2800		cmp	r0, #0
+  16dbfa:	d00d		beq	0x16dc18
+  16dbfc:	3803		sub	r0, #3
+  16dbfe:	2802		cmp	r0, #2
+  16dc00:	d90a		bls	0x16dc18
+  16dc02:	3806		sub	r0, #6
+  16dc04:	2801		cmp	r0, #1
+  16dc06:	d907		bls	0x16dc18
+  16dc08:	3803		sub	r0, #3
+  16dc0a:	2802		cmp	r0, #2
+  16dc0c:	d904		bls	0x16dc18
+  16dc0e:	3804		sub	r0, #4
+  16dc10:	2801		cmp	r0, #1
+  16dc12:	d901		bls	0x16dc18
+  16dc14:	2000		mov	r0, #0
+  16dc16:	4770		bx	lr
+  16dc18:	2001		mov	r0, #1
+  16dc1a:	4770		bx	lr
+  16dc1c:	2002		mov	r0, #2
+  16dc1e:	4770		bx	lr
+
+$pick_freq_shift:
+  16dc20:	1e40		sub	r0, r0, #1
+  16dc22:	2813		cmp	r0, #19	; 0x13
+  16dc24:	d903		bls	0x16dc2e
+  16dc26:	3825		sub	r0, #37	; 0x25
+  16dc28:	2800		cmp	r0, #0
+  16dc2a:	d02f		beq	0x16dc8c
+  16dc2c:	e02c		b	0x16dc88
+  16dc2e:	a102		add	r1, pc, #8
+  16dc30:	0080		lsl	r0, r0, #2
+  16dc32:	5808		ldr	r0, [r1, r0]
+  16dc34:	4687		mov	pc, r0
+  16dc36:	46c0		nop			(mov r8, r8)
+
+  16dc38:	0016dca8
+  16dc3c:	0016dca4
+  16dc40:	0016dca0
+  16dc44:	0016dca8
+  16dc48:	0016dc9c
+  16dc4c:	0016dca8
+  16dc50:	0016dc88
+  16dc54:	0016dca8
+  16dc58:	0016dc98
+  16dc5c:	0016dc98
+  16dc60:	0016dc90
+  16dc64:	0016dc90
+  16dc68:	0016dc9c
+  16dc6c:	0016dc9c
+  16dc70:	0016dc88
+  16dc74:	0016dc98
+  16dc78:	0016dca8
+  16dc7c:	0016dc88
+  16dc80:	0016dc94
+  16dc84:	0016dc90
+
+  16dc88:	2100		mov	r1, #0
+  16dc8a:	e00f		b	0x16dcac
+  16dc8c:	2101		mov	r1, #1
+  16dc8e:	e00d		b	0x16dcac
+  16dc90:	2103		mov	r1, #3
+  16dc92:	e00a		b	0x16dcaa
+  16dc94:	2106		mov	r1, #6
+  16dc96:	e008		b	0x16dcaa
+  16dc98:	2101		mov	r1, #1
+  16dc9a:	e006		b	0x16dcaa
+  16dc9c:	2102		mov	r1, #2
+  16dc9e:	e004		b	0x16dcaa
+  16dca0:	2105		mov	r1, #5
+  16dca2:	e002		b	0x16dcaa
+  16dca4:	2108		mov	r1, #8
+  16dca6:	e000		b	0x16dcaa
+  16dca8:	2104		mov	r1, #4
+  16dcaa:	43c9		mvn	r1, r1
+  16dcac:	48a2		ldr	r0, =0x83e408	; _freq_shift
+  16dcae:	6001		str	r1, [r0, #0]
+  16dcb0:	2100		mov	r1, #0
+  16dcb2:	5e40		ldrsh	r0, [r0, r1]
+  16dcb4:	4770		bx	lr
+
+$lmi_custom_tone_req_ring:
+  16dcb6:	b5f0		push	{r4, r5, r6, r7, lr}
+  16dcb8:	1c04		add	r4, r0, #0
+  16dcba:	4da0		ldr	r5, =0x83e414	; _lmi_audio_control
+  16dcbc:	2005		mov	r0, #5
+  16dcbe:	7028		strb	r0, [r5, #0]
+  16dcc0:	2c25		cmp	r4, #37	; 0x25
+  16dcc2:	d001		beq	0x16dcc8
+  16dcc4:	2c26		cmp	r4, #38	; 0x26
+  16dcc6:	d101		bne	0x16dccc
+  16dcc8:	2004		mov	r0, #4
+  16dcca:	7028		strb	r0, [r5, #0]
+  16dccc:	2600		mov	r6, #0
+  16dcce:	706e		strb	r6, [r5, #1]
+  16dcd0:	2c01		cmp	r4, #1
+  16dcd2:	d101		bne	0x16dcd8
+  16dcd4:	489a		ldr	r0, =0x34ab4	; _custom_tone_volume_table_1
+  16dcd6:	e008		b	0x16dcea
+  16dcd8:	2c02		cmp	r4, #2
+  16dcda:	d003		beq	0x16dce4
+  16dcdc:	2c0b		cmp	r4, #11	; 0xb
+  16dcde:	d001		beq	0x16dce4
+  16dce0:	2c09		cmp	r4, #9
+  16dce2:	d101		bne	0x16dce8
+  16dce4:	4897		ldr	r0, =0x34abc	; _custom_tone_volume_table_2
+  16dce6:	e000		b	0x16dcea
+  16dce8:	4897		ldr	r0, =0x34aac	; _custom_tone_volume_table
+  16dcea:	5c40		ldrb	r0, [r0, r1]
+  16dcec:	70a8		strb	r0, [r5, #2]
+  16dcee:	70ea		strb	r2, [r5, #3]
+  16dcf0:	2701		mov	r7, #1
+  16dcf2:	712f		strb	r7, [r5, #4]
+  16dcf4:	80ee		strh	r6, [r5, #6]
+  16dcf6:	f018 faeb	bl	0x1862d0	; $mmiGetRingTone
+  16dcfa:	2c00		cmp	r4, #0
+  16dcfc:	dd1d		ble	0x16dd3a
+  16dcfe:	2c2a		cmp	r4, #42	; 0x2a
+  16dd00:	dc1b		bgt	0x16dd3a
+  16dd02:	0121		lsl	r1, r4, #4
+  16dd04:	1841		add	r1, r0, r1
+  16dd06:	4a91		ldr	r2, =0x83e40c	; _lmi_playing_tone
+  16dd08:	1c08		add	r0, r1, #0
+  16dd0a:	3810		sub	r0, #16	; 0x10
+  16dd0c:	6800		ldr	r0, [r0, #0]
+  16dd0e:	6010		str	r0, [r2, #0]
+  16dd10:	200c		mov	r0, #12	; 0xc
+  16dd12:	1a08		sub	r0, r1, r0
+  16dd14:	498e		ldr	r1, =0x83e410	; _freq_component
+  16dd16:	7802		ldrb	r2, [r0, #0]
+  16dd18:	700a		strb	r2, [r1, #0]
+  16dd1a:	498e		ldr	r1, =0x83e411	; _style_infor
+  16dd1c:	700f		strb	r7, [r1, #0]
+  16dd1e:	2c2a		cmp	r4, #42	; 0x2a
+  16dd20:	db02		blt	0x16dd28
+  16dd22:	4885		ldr	r0, =0x83e408	; _freq_shift
+  16dd24:	6006		str	r6, [r0, #0]
+  16dd26:	e006		b	0x16dd36
+  16dd28:	4a83		ldr	r2, =0x83e408	; _freq_shift
+  16dd2a:	6841		ldr	r1, [r0, #4]
+  16dd2c:	6011		str	r1, [r2, #0]
+  16dd2e:	6880		ldr	r0, [r0, #8]
+  16dd30:	7829		ldrb	r1, [r5, #0]
+  16dd32:	1840		add	r0, r0, r1
+  16dd34:	7028		strb	r0, [r5, #0]
+  16dd36:	4888		ldr	r0, =0x83e404	; _lmi_play_state
+  16dd38:	7007		strb	r7, [r0, #0]
+  16dd3a:	bdf0		pop	{r4, r5, r6, r7, pc}
+
+$lmi_custom_tone_req:
+  16dd3c:	b530		push	{r4, r5, lr}
+  16dd3e:	4c7f		ldr	r4, =0x83e414	; _lmi_audio_control
+  16dd40:	2505		mov	r5, #5
+  16dd42:	7025		strb	r5, [r4, #0]
+  16dd44:	2500		mov	r5, #0
+  16dd46:	7065		strb	r5, [r4, #1]
+  16dd48:	4d7f		ldr	r5, =0x34aac	; _custom_tone_volume_table
+  16dd4a:	5c69		ldrb	r1, [r5, r1]
+  16dd4c:	70a1		strb	r1, [r4, #2]
+  16dd4e:	70e2		strb	r2, [r4, #3]
+  16dd50:	2101		mov	r1, #1
+  16dd52:	7121		strb	r1, [r4, #4]
+  16dd54:	2200		mov	r2, #0
+  16dd56:	80e2		strh	r2, [r4, #6]
+  16dd58:	4a7e		ldr	r2, =0x83e411	; _style_infor
+  16dd5a:	7011		strb	r1, [r2, #0]
+  16dd5c:	4a7b		ldr	r2, =0x83e40c	; _lmi_playing_tone
+  16dd5e:	6010		str	r0, [r2, #0]
+  16dd60:	487b		ldr	r0, =0x83e410	; _freq_component
+  16dd62:	7003		strb	r3, [r0, #0]
+  16dd64:	4874		ldr	r0, =0x83e408	; _freq_shift
+  16dd66:	2200		mov	r2, #0
+  16dd68:	6002		str	r2, [r0, #0]
+  16dd6a:	487b		ldr	r0, =0x83e404	; _lmi_play_state
+  16dd6c:	7001		strb	r1, [r0, #0]
+  16dd6e:	bd30		pop	{r4, r5, pc}
+
+$DM_buzzer_ringtone_control:
+  16dd70:	b500		push	{lr}
+  16dd72:	2800		cmp	r0, #0
+  16dd74:	d107		bne	0x16dd86
+  16dd76:	f7ff ff30	bl	0x16dbda	; $lmi_buzzer_off
+  16dd7a:	f7ff ff1b	bl	0x16dbb4	; $PWT_BZ_reset
+  16dd7e:	4976		ldr	r1, =0x83e404	; _lmi_play_state
+  16dd80:	2000		mov	r0, #0
+  16dd82:	7008		strb	r0, [r1, #0]
+  16dd84:	bd00		pop	{pc}
+  16dd86:	1c10		add	r0, r2, #0
+  16dd88:	1c1a		add	r2, r3, #0
+  16dd8a:	f7ff ff94	bl	0x16dcb6	; $lmi_custom_tone_req_ring
+  16dd8e:	f7ff ff0b	bl	0x16dba8	; $PWT_BZ_set
+  16dd92:	bd00		pop	{pc}
+
+$DM_buzzer_control:
+  16dd94:	b590		push	{r4, r7, lr}
+  16dd96:	af03		add	r7, sp, #12	; 0xc
+  16dd98:	1c1c		add	r4, r3, #0
+  16dd9a:	783b		ldrb	r3, [r7, #0]
+  16dd9c:	2800		cmp	r0, #0
+  16dd9e:	d107		bne	0x16ddb0
+  16dda0:	f7ff ff1b	bl	0x16dbda	; $lmi_buzzer_off
+  16dda4:	f7ff ff06	bl	0x16dbb4	; $PWT_BZ_reset
+  16dda8:	496b		ldr	r1, =0x83e404	; _lmi_play_state
+  16ddaa:	2000		mov	r0, #0
+  16ddac:	7008		strb	r0, [r1, #0]
+  16ddae:	bd90		pop	{r4, r7, pc}
+  16ddb0:	1c10		add	r0, r2, #0
+  16ddb2:	1c22		add	r2, r4, #0
+  16ddb4:	f7ff ffc2	bl	0x16dd3c	; $lmi_custom_tone_req
+  16ddb8:	f7ff fef6	bl	0x16dba8	; $PWT_BZ_set
+  16ddbc:	bd90		pop	{r4, r7, pc}
+
+$BZ_status:
+  16ddbe:	2000		mov	r0, #0
+  16ddc0:	4965		ldr	r1, =0x83e404	; _lmi_play_state
+  16ddc2:	7809		ldrb	r1, [r1, #0]
+  16ddc4:	2900		cmp	r1, #0
+  16ddc6:	d000		beq	0x16ddca
+  16ddc8:	2001		mov	r0, #1
+  16ddca:	4770		bx	lr
+
+$lmi_custom_tone_handler:
+  16ddcc:	b570		push	{r4, r5, r6, lr}
+  16ddce:	b094		sub	sp, #80	; 0x50
+  16ddd0:	4d61		ldr	r5, =0x83e404	; _lmi_play_state
+  16ddd2:	7828		ldrb	r0, [r5, #0]
+  16ddd4:	2800		cmp	r0, #0
+  16ddd6:	d100		bne	0x16ddda
+  16ddd8:	e099		b	0x16df0e
+  16ddda:	485c		ldr	r0, =0x83e40c	; _lmi_playing_tone
+  16dddc:	6801		ldr	r1, [r0, #0]
+  16ddde:	4c57		ldr	r4, =0x83e414	; _lmi_audio_control
+  16dde0:	7860		ldrb	r0, [r4, #1]
+  16dde2:	0080		lsl	r0, r0, #2
+  16dde4:	180e		add	r6, r1, r0
+  16dde6:	7920		ldrb	r0, [r4, #4]
+  16dde8:	1e40		sub	r0, r0, #1
+  16ddea:	2800		cmp	r0, #0
+  16ddec:	d053		beq	0x16de96
+  16ddee:	3801		sub	r0, #1
+  16ddf0:	2800		cmp	r0, #0
+  16ddf2:	d035		beq	0x16de60
+  16ddf4:	3801		sub	r0, #1
+  16ddf6:	2800		cmp	r0, #0
+  16ddf8:	d15b		bne	0x16deb2
+  16ddfa:	2006		mov	r0, #6
+  16ddfc:	5f00		ldrsh	r0, [r0, r4]
+  16ddfe:	2800		cmp	r0, #0
+  16de00:	dc44		bgt	0x16de8c
+  16de02:	7860		ldrb	r0, [r4, #1]
+  16de04:	3001		add	r0, #1
+  16de06:	7060		strb	r0, [r4, #1]
+  16de08:	7860		ldrb	r0, [r4, #1]
+  16de0a:	0080		lsl	r0, r0, #2
+  16de0c:	180d		add	r5, r1, r0
+  16de0e:	8868		ldrh	r0, [r5, #2]
+  16de10:	2800		cmp	r0, #0
+  16de12:	d10f		bne	0x16de34
+  16de14:	7861		ldrb	r1, [r4, #1]
+  16de16:	484e		ldr	r0, =0x83e410	; _freq_component
+  16de18:	7800		ldrb	r0, [r0, #0]
+  16de1a:	3801		sub	r0, #1
+  16de1c:	4281		cmp	r1, r0
+  16de1e:	da04		bge	0x16de2a
+  16de20:	4944		ldr	r1, =0xfffe8801	; via 0x16df34
+  16de22:	2000		mov	r0, #0
+  16de24:	7008		strb	r0, [r1, #0]
+  16de26:	2003		mov	r0, #3
+  16de28:	e015		b	0x16de56
+  16de2a:	2001		mov	r0, #1
+  16de2c:	7120		strb	r0, [r4, #4]
+  16de2e:	2000		mov	r0, #0
+  16de30:	7060		strb	r0, [r4, #1]
+  16de32:	e011		b	0x16de58
+  16de34:	4840		ldr	r0, =0x83e408	; _freq_shift
+  16de36:	8801		ldrh	r1, [r0, #0]
+  16de38:	8868		ldrh	r0, [r5, #2]
+  16de3a:	1808		add	r0, r1, r0
+  16de3c:	0400		lsl	r0, r0, #16
+  16de3e:	0c00		lsr	r0, r0, #16
+  16de40:	0040		lsl	r0, r0, #1
+  16de42:	4946		ldr	r1, =0x34ac4	; _l1_tone_table
+  16de44:	5c08		ldrb	r0, [r1, r0]
+  16de46:	78a1		ldrb	r1, [r4, #2]
+  16de48:	786a		ldrb	r2, [r5, #1]
+  16de4a:	1889		add	r1, r1, r2
+  16de4c:	0609		lsl	r1, r1, #24
+  16de4e:	0e09		lsr	r1, r1, #24
+  16de50:	f7ff feb6	bl	0x16dbc0	; $lmi_buzzer_on
+  16de54:	2002		mov	r0, #2
+  16de56:	7120		strb	r0, [r4, #4]
+  16de58:	7828		ldrb	r0, [r5, #0]
+  16de5a:	7821		ldrb	r1, [r4, #0]
+  16de5c:	4348		mul	r0, r1
+  16de5e:	e018		b	0x16de92
+  16de60:	2006		mov	r0, #6
+  16de62:	5f00		ldrsh	r0, [r0, r4]
+  16de64:	2800		cmp	r0, #0
+  16de66:	dc11		bgt	0x16de8c
+  16de68:	2100		mov	r1, #0
+  16de6a:	4832		ldr	r0, =0xfffe8801	; via 0x16df34
+  16de6c:	7001		strb	r1, [r0, #0]
+  16de6e:	7862		ldrb	r2, [r4, #1]
+  16de70:	4837		ldr	r0, =0x83e410	; _freq_component
+  16de72:	7800		ldrb	r0, [r0, #0]
+  16de74:	3801		sub	r0, #1
+  16de76:	4282		cmp	r2, r0
+  16de78:	db02		blt	0x16de80
+  16de7a:	2001		mov	r0, #1
+  16de7c:	7061		strb	r1, [r4, #1]
+  16de7e:	e003		b	0x16de88
+  16de80:	4834		ldr	r0, =0x83e411	; _style_infor
+  16de82:	7800		ldrb	r0, [r0, #0]
+  16de84:	80e0		strh	r0, [r4, #6]
+  16de86:	2003		mov	r0, #3
+  16de88:	7120		strb	r0, [r4, #4]
+  16de8a:	e040		b	0x16df0e
+  16de8c:	2006		mov	r0, #6
+  16de8e:	5f00		ldrsh	r0, [r0, r4]
+  16de90:	3801		sub	r0, #1
+  16de92:	80e0		strh	r0, [r4, #6]
+  16de94:	e03b		b	0x16df0e
+  16de96:	4668		mov	r0, sp
+  16de98:	a11e		add	r1, pc, #120	; 0x78
+  16de9a:	f01a f9e7	bl	0x18826c	; $sprintf
+  16de9e:	4668		mov	r0, sp
+  16dea0:	f751 fd90	bl	0xbf9c4		; $L1_send_debug
+  16dea4:	78e0		ldrb	r0, [r4, #3]
+  16dea6:	2800		cmp	r0, #0
+  16dea8:	d003		beq	0x16deb2
+  16deaa:	4829		ldr	r0, =0x83e410	; _freq_component
+  16deac:	7800		ldrb	r0, [r0, #0]
+  16deae:	2800		cmp	r0, #0
+  16deb0:	d106		bne	0x16dec0
+  16deb2:	f7ff fe92	bl	0x16dbda	; $lmi_buzzer_off
+  16deb6:	f7ff fe7d	bl	0x16dbb4	; $PWT_BZ_reset
+  16deba:	2000		mov	r0, #0
+  16debc:	7028		strb	r0, [r5, #0]
+  16debe:	e026		b	0x16df0e
+  16dec0:	8870		ldrh	r0, [r6, #2]
+  16dec2:	2800		cmp	r0, #0
+  16dec4:	d109		bne	0x16deda
+  16dec6:	481b		ldr	r0, =0xfffe8801	; via 0x16df34
+  16dec8:	1c42		add	r2, r0, #1
+  16deca:	2101		mov	r1, #1
+  16decc:	7813		ldrb	r3, [r2, #0]
+  16dece:	4319		orr	r1, r3
+  16ded0:	7011		strb	r1, [r2, #0]
+  16ded2:	2100		mov	r1, #0
+  16ded4:	7001		strb	r1, [r0, #0]
+  16ded6:	2003		mov	r0, #3
+  16ded8:	e00f		b	0x16defa
+  16deda:	4917		ldr	r1, =0x83e408	; _freq_shift
+  16dedc:	8809		ldrh	r1, [r1, #0]
+  16dede:	1840		add	r0, r0, r1
+  16dee0:	0400		lsl	r0, r0, #16
+  16dee2:	0c00		lsr	r0, r0, #16
+  16dee4:	0040		lsl	r0, r0, #1
+  16dee6:	491d		ldr	r1, =0x34ac4	; _l1_tone_table
+  16dee8:	5c08		ldrb	r0, [r1, r0]
+  16deea:	78a1		ldrb	r1, [r4, #2]
+  16deec:	7872		ldrb	r2, [r6, #1]
+  16deee:	1889		add	r1, r1, r2
+  16def0:	0609		lsl	r1, r1, #24
+  16def2:	0e09		lsr	r1, r1, #24
+  16def4:	f7ff fe64	bl	0x16dbc0	; $lmi_buzzer_on
+  16def8:	2002		mov	r0, #2
+  16defa:	7120		strb	r0, [r4, #4]
+  16defc:	7830		ldrb	r0, [r6, #0]
+  16defe:	7821		ldrb	r1, [r4, #0]
+  16df00:	4348		mul	r0, r1
+  16df02:	80e0		strh	r0, [r4, #6]
+  16df04:	78e0		ldrb	r0, [r4, #3]
+  16df06:	28ff		cmp	r0, #255	; 0xff
+  16df08:	d001		beq	0x16df0e
+  16df0a:	1e40		sub	r0, r0, #1
+  16df0c:	70e0		strb	r0, [r4, #3]
+  16df0e:	b014		add	sp, #80	; 0x50
+  16df10:	bd70		pop	{r4, r5, r6, pc}
+  16df12:	46c0		nop			(mov r8, r8)
+
 $Init_Target:
   17ba8c:	b530		push	{r4, r5, lr}
   17ba8e:	b081		sub	sp, #4
@@ -582,6 +1016,115 @@
   182270:	8011		strh	r1, [r2, #0]
   182272:	4770		bx	lr
 
+; buzzer.obj .text section follows, as identified in the linker map.
+; All code is strictly unchanged from TCS211 original.
+
+$BZ_Init:
+  186124:	4770		bx	lr
+
+$BZ_Enable:
+  186126:	492e		ldr	r1, =0xfffe480e	; via 0x1861e0
+  186128:	2001		mov	r0, #1
+  18612a:	880a		ldrh	r2, [r1, #0]
+  18612c:	4310		orr	r0, r2
+  18612e:	8008		strh	r0, [r1, #0]
+  186130:	4770		bx	lr
+
+$BZ_Disable:
+  186132:	482b		ldr	r0, =0xfffe480e	; via 0x1861e0
+  186134:	8801		ldrh	r1, [r0, #0]
+  186136:	0409		lsl	r1, r1, #16
+  186138:	0c49		lsr	r1, r1, #17
+  18613a:	0049		lsl	r1, r1, #1
+  18613c:	8001		strh	r1, [r0, #0]
+  18613e:	4770		bx	lr
+
+$BZ_Tone:
+  186140:	21ff		mov	r1, #255	; 0xff
+  186142:	3101		add	r1, #1
+  186144:	4288		cmp	r0, r1
+  186146:	db00		blt	0x18614a
+  186148:	20ff		mov	r0, #255	; 0xff
+  18614a:	4926		ldr	r1, =0xfffe4808	; via 0x1861e4
+  18614c:	8008		strh	r0, [r1, #0]
+  18614e:	4770		bx	lr
+
+$BZ_Volume:
+  186150:	2840		cmp	r0, #64	; 0x40
+  186152:	db00		blt	0x186156
+  186154:	203f		mov	r0, #63	; 0x3f
+  186156:	4924		ldr	r1, =0xfffe4812	; via 0x1861e8
+  186158:	8008		strh	r0, [r1, #0]
+  18615a:	4770		bx	lr
+
+$BZ_KeyBeep_ON:
+  18615c:	b500		push	{lr}
+  18615e:	b081		sub	sp, #4
+  186160:	f7ff ffe0	bl	0x186124
+  186164:	20ff		mov	r0, #255	; 0xff
+  186166:	f7ff fff3	bl	0x186150
+  18616a:	f7ff ffdc	bl	0x186126
+  18616e:	2032		mov	r0, #50	; 0x32
+  186170:	f7ff ffe6	bl	0x186140
+  186174:	2000		mov	r0, #0
+  186176:	e001		b	0x18617c
+  186178:	9800		ldr	r0, [sp, #0]
+  18617a:	3001		add	r0, #1
+  18617c:	9000		str	r0, [sp, #0]
+  18617e:	9900		ldr	r1, [sp, #0]
+  186180:	481a		ldr	r0, =0x4268	; via 0x1861ec
+  186182:	4281		cmp	r1, r0
+  186184:	dbf8		blt	0x186178
+  186186:	f7ff ffd4	bl	0x186132
+  18618a:	b001		add	sp, #4
+  18618c:	bd00		pop	{pc}
+
+$BZ_KeyBeep_OFF:
+  18618e:	b500		push	{lr}
+  186190:	b081		sub	sp, #4
+  186192:	f7ff ffc7	bl	0x186124
+  186196:	20ff		mov	r0, #255	; 0xff
+  186198:	f7ff ffda	bl	0x186150
+  18619c:	f7ff ffc3	bl	0x186126
+  1861a0:	2064		mov	r0, #100	; 0x64
+  1861a2:	f7ff ffcd	bl	0x186140
+  1861a6:	2000		mov	r0, #0
+  1861a8:	e001		b	0x1861ae
+  1861aa:	9800		ldr	r0, [sp, #0]
+  1861ac:	3001		add	r0, #1
+  1861ae:	9000		str	r0, [sp, #0]
+  1861b0:	9900		ldr	r1, [sp, #0]
+  1861b2:	480e		ldr	r0, =0x4268	; via 0x1861ec
+  1861b4:	4281		cmp	r1, r0
+  1861b6:	dbf8		blt	0x1861aa
+  1861b8:	f7ff ffbb	bl	0x186132
+  1861bc:	b001		add	sp, #4
+  1861be:	bd00		pop	{pc}
+
+$LT_Enable:
+  1861c0:	4770		bx	lr
+
+$LT_Disable:
+  1861c2:	4770		bx	lr
+
+$LT_Level:
+  1861c4:	2840		cmp	r0, #64	; 0x40
+  1861c6:	db00		blt	0x1861ca
+  1861c8:	203f		mov	r0, #63	; 0x3f
+  1861ca:	4909		ldr	r1, =0xfffe4810	; via 0x1861f0
+  1861cc:	8008		strh	r0, [r1, #0]
+  1861ce:	4770		bx	lr
+
+$LT_Status:
+  1861d0:	4803		ldr	r0, =0xfffe480e	; via 0x1861e0
+  1861d2:	8800		ldrh	r0, [r0, #0]
+  1861d4:	0840		lsr	r0, r0, #1
+  1861d6:	07c0		lsl	r0, r0, #31
+  1861d8:	0fc0		lsr	r0, r0, #31
+  1861da:	0600		lsl	r0, r0, #24
+  1861dc:	0e00		lsr	r0, r0, #24
+  1861de:	4770		bx	lr
+
 $INC_Initialize:
   1887ac:	b510		push	{r4, lr}
   1887ae:	1c04		add	r4, r0, #0