;
;	framdmca.s
;
;	P/ECE DMG-CPU (Sharp LR35902) Emulator (高速版)
;	
;	CLiP - Common Library for P/ECE
;	Copyright (C) 2001-2005 Naoyuki Sawa
;	
;	* Sun Feb 13 03:10:00 JST 2005 Naoyuki Sawa
;	- 作成開始。
;
#include "clipdmca.h"

;****************************************************************************
;	
;****************************************************************************

; 高速化のため、DMGCPU構造体を高速RAMに配置します。
; 高速RAMへ配置するために、codeセクションとします。
	.code
	.align	2
	.global	dmgcpu
dmgcpu:
	.space	SIZEOF_DMGCPU

;****************************************************************************
;	
;****************************************************************************

	.code
	.align	1

;****************************************************************************
;	
;****************************************************************************

	.global	dmgcpu_enter
dmgcpu_enter:
	xld.w	%CPU, dmgcpu
	xld.ub	%A,     [%CPU+_A_    ]
	xld.uh	%PC,    [%CPU+_PC_   ]
	xld.w	%CYCLE, [%CPU+_CYCLE_]
	xld.w	%READ,  [%CPU+_READ_ ]
	xld.w	%WRITE, [%CPU+_WRITE_]
	ret

	.global	dmgcpu_leave
dmgcpu_leave:
	xld.b	[%CPU+_A_    ], %A
	xld.h	[%CPU+_PC_   ], %PC
	xld.w	[%CPU+_CYCLE_], %CYCLE
	ret

;****************************************************************************
;	
;****************************************************************************

	.global	dmgmem_read
dmgmem_read:
	ext	dmgmem@ah
	ext	dmgmem@al
	ld.ub	%data, [%addr]
	ret

	.global	dmgmem_write
dmgmem_write:
	ext	dmgmem@ah
	ext	dmgmem@al
	ld.b	[%addr], %data
	ret

;****************************************************************************
;	
;****************************************************************************

; * Wed Mar 23 06:04:00 JST 2005 Naoyuki Sawa
; - dmgcpu_pack中の以下の二行は、
;	ext	       0x80>>6
;	or	%data, 0x80&((1<<6)-1)
;   pp33のビットフィールド取得演算子を使って、判り易く
;	ext	       0x80^M
;	or	%data, 0x80^L
;   と書き直したいところですが、残念ながらできません。
;   Z80エミュレーションモジュールでは、シンボル"L"を整数値に定義しているため、
;	ext	       0x80^M
;	or	%data, 0x80^8	(#define L 8、clipdmca.h参照)
;   と解釈されてしまうからです。
;   うっかり^Lや^H演算子を使うと、発見しづらいバグになるので、ご注意ください。

	.global	dmgcpu_pack
dmgcpu_pack:
	xld.uh	%t0, [%CPU+CZ]			; %t0   = -------C zzzzzzzz
	xld.ub	%t1, [%CPU+NH]			; %t1   = -------- --NH----
	xand	%data, %t0, 0x100		; %data = 0000000C 00000000
	xsrl	%data, 4			; %data = 00000000 000C0000
	xand	%t0, %t0, 0xff			; test             zzzzzzzz
	jrne.d	4
	sll	%t1, 1				; %t1   = -------- -NH----- *delay*
	ext	       0x80>>6			;                           (skip?)
	or	%data, 0x80&((1<<6)-1)		; %data = 00000000 Z00C0000 (skip?)
	xand	%t1, %t1, 0x60			; %t1   = 00000000 0NH00000
	ret.d
	or	%data, %t1			; %data = 00000000 ZNHC0000 *delay*

	.global	dmgcpu_unpack
dmgcpu_unpack:
	xand	%data, %data, ~0x0f		; %data = -------- ZNHC0000
	xsrl	%data, 1			; %data = -------- -ZNHC000
	xld.b	[%CPU+NH], %data		; NH    = -------- --NH----
	xand	%r9, %data, 0x40		; test              Z
	jrne.d	3
	sll	%data, 5			; %data = -------C 00000000 *delay*
	or	%data, 1			; %data = -------C 0000000z (skip?)
	xld.h	[%CPU+CZ], %data		; CZ    = -------C 0000000z
	ret

;****************************************************************************
;	
;****************************************************************************

	.global	dmgcpu_run
dmgcpu_run:
	pushn	%r3
	;
	xld.w	[dmgcpu+_CYCLE_], %r12		; 実行コンテキストを取り出しす前に、まず、実行サイクル数の初期値を格納します。
	xcall	dmgcpu_enter			; 実行コンテキストを取り出します。すぐ上で格納した、実行サイクル数も取り出します。
	;
	xld.ub	%t0, [%CPU+FLAGS]		; 既にHALTまたはSTOP中ならば、残り実行サイクル数を0にして、すぐにループを抜けます。
	xand	%t0, %t0, (1<<STOP_BIT)|(1<<HALT_BIT)	; HALT、STOPでループを抜ける場合も、アプリケーションが実行時間計測を計測するめに、
	jreq	2				; 終了時の状態は"dmgcpu.cycle<=0"となっていなければいけないことに注意してください。
	ld.w	%CYCLE, 0			; (skip?)
	;
	xjp	dmgcpu_run_LOOP			; Cycle=0が指定された場合(またはHALT、STOPでCycle=0とした場合)のために、まず条件判定から。
dmgcpu_run_DO:
;----------------------------------------------------------------------------
#ifdef DMGCPU_RUN_TRACE
	; - トレースデバッグを行う場合は、このブロックを有効にしてください。
	;   その際、dmgcpu_trace()は、アプリケーションにて定義してください。
	;   dmgcpu_trace()は、ライブラリ内では定義していません。
	; - DMGCPU_RUN_TRACEシンボルは、dmgcpu_runとdmgcpu_EIから参照するので、
	;   clipdmca.hにて定義(またはコメントアウト)しています。
	xcall dmgcpu_leave
	xcall dmgcpu_trace
	xcall dmgcpu_enter
#endif /*DMGCPU_RUN_TRACE*/
;----------------------------------------------------------------------------
	call.d	%READ				; OpCodeを取得し、PCを進めます。
	ld.w	%addr, %PC
	xadd	%PC, %PC, 1
	xsll	%data, 2			; OpCodeに対応する命令ルーチンを呼び出します。
	ext	dmgcpu_XXops@ah
	ext	dmgcpu_XXops@al
	ld.w	%data, [%data]
	call	%data
dmgcpu_run_LOOP:
	xcmp	%CYCLE, 0			; Cycleが0以下になるまで繰り返します。
	xjrgt	dmgcpu_run_DO
	;
dmgcpu_run_EXIT:
	xcall	dmgcpu_leave			; 実行コンテキストを書き戻します。
	;
	popn	%r3
	ret

;
;	CB xx
;	   ++- OpCode
;
	.global	dmgcpu_CB
dmgcpu_CB:
	call.d	%READ				; OpCodeを取得し、PCを進めます。
	ld.w	%addr, %PC
	xadd	%PC, %PC, 1
	xsll	%data, 2			; OpCodeに対応する命令ルーチンを呼び出します。
	ext	dmgcpu_CBops@ah
	ext	dmgcpu_CBops@al
	ld.w	%data, [%data]
	jp	%data

;****************************************************************************
;	16-Bit Loads
;****************************************************************************

;
;	PUSH	rr
; [in]
;	%data	rr
;
	.global	dmgcpu_push
dmgcpu_push:
	ld.w	%s0, %data			; %s0    = rr
	xsrl	%data, 8			; %data  = HI(rr)
	xld.uh	%addr, [%CPU+SP]		; %addr  = SP
	call.d	%WRITE				; [SP-1] = HI(rr)
	sub	%addr, 1			; %addr  = SP-1 *delay*
	ld.ub	%data, %s0			; %data  = LO(rr)
	call.d	%WRITE				; [SP-2] = LO(rr)
	sub	%addr, 1			; %addr  = SP-2 *delay*
	xld.h	[%CPU+SP], %addr		; SP     = SP-2
	ret

;
;	POP	rr
; [out]
;	%data	rr
;
	.global	dmgcpu_pop
dmgcpu_pop:
	xld.uh	%addr, [%CPU+SP]		; %addr  = SP
	call	%READ				; %data  = LO(rr) = [SP+0]
	ld.w	%s0, %data			; %s0    = LO(rr)
	call.d	%READ				; %data  = HI(rr) = [SP+1]
	add	%addr, 1			; %addr  = SP+1             *delay*
	xadd	%addr, %addr, 1			; %addr  = SP+2
	xld.h	[%CPU+SP], %addr		; SP     = SP+2
	xsll	%data, 8			; %data  = HI(rr)<<8
	ret.d
	or	%data, %s0			; %data  = HI(rr)<<8|LO(rr) *delay*

;****************************************************************************
;	8-Bit ALU
;****************************************************************************

;
;	ADD	A,n
; [in]
;	%data	n
;
; Flags affected:
;	Z - Set if result is zero.
;	N - Reset.
;	H - Set if carry from bit 3.
;	C - Set if carry from bit 7.
;
	.global	dmgcpu_add
dmgcpu_add:
	xand	%t0, %A, 0x0f			; %t0   = 0000AAAA
	add	%A, %data			; %A    = A+n
	xld.h	[%CPU+CZ], %A			; CZ    = -------C zzzzzzzz
	xand	%data, %data, 0x0f		; %data = 0000nnnn
	add	%t0, %data			; %t0   = 000H----
	xld.b	[%CPU+NH], %t0			; NH    = --NH---- (N=0)
	ret.d
	ld.ub	%A, %A				; %A    = (unsigned char)(A+n) *delay*

;
;	ADC	A,n
; [in]
;	%data	n
;
; Flags affected:
;	Z - Set if result is zero.
;	N - Reset.
;	H - Set if carry from bit 3.
;	C - Set if carry from bit 7.
;
	.global	dmgcpu_adc
dmgcpu_adc:
	xld.ub	%t1, [%CPU+CZ+1]		; %t1   = -------C
	xand	%t1, %t1, 1			; %t1   = 0000000C
	xand	%t0, %A, 0x0f			; %t0   = 0000AAAA
	add	%A, %data			; %A    = A+n
	add	%A, %t1				; %A    = A+n+C
	xld.h	[%CPU+CZ], %A			; CZ    = -------C zzzzzzzz
	xand	%data, %data, 0x0f		; %data = 0000nnnn
	add	%t0, %data			; %t0   = 000H----
	add	%t0, %t1
	xld.b	[%CPU+NH], %t0			; NH    = --NH---- (N=0)
	ret.d
	ld.ub	%A, %A				; %A    = (unsigned char)(A+n+C) *delay*

;
;	SUB	n
; [in]
;	%data	n
;
; Flags affected:
;	Z - Set if result is zero.
;	N - Set.
;	H - Set if borrow from bit 4.
;	C - Set if borrow from bit 7.
;
	.global	dmgcpu_sub
dmgcpu_sub:
	xand	%t0, %A, 0x0f			; %t0   = 0000AAAA
	sub	%A, %data			; %A    = A-n
	xld.h	[%CPU+CZ], %A			; CZ    = -------C zzzzzzzz
	xand	%data, %data, 0x0f		; %data = 0000nnnn
	sub	%t0, %data			; %t0   = ---H----
	xoor	%t0, %t0, NF			; %t0   = 111H----
	xld.b	[%CPU+NH], %t0			; NH    = --NH---- (N=1)
	ret.d
	ld.ub	%A, %A				; %A    = (unsigned char)(A-n) *delay*

;
;	SBC	A,n
; [in]
;	%data	n
;
; Flags affected:
;	Z - Set if result is zero.
;	N - Set.
;	H - Set if borrow from bit 4.
;	C - Set if borrow from bit 7.
;
	.global	dmgcpu_sbc
dmgcpu_sbc:
	xld.ub	%t1, [%CPU+CZ+1]		; %t1   = -------C
	xand	%t1, %t1, 1			; %t1   = 0000000C
	xand	%t0, %A, 0x0f			; %t0   = 0000AAAA
	sub	%A, %data			; %A    = A-n
	sub	%A, %t1				; %A    = A-n-C
	xld.h	[%CPU+CZ], %A			; CZ    = -------C zzzzzzzz
	xand	%data, %data, 0x0f		; %data = 0000nnnn
	sub	%t0, %data			; %t0   = 000H----
	sub	%t0, %t1
	xoor	%t0, %t0, NF			; %t0   = 111H----
	xld.b	[%CPU+NH], %t0			; NH    = --NH---- (N=1)
	ret.d
	ld.ub	%A, %A				; %A    = (unsigned char)(A-n-C) *delay*

;
;	CP	n
; [in]
;	%data	n
;
; Flags affected:
;	Z - Set if result is zero.
;	N - Set.
;	H - Set if borrow from bit 4.
;	C - Set if borrow from bit 7.
;
	.global	dmgcpu_cp
dmgcpu_cp:
	xand	%t0, %A, 0x0f			; %t0   = 0000AAAA
	ld.w	%t1, %A				; %t1   = A
	sub	%t1, %data			; %t1   = A-n
	xld.h	[%CPU+CZ], %t1			; CZ    = -------C zzzzzzzz
	xand	%data, %data, 0x0f		; %data = 0000nnnn
	sub	%t0, %data			; %t0   = ---H----
	xoor	%t0, %t0, NF			; %t0   = 111H----
	xld.b	[%CPU+NH], %t0			; NH    = --NH---- (N=1)
	ret

;
;	AND	n
; [in]
;	%data	n
;
; Flags affected:
;	Z - Set if result is zero.
;	N - Reset.
;	H - Set.
;	C - Reset.
;
	.global	dmgcpu_and
dmgcpu_and:
	and	%A, %data			; %A  = A&n
	xld.h	[%CPU+CZ], %A			; CZ  = -------C zzzzzzzz (C=0)
	xld.w	%t0, HF				; %t0 = 00011111
	xld.b	[%CPU+NH], %t0			; NH  = --NH---- (N=0,H=1)
	ret

;
;	OR	n
; [in]
;	%data	n
;
; Flags affected:
;	Z - Set if result is zero.
;	N - Reset.
;	H - Reset.
;	C - Reset.
;
	.global	dmgcpu_or
dmgcpu_or:
	or	%A, %data			; %A  = A|n
	xld.h	[%CPU+CZ], %A			; CZ  = -------C zzzzzzzz (C=0)
	xld.b	[%CPU+NH], %r8			; NH  = --NH---- (N=0,H=0)
	ret

;
;	XOR	n
; [in]
;	%data	n
;
; Flags affected:
;	Z - Set if result is zero.
;	N - Reset.
;	H - Reset.
;	C - Reset.
;
	.global	dmgcpu_xor
dmgcpu_xor:
	xor	%A, %data			; %A  = A^n
	xld.h	[%CPU+CZ], %A			; CZ  = -------C zzzzzzzz (C=0)
	xld.b	[%CPU+NH], %r8			; NH  = --NH---- (N=0,H=0)
	ret

;
;	INC	r
; [in]
;	%data	r
; [out]
;	%data	r+1
;
; Flags affected:
;	Z - Set if result is zero.
;	N - Reset.
;	H - Set if carry from bit 3.
;	C - Not affected.
;
	.global	dmgcpu_inc
dmgcpu_inc:
	xand	%t0, %data, 0x0f		; %t0   = 0000nnnn
	xadd	%data, %data, 1			; %data = r+1
	xld.b	[%CPU+CZ+0], %data		; ZF    = zzzzzzzz
	xadd	%t0, %t0, 1			; %t0   = 000H----
	xld.b	[%CPU+NH], %t0			; NH    = --NH---- (N=0)
	ret.d
	ld.ub	%data, %data			; %data = (unsigned char)(r+1) *delay*

;
;	DEC	r
; [in]
;	%data	r
; [out]
;	%data	r-1
;
; Flags affected:
;	Z - Set if reselt is zero.
;	N - Set.
;	H - Set if borrow from bit 4.
;	C - Not affected.
;
	.global	dmgcpu_dec
dmgcpu_dec:
	xand	%t0, %data, 0x0f		; %t0   = 0000nnnn
	xsub	%data, %data, 1			; %data = r-1
	xld.b	[%CPU+CZ+0], %data		; ZF    = zzzzzzzz
	xsub	%t0, %t0, 1			; %t0   = ---H----
	xoor	%t0, %t0, NF			; %t0   = 111H----
	xld.b	[%CPU+NH], %t0			; NH    = --NH---- (N=1)
	ret.d
	ld.ub	%data, %data			; %data = (unsigned char)(r-1) *delay*

;****************************************************************************
;	16-Bit Arithmetic
;****************************************************************************

;
;	ADD	HL,nn
; [in]
;	%data	nn
;
; Flags affected:
;	Z - Not affected.
;	N - Reset.
;	H - Set if carry from bit 11.
;	C - Set if carry from bit 15.
;
	.global	dmgcpu_addw
dmgcpu_addw:
	xld.uh	%t0, [%CPU+HL]			; %t0   = hlhlhlhl hlhlhlhl
	xand	%t1, %t0, 0x0fff		; %t1   = 0000hlhl hlhlhlhl
	add	%t0, %data			; %t0   = HL+nn
	xld.h	[%CPU+HL], %t0			; HL    = HL+nn
	xsrl	%t0, 16				; %t0   = -------C
	xld.b	[%CPU+CZ+1], %t0		; CF    = -------C
	xand	%data, %data, 0x0fff		; %data = 0000nnnn nnnnnnnn
	add	%t1, %data			; %t1   = 000H---- --------
	xsrl	%t1, 8				; %t1   = 000H----
	xld.b	[%CPU+NH], %t1			; NH    = --NH---- (N=0)
	ret

;****************************************************************************
;	Miscellaneous
;****************************************************************************

;
;	SWAP	r
; [in]
;	%data	r
; [in]
;	%data	r[7:4]<->r[3:0]
;
; Flags affected:
;	Z - Set if result is zero.
;	N - Reset.
;	H - Reset.
;	C - Reset.
;
	.global	dmgcpu_swap
dmgcpu_swap:
	xld.h	[%CPU+CZ], %data		; CF    = -------C zzzzzzzz (C=0)
	;					;         D7:4<->D3:0反転しても零/非零は変わらないので、
	;					;         反転する前にフラグを格納しておくことにします。
	;					;	  こうしておけばret.dのDelaySlotが利用できます。
	xld.b	[%CPU+NH], %r8			; NH    = --NH---- (N=0,H=0)
	xsll	%data, 4			; %data = 0000abcd efgh0000
	ld.ub	%t0, %data			; %t0   = 00000000 efgh0000
	xsrl	%data, 8			; %data = 00000000 0000abcd
	ret.d
	or	%data, %t0			; %data = 00000000 efghabcd *delay*

;****************************************************************************
;	Rotates & Shifts
;****************************************************************************

;
; Flags affected:
;	Z - Set if result is zero.
;	N - Reset.
;	H - Reset.
;	C - Contains old bit 7 data.
;
; [note]
;	* 自己採点: オーソドックスな実装です。70点。
;
	.global	dmgcpu_rl
dmgcpu_rl:
	xld.ub	%t0, [%CPU+CZ+1]		; %t0   = 00000000 -------C
	xsll	%data, 1			; %data = 0000000a bcdefgh0 *anti-interlock*
	xand	%t0, %t0, 1			; %t0   = 00000000 0000000C
	or	%data, %t0			; %data = 0000000a bcdefghC
	xld.h	[%CPU+CZ], %data		; CZ    = -------C zzzzzzzz
	xld.b	[%CPU+NH], %r8			; NH    =          --NH---- (N=0,H=0)
	ret.d
	ld.ub	%data, %data			; %data = 00000000 bcdefghC *delay*

;
; Flags affected:
;	Z - Set if result is zero.
;	N - Reset.
;	H - Reset.
;	C - Contains old bit 7 data.
;
; [note]
;	* 自己採点: 綺麗に決まった実装です。100点。
;
	.global	dmgcpu_rlc
dmgcpu_rlc:
	xsll	%data, 1			; %data = 0000000a bcdefgh0
	ld.w	%t0, %data			; %t0   = 0000000a bcdefgh0
	xsrl	%data, 8			; %data = 00000000 0000000a
	or	%data, %t0			; %data = 0000000a bcdefgha
	xld.h	[%CPU+CZ], %data		; CZ    = -------C zzzzzzzz
	xld.b	[%CPU+NH], %r8			; NH    =          --NH---- (N=0,H=0)
	ret.d
	ld.ub	%data, %data			; %data = 00000000 bcdefgha *delay*

;
; Flags affected:
;	Z - Set if result is zero.
;	N - Reset.
;	H - Reset.
;	C - Contains old bit 0 data.
;
; [note]
;	* 自己採点: いまいち…50点。
;
	.global	dmgcpu_rr
dmgcpu_rr:
	xld.ub	%t0, [%CPU+CZ+1]		; %t0   = 00000000 -------C
	xld.b	[%CPU+CZ+1], %data		; CF    =          abcdefgh (C=h) *anti-interlock*
	xsll	%t0, 7				; %t0   = 0------- C0000000
	xsrl	%data, 1			; %data = 00000000 0abcdefg
	or	%data, %t0			; %data = 0------- Cabcdefg
	xld.b	[%CPU+CZ+0], %data		; ZF    =          Cabcdefg
	xld.b	[%CPU+NH], %r8			; NH    =          --NH---- (N=0,H=0)
	ret.d
	ld.ub	%data, %data			; %data = 00000000 Cabcdefg *delay*

;
; Flags affected:
;	Z - Set if result is zero.
;	N - Reset.
;	H - Reset.
;	C - Contains old bit 0 data.
;
; [note]
;	* 自己採点: 自画自賛ですが(^^;芸術的です。200点。
;
	.global	dmgcpu_rrc
dmgcpu_rrc:
	xsll	%data, 7			; %data = 0abcdefg h0000000
	ld.b	%t0, %data			; %t0   = hhhhhhhh h0000000
	xsrl	%data, 8			; %data = 00000000 0abcdefg
	or	%data, %t0			; %t0   = hhhhhhhh habcdefg
	xld.h	[%CPU+CZ], %data		; CZ    = -------C zzzzzzzz
	xld.b	[%CPU+NH], %r8			; NH    =          --NH---- (N=0,H=0)
	ret.d
	ld.ub	%data, %data			; %data = 00000000 habcdefg *delay*

;
; Flags affected:
;	Z - Set if result is zero.
;	N - Reset.
;	H - Reset.
;	C - Contains old bit 7 data.
;
	.global	dmgcpu_sla
dmgcpu_sla:
	xsll	%data, 1			; %data = 0000000a bcdefgh0
	xld.h	[%CPU+CZ], %data		; CZ    = -------C zzzzzzzz
	xld.b	[%CPU+NH], %r8			; NH    =          --NH---- (N=0,H=0)
	ret.d
	ld.ub	%data, %data			; %data = 00000000 bcdefgh0 *delay*

;
; Flags affected:
;	Z - Set if result is zero.
;	N - Reset.
;	H - Reset.
;	C - Contains old bit 0 data.
;
	.global	dmgcpu_sra
dmgcpu_sra:
	xld.b	[%CPU+CZ+1], %data		; CF    =          abcdefgh (C=h)
	ld.b	%data, %data			; %data = aaaaaaaa abcdefgh
	xsra	%data, 1			; %data = aaaaaaaa aabcdefg
	xld.b	[%CPU+CZ+0], %data		; ZF    =          aabcdefg
	xld.b	[%CPU+NH], %r8			; NH    =          --NH---- (N=0,H=0)
	ret.d
	ld.ub	%data, %data			; %data = 00000000 aabcdefg *delay*

;
; Flags affected:
;	Z - Set if result is zero.
;	N - Reset.
;	H - Reset.
;	C - Contains old bit 0 data.
;
	.global	dmgcpu_srl
dmgcpu_srl:
	xld.b	[%CPU+CZ+1], %data		; CF    =          abcdefgh (C=h)
	xsrl	%data, 1			; %data = 00000000 0abcdefg
	xld.b	[%CPU+CZ+0], %data		; ZF    =          0abcdefg
	xld.b	[%CPU+NH], %r8			; NH    =          --NH---- (N=0,H=0)
	ret

;****************************************************************************
;	Bit Opcodes
;****************************************************************************

;
;	BIT	b,r
; [in]
;	%data	r
;	%s0	b
;
; Flags affected:
;	Z - Set if bit b of register r is 0.
;	N - Reset.
;	H - Set.
;	C - Not affected.
;
	.global	dmgcpu_bit
dmgcpu_bit:
	srl	%data, %s0			; %data = (r>>b) (0≦b≦7なので、xsrlは冗長です)
	xand	%data, %data, 1			; %data = (r>>b)&1
	xld.b	[%CPU+CZ+0], %data		; ZF    = (r>>b)&1
	xld.w	%t0, HF				; %t0   = 000HHHHH
	xld.b	[%CPU+NH], %t0			; NH    = --NH---- (N=0,H=1)
	ret

;****************************************************************************
;	
;****************************************************************************

