@---------------------------------------------------------------------------------
	.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 "Supercard Series Slot-2"

@-- 0x0020 - 0x003F --------------------------------------------------------------
@ Card Identifiers - upto 8 cards
	.align  5
	.ascii  "SCSD"
	.ascii  "SCCF"
	.ascii  "SCLT"

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

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

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

	.word	_SC_Unlock_Media	@ Unlock Media
	.word	_SC_Unlock_RAMRW	@ Unlock RAM R/W
	.word	_SC_Unlock_RAMRO	@ Unlock RAM R/O

	.word	_SC_Return_Error	@ Flash Write
	.word	_SC_Return_Error	@ Flash Read
	.word	_SC_Return_Mode		@ SRAM Unlock

	.word	_SC_Return_Error	@ Rumble
	.word	_SC_Return_Error	@ Motion
	.word	_SC_Unlock_Boot		@ Boot

	.word	_SC_Return_Error	@ Serial Write
	.word	_SC_Return_Error	@ Serial Read

/*****************************************************************************/
/*
 * Supercard SD/CF ROM/RAM/IO switching.
 */
#define SC_LOCK      0x09FFFFFE
#define SC_PATTERN	0xA55A	/* Key pattern for SC_LOCK      */

_SC_Unlock:
	ldr		r1, =SC_PATTERN
	ldr		r3, =SC_LOCK

	strh		r1, [r3]		@ Send unlock twice
	strh		r1, [r3]

	strh		r2, [r3]		@ Send mode twice
	strh		r2, [r3]

        mov             r1, #1			@ rv = (1 << R0) | 0x20

        adr             r2, _CurrentMode	@ store the mode
        str             r0, [r2]
        bx              lr

_SC_Return_Error:
	mov		r0, #0			@ Return -1 on error
	sub		r0, r0, #1
	bx		lr

_SC_Return_Mode:
	adr		r2, _CurrentMode	@ return current mode
	ldr		r0, [r2]
	bx		lr

_SC_Unlock_Media:
	mov		r2, #0x0003	@ Media I/O
	mov		r0, #0x0021	@ MEDIA | SRAM
	b		_SC_Unlock

_SC_Unlock_RAMRW:
	mov		r2, #0x0005	@ RAM | Writeable
	mov		r0, #0x0022	@ RAMRW | SRAM
	b		_SC_Unlock

_SC_Unlock_RAMRO:
	mov		r2, #0x0001	@ RAM
	mov		r0, #0x0024	@ RAMRO | SRAM
	b		_SC_Unlock

_SC_Unlock_Boot:
	mov		r2, #0x0000
	mov		r0, #0x0120	@ FIRMWARE | SRAM
	b		_SC_Unlock

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

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

