;Program:      LETTER v2.3
;Description:  A TI-83+ ASM MirageOS text processing program
;Code:         ASM SQUISHED MirageOS compatible
;Size:         1667 bytes
;Author:       Emir Sakic
;Date:         13.12.2000.

.NOLIST

#define equ .equ
#define EQU .equ
#define end .end
#include "ti83plus.inc"			;General TI-83 Plus include file
#include "g_keys.inc"			;keys include file
#include "mirage.inc"			;MirageOS include file
#define	file		SAVESSCREEN		;type of data and first 3 chars in file name (let)
#define	name		SAVESSCREEN+4		;files name 5 bytes long, zero terminated
#define	curs		SAVESSCREEN+10		;word var. (used for cursor position)
#define lenght		SAVESSCREEN+12		;byte var. (how many chars written)
#define	count		SAVESSCREEN+13		;byte var. (how many prog. files found)
#define xcoord  	SAVESSCREEN+14		;word var. (x coord.)
#define ycoord  	SAVESSCREEN+16		;word var. (y coord.)
#define	l_count		SAVESSCREEN+18		;byte var. (counts back to erase line)
#define	l_count2	SAVESSCREEN+19		;byte var. (counts back to erase line)

_lcd_busy       equ 4051h

.LIST

	.org	$9d93				;Origin (set back two to account for AsmPrgm)
	.db	$BB,$6D				;Compiled AsmPrgm token
	ret					;So TIOS wont run the program
        .db	1				;Identifier as MirageOS program
        .db %00000000,%00000000
        .db %11111111,%11111000
        .db %00111111,%11111000
        .db %10101110,%10101000
        .db %10101010,%10011000
        .db %10101010,%10111000
        .db %10110101,%10111000
        .db %11111111,%11111000
        .db %00000000,%00000000
        .db %00011111,%11111111
        .db %00011001,%10110011
        .db %00010111,%01010101
        .db %00010111,%00010011
        .db %00010111,%01010111
        .db %00011001,%01010111

description:
        .db     "Letter v2.3 by Emir Sakic",0	;Zero terminated description
						;Program code starts here

Start: 						;defines where lblstart is
;***********************************************************
;initialisation
;***********************************************************
	ld	a,%00001100			;Enable task and apd MirageOS interrupt
	call	setupint
	call	set_modes			;run indic. off, write to shadow, erase line below
	ld	hl,file_str			
	ld	de,file
	ld	bc,4
	ldir					;program type of data + 3 first chars

	ld	de,5E00h			;de=x2y2
	ld	(ycoord),de
	xor	a
	ld	(l_count2),a			;l_count=0
;***********************************************************

;***********************************************************
;intro screen
;***********************************************************
	bcall(_clrLCDfull)
	set	textInverse,(IY+textflags)
	ld	hl,121Dh
	ld	(PENCOL),hl      		;load hl in PENCOL-pen column, other byte goes in PENROW
	ld	a,' '				
	bcall(_vputmap)				;write space first
	ld	hl,description   		;load string address in hl
	ld	b,11		  		;num. of chars to display
	bcall(_vputsn)        			;put on the graph screen
	res	textInverse,(IY+textflags)
	ld	hl,191Ah
	ld	(PENCOL),hl
	ld	hl,description+12
	bcall(_vputs)
	ld	hl,1F11h
	ld	(PENCOL),hl
	ld	hl,e_mail
	bcall(_vputs)
	call	delay				;delay 2-3 sec. Press Enter to cancel.
;************************************************************

;************************************************************
;start
;************************************************************
erase_all:
	bcall(_clrLCDfull)
	bcall(_clrTXTSHD)			;clear shadow
	call	put_markers			;put command markers
	bcall(_homeup)
;*************************************************************

;**********************************************************************
;Key input routine by Emir Sakic
;**********************************************************************    
	ld	b,0				;b will count how many chars written
char_loop:	
	ld	a,0E4h
	bcall(_putmap)
get:
	bcall(_getcsc)				;Get Key system routine
	push	af
	ld	a,(l_count2)
	or	a
	jp	nz,dont_halt			;pop af , jp no_halt
	halt
	pop	af
no_halt:	
	push	af
	ld	a,(l_count2)
	or	a
	call	nz,count_line
	pop	af

	or	a
	jr	z,get				;wait for key is pressed
	cp	G_YEDIT
	jr	z,toggle_case
	cp	G_WINDOW
	jr	z,put_spec_char
	cp	G_ZOOM
	jp	z,save
	cp	G_TRACE
	jp	z,load
	cp	G_LEFT
	jp	z,spec_chars
	cp	G_RIGHT
	jp	z,spec_chars
	cp	G_UP
	jp	z,contrast_adjust
	cp	G_DOWN
	jp	z,contrast_adjust
	cp	G_DEL
	jp	z,backup
	cp	G_CLEAR
	jp	z,clear
	cp	G_ENTER
	jp	z,newline
	cp	G_GRAPH
	jp	z,nomore
;----------------------------------------------------------------------
	ld	c,a				;save key code
	ld	a,111				;max. num. of chars on screen
	cp	b
	jr	z,char_loop			;if b=111 jump
	ld	hl,(case_ptr)           	;hl points to chartable-10 now
	ld	e,c
	ld	d,0				;key code in de
	add	hl,de				;hl points to chartable+keycode-10				
	ld	a,(hl)				;copy chars ASCII from table to a
	jr	key_char
put_spec_char:
	ld	a,111				;max. num. of chars on screen
	cp	b
	jr	z,char_loop			;if b=111 jump
	ld	a,(spec_char)		
	cp	0D6h				;char : can cause problems			
	jr	nz,CharGood
	ld	a,' '
CharGood:
key_char:
	bcall(_putc)
	inc	b				;increase counter
	jr	char_loop
;----------------------------------------------------------------------
toggle_case:					;0=UPPER, 1=lower, 2=NUMBERS
	ld	a,(case_status)
	ld	c,a
	ld	a,1
	add	a,c
	ld	(case_status),a			;increment case_status
	cp	1
	jr	nz,no_lower_case
	ld	hl,lower_case-10
	ld	(case_ptr),hl
	ld	hl,mark_lwr
	ld	(case_marker),hl
	call	put_case_marker	
	jp	char_loop
no_lower_case:
	cp	2
	jr	nz,no_numbers
	ld	hl,numbers-10
	ld	(case_ptr),hl
	ld	hl,mark_NUM
	ld	(case_marker),hl
	call	put_case_marker
	ld	a,' '
	bcall(_vputmap)
	jp	char_loop
no_numbers:
	xor	a
	ld	(case_status),a			;reset case_status
	ld	hl,upper_case-10
	ld	(case_ptr),hl
	ld	hl,mark_CAP
	ld	(case_marker),hl
	call	put_case_marker
	ld	a,' '
	bcall(_vputmap)
	jp	char_loop
;----------------------------------------------------------------------
contrast_adjust:
	set	PlotLoc,(IY+PlotFlags)		;draw to display only
	CP 	G_UP				;Was key up
	JR 	NZ,NotUp			;No continue
	push	bc
	ld	bc,5E08h			;bc=x1y1
	ld	(xcoord),bc
	pop	bc
	LD 	A,(contrast)			;Get contrast
	CP 	$27				;Is contrast at max
	JP 	NC,Max_contr			;Yes jump	
	INC 	A				;Inc contrast
	ld	h,1				;h=1 => dark line
	LD 	(contrast),A			;Save new contrast
	call	line
	JR 	Continue			;Contrast changed
NotUp:
	LD 	A,(contrast)			;Get contrast
	OR	A				;Is it at min
	JR 	Z,exit_contr			;Yes jump
	DEC 	A				;Dec contrast
	ld	(contrast),a
	push	af
	call	show_current_line
	pop	af
	ld	h,0				;h=0 => light line
	push	bc
	ld	bc,5E2Eh			;bc=x1y1
	ld	(xcoord),bc
	pop	bc
	inc	a
	call	line
Continue:
	LD	a,(contrast)
	ADD 	A,$18				;Add offset
	OR 	$C0				;Make control word
	DI					;Disable ints
	bcall(_lcd_busy)			;Delay for screen ops
	OUT 	(LCDINSTPORT),A			;Set contrast
	EI					;Enable ints
exit_contr:
	ld	a,255				;initialisate line counter
	ld	(l_count),a
        ld	a,30
	ld	(l_count2),a
	res	PlotLoc,(IY+PlotFlags)
	JP 	Get	

line:
	push	bc
	ld	bc,(xcoord)			;bc=x1y1
	ld	de,(ycoord)			;de=x2y2
	add	a,7				;offset
	ld	e,a
	bcall(_ILine)
	pop	bc
	ret

Max_contr:
	ld	h,1				;h=1 => dark line
	dec	a
	call	show_current_line
	JR 	exit_contr			;go back

show_current_line:
	push	bc
	ld	h,1				;h=1 => dark line
	ld	bc,5E08h			;start of the dark line
	ld	de,(ycoord)			;de=x2y2
	add	a,8				;offset
	ld	e,a
	bcall(_ILine)
	pop	bc
	ret

count_line:
	ld	a,(l_count)
	dec	a
	ld	(l_count),a
	ret	nz

count_line_2:
	ld	a,(l_count2)
	dec	a
	ld	(l_count2),a
	jr	nz,label_22	

erase_line:
	ld	a,b				;preserve b (lenght)
	ld	(lenght),a
	ld	hl,(CURROW)
	ld	(curs),hl			;save curent cursor position
	ld	a,b				;preserve b (lenght)
	ld	(lenght),a
	bcall(_rstrShadow)			;copy shadow to LCD
	call	put_markers			;on the bottom of the screen
	ld	hl,(curs)
	ld	(CURROW),hl			;recall cursor position
	ld	a,(lenght)
	ld	b,a				;recall lenght byte
	call	set_modes			;run indic. off, write to shadow, erase line below

label_22:
	ld	a,255
	ld	(l_count),a
	ret

dont_halt:
	pop	af
	jp	no_halt	

;----------------------------------------------------------------------
save:
	ld	hl,(CURROW)
	ld	(curs),hl			;save curent cursor position
	ld	a,b				;preserve b (lenght)
	ld	(lenght),a
	res	appTextSave,(IY+appFlags)	;do not write to SHADOW now
	bcall(_clrLCDfull)	
	bcall(_homeUp)
	bcall(_memfree)				;Check if there's enough memory.	
	xor	a				;This will not allow saving 
	cp	h				;if actual amount of memory
	jr	c,mem_ok			;is bellow 151 byte (971).
	ld	a,150				;If mem was 151 and saved file 141
	cp	l				;rest will be 10 which keeps memory
	jr	c,mem_ok			;on the safe level (830).
	bcall(_dispHL)				;Otherwise SOS would crash. 				
	ld	hl,bytes_free			;It needs at least 829 (9 actual) bytes to run.			 
	bcall(_puts)									
	ld	hl,not_enough_mem			
	bcall(_puts)
	call	delay
	jr	mem_fail
mem_ok:
	ld	hl,save_as
	bcall(_puts)
	bcall(_newline)
	call	get_key_lite			;file name is in the name var. now
	bcall(_zeroOP1)

	ld hl,file				;ld	hl,file	
	rst 20h					;ld	de,OP1
						;ld	bc,9	;data type + 8 chars in name
						;ldir		;copy in OP1
	bcall(_chkfindsym)			;look it up

	jr	c,no_program1			;Check if program is archived or not
        ld	a,b				;b=0 if var is in RAM
	or	a				;cp 0
	jr	z,no_program1			;If in RAM OK!
	jp	prgm_archived
no_program1:

	bcallnc(_delvar)			;delete if it already exist
	ld	hl,124				;lenght of file (3 string+6 name+3 cursor data+112 data)
	bcall(_createprog)			;create file hl->symbol table de->program
	ld	(hl),06h			;protect it
	inc	de
	inc	de				;skipp lenght word
	ld	hl,file_str+1			;copy position of the file string to hl
	ld	bc,3				;let
	ldir					;first data in the file is "let" now
	ld	hl,name				;copy file name, zero terminated
	ld	bc,6
	ldir

	ex	de,hl				;pointer to prog. data is in hl now

	ld	a,(lenght)			;give me lenght to save it in file
	ld	(hl),a				;b is next byte of file now
	inc	hl				;move on
	ld	de,(curs)
	ld	(hl),e
	inc	hl
	ld	(hl),d				;another two bytes in prog are curs. pos.
	inc	hl				;move to beginning of data
	ex	de,hl				;de points to program file now
	ld	hl,TEXTSHADOW			;file data
	ld	bc,112				;file data lenght
	ldir					;copy data to program
mem_fail:
	jp	the_end
;---------------------------------------------------------------------------
load:
	ld	hl,(CURROW)
	ld	(curs),hl			;save curent cursor position
	ld	a,b				;preserve b (lenght)
	ld	(lenght),a
	res	appTextSave,(IY+appFlags)	;do not write to SHADOW now
	bcall(_clrLCDfull)
	call	put_file_markers
	bcall(_homeUp)
	ld	hl,choose_file
	bcall(_puts)
	bcall(_newline)
	ld	a,0D0h
	bcall(_putc)

find_prog_file:
	xor	a
	ld	(count),a			;found prog. files counter to zero
	ld	hl,(PROGPTR)			;get offset to program/list table
search_again:
	ld	ix,file_str+1
;-----program/list search------------------------
;-----> Detect a file ionDetect
; input:
;	hl=place to start looking
;	ix->first line of data (0 terminated)
; output:
;	de=place stopped + 1
;	hl->program data (after the string)
;	z=0 if found, z=1 if not found.
;	All registers destroyed

	call	iDetect
	jp	nz,no_progs_found

file_found:
	ld	a,(count)
	inc	a
	ld	(count),a			;increase num. of found prog. files

disp_prog_name:
	ld	bc,0201h
	ld	(CURROW),bc			;position to display name
	push	hl				;save pointer to the name
	ld	hl,file_str+1	
	bcall(_puts)				;display "let"
	pop	hl				
	push	hl
	bcall(_puts)				;display name
	pop	hl				;restore pointer to the name
	ld	a,' '				;display space
	bcall(_putc)
	ld	a,05h				;display arrow
	bcall(_putmap)
	
	inc	hl
	inc	hl
	inc	hl
	inc	hl
	inc	hl
	inc	hl

get_key:
	push	hl				;hl -> lenght and cursor data now
	bcall(_getcsc)				;Get Key system routine
	halt
	pop	hl				;hl -> lenght and cursor data
	or	a
	jr	z,get_key			;wait for key is pressed
	cp	G_RIGHT
	jr	z,move_on
	cp	G_ENTER
	jr	z,load_file
	cp	G_YEDIT
	jr	z,delete
	cp	G_GRAPH
	jp	z,exit
	jr	get_key

move_on:
	ld	hl,0101h
	ld	(currow),hl
	bcall(_eraseEOL)			;erase this line
	ex	de,hl				;place to start looking again
	jr	search_again	

load_file:
	ld	a,(hl)				;take lenght
	ld	(lenght),a			;save it
	inc	hl				;move on
	ld	a,(hl)
	ld	(curs),a
	inc	hl
	ld	a,(hl)
	ld	(curs+1),a			;take cursor position from file
	inc	hl				;move on to data
	ld	de,TEXTSHADOW
	ld	bc,112
	ldir					;copy file data to TEXTSHADOW
the_end:
	bcall(_rstrShadow)			;copy shadow to LCD
	call	put_markers			;on the bottom of the screen
	ld	hl,(curs)
	ld	(CURROW),hl			;recall cursor position
	ld	a,(lenght)
	ld	b,a				;recall lenght byte
	call	set_modes			;write to SHADOW again
	jp	char_loop			;back
no_progs_found:
	ld	a,(count)			;start searching from the
	and	a				;beginning (cp 0)
	jp	nz,find_prog_file		

	bcall(_clrLCDfull)
	bcall(_homeUp)
	ld	hl,no_progs
	bcall(_puts)
	call	delay
	jr	the_end
delete:
	dec	hl
	dec	hl
	dec	hl
	dec	hl
	dec	hl
	dec	hl				;hl -> name of file
	ld	de,name
	ld	bc,6
	ldir					;copy name
	bcall(_zeroOP1)

	ld hl,file				;ld	hl,file	
	rst 20h					;ld	de,OP1
						;ld	bc,9	;data type + 8 chars in name
						;ldir		;copy in OP1
	bcall(_chkfindsym)			;look it up

	jr	c,no_program2			;Is there any program?
        ld	a,b				;b=0 if var is in RAM
	or	a				;cp 0
	jr	z,no_program2			;If in RAM OK!
prgm_archived:
	bcall(_clrLCDfull)
	bcall(_homeUp)
	ld	hl,archived_str
	bcall(_puts)
	call	delay
	jr	the_end	

no_program2:

	bcallnc(_delvar)			;delete if it already exist
	ld	hl,0101h
	ld	(currow),hl
	bcall(_eraseEOL)			;erase this line
	jp	find_prog_file

exit:
	jr	the_end	
;--------------------------------------------------------------------------
spec_chars:
	sub	2				;a=0 for left, a=1 for right
	ld	a,(spec_char)
	jr	z,Decrease			;if left was pressed jump
Increase:
	inc	a
	inc	a
Decrease:
	dec	a
DispIt:
	ld	(spec_char),a
	ld	de,(CURROW)			;save Cursor position
	ld	hl,0407h
	ld	(CURROW),hl
	bcall(_putmap)
	ld	(CURROW),de			;restore Cursor position
	jp	char_loop
;----------------------------------------------------------------------
backup:
	dec	b
	ld	a,255
	cp	b
	jp	z,too_far
	ld	a,32
	bcall(_putmap)
	ld	hl,CURCOL
	ld	a,(hl)
	and	a
	jp	nz,no_line_up
	ld	hl,CURROW
	dec	(hl)				;line up
	ld	hl,CURCOL
	ld	a,16
	ld	(hl),a
no_line_up:
	ld	a,32
	dec	(hl)
	bcall(_putmap)
	jp	char_loop
;----------------------------------------------------------------------
too_far: 
	inc	b
	jp	char_loop
clear:
	ld	hl,CURCOL
	ld	a,(hl)
	and	a
	jp	z,erase_all
	ld	c,(hl)				;CURCOL -> c
	ld	a,b
	sub	c				;b-CURCOL
	ld	b,a
	xor	a				;a=0
	ld	(CURCOL),a			;to beginning of line		
	bcall(_eraseEOL)			;erase line
	jp	char_loop
;----------------------------------------------------------------------
newline:
	ld	a,(CURROW)
	cp	6				;see if on last line
	jp	z,char_loop
	ld	a,(CURCOL)			;cursor position
	ld	c,a				;curs copy
	ld	a,16
	sub	c				;16-cursor pos. -> a
	add	a,b
	ld	b,a				;now is b updated
	ld	a,32
	bcall(_putmap)				;take off cursor
	bcall(_newline)
	jp	char_loop	
;----------------------------------------------------------------------
nomore:
quit:
	bcall(_clrTXTSHD)
	res	textEraseBelow,(IY+textflags)
	ret
;______________________________________________________________________

;**********************************************************************
;delay ca 2 sec
;**********************************************************************

delay:
        ld	b,50
loop1:
	ld	c,255
loop2:
	bcall(_getcsc)
	cp	G_ENTER
	jr	z,quit_delay
	dec	c
	jr	nz,loop2
	djnz	loop1
quit_delay:
	ret
;************************************************************

;***********************************************************
;set_modes
;***********************************************************
set_modes:
	bcall(_runindicoff)
	set	appTextSave,(IY+appFlags)	;write to SHADOW too
	set	textEraseBelow,(IY+textflags)	;erase line below graph fonts
	ret
;***********************************************************

;************************************************************
;command markers (CAP < e > Save Load Quit)
;************************************************************
put_markers:
	call	put_case_marker
	ld	hl,3911h
	ld	(PENCOL),hl
	ld	hl,spec_INDIC
	bcall(_vputs)
	ld	hl,0407h
	ld	(CURROW),hl
	ld	a,(spec_char)
	bcall(_putmap)
	set	textInverse,(IY+textflags)	
	ld	de,3929h
	ld	(PENCOL),de
	ld	hl,mark_Save
	bcall(_vputs)
	ld	de,393Dh
	ld	(PENCOL),de
	bcall(_vputs)
	ld	de,3951h
	ld	(PENCOL),de
	bcall(_vputs)
	res	textInverse,(IY+textflags)
	ret
;****************************************************************

;****************************************************************
;put_case_marker
;Input: case_marker (pointer to string)
;****************************************************************
put_case_marker:
	set	textInverse,(IY+textflags)
	ld	de,3900h
	ld	(PENCOL),de
	ld	hl,(case_marker)
	bcall(_vputs)
	res	textInverse,(IY+textflags)
	ret
;****************************************************************

;****************************************************************
;put_file_markers (Delete          Exit)
;****************************************************************
put_file_markers:
	set	textInverse,(IY+textflags)
	ld	de,3900h
	ld	(PENCOL),de
	ld	hl,mark_Delete
	bcall(_vputs)
	ld	de,3951h
	ld	(PENCOL),de
	bcall(_vputs)
	res	textInverse,(IY+textflags)
	ret
;****************************************************************

;****************************************************************
;get_key_lite
;Input key routine for save mode. Max. 5 chars.
;Output: File name string, beginning in name
;Affected: af, bc, de, hl, CURROW, name
;****************************************************************
get_key_lite:
	ld	a,0
	ld	b,6
	ld	de,name
clear_name_loop:
	ld	(de),a
	inc	de
	djnz	clear_name_loop			;b=0 after this
	ld	de,name				;point to files name
char_loop_lite:	
	ld	a,0E4h
	bcall(_putmap)
get_lite:
	bcall(_getcsc)				;Get Key system routine
	halt
	or	a
	jr	z,get_lite			;wait for key is pressed
	cp	G_DEL
	jr	z,backup_lite
	cp	G_ENTER
	jr	z,enter
	ld	c,a				;save key code
	ld	a,5				;max. num. of chars on screen
	cp	b
	jr	z,char_loop_lite		;if b=111 jump
	ld	hl,upper_case-10        	;hl points to chartable-10 now
	push	de
	ld	e,c
	ld	d,0				;key code in de
	add	hl,de				;hl points to chartable+keycode-10				
	pop	de
	ld	a,(hl)				;copy chars ASCII from table to a
	ld	(de),a
	inc	de
	bcall(_putc)
	inc	b				;this is counter
	jr	char_loop_lite
enter:
	ret
backup_lite:
	dec	b
	ld	a,255
	cp	b
	jp	z,too_far_lite
	ld	a,' '
	bcall(_putmap)
	ld	hl,CURCOL
	dec	(hl)
	bcall(_putmap)
	dec	de
	xor	a
	ld	(de),a
	jr	char_loop_lite
too_far_lite: 
	inc	b
	jr	char_loop_lite	
;****************************************************************

;****************************************************************
;Variables init
;****************************************************************
spec_char:	.db 0C0h			;e
case_status:	.db 0
case_marker:	.dw mark_CAP
case_ptr:	.dw upper_case-10
;****************************************************************	

;****************************************************************
;Command Markers
;****************************************************************
mark_CAP:	.DB " CAP",0
mark_lwr:	.db " lwr",0
mark_NUM:	.db " NUM",0
spec_INDIC:	.db 0CFh,06h,06h,06h,05h,0	; <   >

mark_Save:	.db " Save",0
mark_Load:	.db " Load",0
mark_Quit:	.db " Quit",0
mark_Delete:	.db " Delete",0
mark_Exit:	.db " Exit",0      
;****************************************************************

;****************************************************************
;chartables:
;****************************************************************
upper_case:
	.DB	22h,"WRMH.."
	.DB	"?",0A5h,"VQLG",26h,"."
	.DB	":ZUPKFC",5Ch
	.DB	" YTOJEB",21h
	.DB	".XSNIDA",40h
	.DB	"....."
	.DB	7Eh,25h
lower_case:
	.db	22h,"wrmh.."			;(22h = " )
	.db	"-",0A9h,"vqlg",26h,"."
	.db	".zupkfc",5Ch			;(A9h = ö )
	.db	" ytojeb",21h
	.db	".xsnida",40h
	.db	"....."
	.db	7Eh,25h
numbers:
	.db	"+-",0Ch,"/^.."
	.db	1Ah,"369)",19h,0C4h,"."
	.db	".258(",18h,14h,"y"
	.db	"0147,",17h,13h,"x"
	.db	".><",01h,12h,11h,3Dh,0BBh
	.db	"....."
	.db	10h,08h				
;****************************************************************

;****************************************************************
;Strings
;****************************************************************

file_str:	.db 05h,"let",0
save_as:
		.db "Save as:",0
bytes_free:	.db " bytes free",0
not_enough_mem:
		.db "No memory.",0
choose_file:
		.db "File to load:",0
no_progs:	.db "No files found.",0
e_mail:		.db "saka@hotmail.com",0

archived_str:	.db "Unarchive file!",0

;****************************************************************

.end
END