@---------------------------------------------------------------------------------
	.section ".init"
@---------------------------------------------------------------------------------
	.align	4
	.arm
	.global _io_dlmi
	.global _start
@---------------------------------------------------------------------------------
.equ FEATURE_MEDIA,	0x00000001	@ is a media adapter
.equ FEATURE_RAMRW,	0x00000002	@ has writable ram
.equ FEATURE_RAMRO,	0x00000004	@ ram can be set to read-only
.equ FEATURE_FLASHRW,	0x00000008	@ has writable firmware
.equ FEATURE_FLASHRO,	0x00000010	@ flash can be set to read-only 
.equ FEATURE_SRAM,	0x00000020	@ has SRAM
.equ FEATURE_RUMBLE,	0x00000040	@ has rumble motor
.equ FEATURE_MOTION,	0x00000080	@ has motion sensor(s)
.equ FEATURE_BOOT,	0x00000100	@ can be booted
.equ FEATURE_SERIAL,	0x00000200	@ has serial port

_dlmi_start:

@-- 0x0000 - 0x0007 --------------------------------------------------------------
@ Driver file standard header -- 8 bytes
	.word	0x494D4C44		@ Magic number to identify this region
	.word	0x00010000		@ Version number

@-- 0x0008 - 0x001F --------------------------------------------------------------
@ Text identifier - can be anything up to 23 chars + terminating null
	.asciz "M3 Series Slot-2"

@-- 0x0020 - 0x003F --------------------------------------------------------------
@ Card Identifiers - upto 8 cards
	.align  5
	.ascii  "M3SD"
	.ascii  "M3CF"

@-- 0x0040 - 0x004F --------------------------------------------------------------
@ DLMI Data
	.align 6

_dlmi_data:
	.word	0x00000127			@ Features
	.word	0x08000000			@ RAM Base
	.word	0x02000000			@ RAM Size
	.word	0x00000000			@ Flash Base
	.word	0x00000000			@ Flash Size
	.word	0x0A000000			@ SRAM Base
	.word	0x00010000			@ SRAM Size

@-- 0x0050 - 0x005F --------------------------------------------------------------
@ DLMI Pointers
	.align 4

	.word	_M3_Unlock_Media	@ Unlock Media
	.word	_M3_Unlock_RAMRW	@ Unlock RAM R/W
	.word	_M3_Unlock_RAMRO	@ Unlock RAM R/O

	.word	_M3_Return_Error	@ Flash Write
	.word	_M3_Return_Error	@ Flash Read

	.word	_M3_Return_Mode		@ Unlock SRAM

	.word	_M3_Return_Error	@ Rumble
	.word	_M3_Return_Error	@ Motion

	.word	_M3_Unlock_Boot		@ Boot

	.word	_M3_Return_Error	@ Serial Write
	.word	_M3_Return_Error	@ Serial Read

_M3_Return_Error:
	mov		r0, #0
	sub		r0, r0, #1
	bx		lr

_M3_Return_Mode:
	adr		r2, _CurrentMode
	ldr		r0, [r2]
	bx		lr

_M3_Unlock:
	ldr		r3, =0x08e00002
	ldrh		r2, [r3]
	ldr		r3, =0x0800000e
	ldrh		r2, [r3]
	ldr		r3, =0x08801ffc
	ldrh		r2, [r3]
	ldr		r3, =0x0800104a
	ldrh		r2, [r3]
	ldr		r3, =0x08800612
	ldrh		r2, [r3]
	ldr		r3, =0x08000000
	ldrh		r2, [r3]
	ldr		r3, =0x08801b66
	ldrh		r2, [r3]

	ldrh		r2, [r1]

	ldr		r3, =0x0800080e
	ldrh		r2, [r3]
	ldr		r3, =0x08000000
	ldrh		r2, [r3]
	ldr		r3, =0x09000000
	ldrh		r2, [r3]

	adr		r2, _CurrentMode
	str		r0, [r2]
	bx		lr


_M3_Unlock_RAMRW:
	ldr		r1, =0x0880000C @ mode RAM (RW)	
	mov		r0, #0x22
	b		_M3_Unlock

_M3_Unlock_RAMRO:
	ldr		r1, =0x08800004 @ mode RAM (RO)	
	mov		r0, #0x22
	b		_M3_Unlock

_M3_Unlock_Boot:
	ldr		r3, =0x08800008 @ mode ROM
	mov		r0, #0x21
	b		_M3_Unlock
	
_M3_Unlock_Media:
	ldr		r3, =0x08800006 @ mode Media
	mov		r0, #0x21
	b		_M3_Unlock
	

@ Assume that fatlib has put the card in media mode
_CurrentMode:
	.word		0x00000021

@---------------------------------------------------------------------------------
	.align
	.pool
_dlmi_end:
_start:
	.end
@---------------------------------------------------------------------------------

