/*	PROGRAMA: TIBURON.ASM
	DESCRIPCIÓN: SISTEMA DE ADQUISCIÓN DE SEÑALES PARA CORRIENTE MARINAS.
	REALIZACIÓN: .
	EMPRESA: IPN UPIITA .
	DIAGRAMA: .
	PARTE: U1.
	VERSIÓN: 1
*/
/*
	CONFIGURACIÓN:	HIGH $D9	LOW $3D .
	TENSIÓN DE OPERACIÓN:	5 V .
	RELOJ DE SISTEMA:	CRYSTAL OSCILLATOR 4 MHz.

* TERMINALES:
01 RESET: ISP.
02 RXD: FTDI RX.
03 TXD: FTDI TX.
04 PD2: 
05 PD3: 
06 PD4: 
07 VCC: ALIMENTACIÓN.
08 GND: ALIMENTACIÓN.
09 XTAL1: OSCILADOR.
10 XTAL2: OSCILADOR.
11 PD5: SENSOR DE ENTRADA.
12 PD6: 
13 PD7: 
14 PB0: 
15 PB1: 
16 PB2: 
17 MOSI: ISP.
18 MISO: ISP.
19 SCK: ISP.
20 AVCC: ALIMENTACIÓN.
21 AREF: ALIMENTACIÓN.
22 GND: ALIMENTACIÓN.
23 PC0: DIP SW 1.
24 PC1: DIP SW 2.
25 PC2: DIP SW 3.
26 PC3: DIP SW 4.
27 PC4: 
28 PC5: 
*/

.DEVICE ATmega8
.NOLIST
.INCLUDE "M8DEF.INC"
.LIST

;	********************
;	**** IGUALDADES ****
;	********************

;	**********************
;	**** ASIGNACIONES ****
;	**********************

	;R0 USO EN INSTRUCCIÓN LPM.
	;R1:R0 USO EN ALMACENAR EN MEMORIA DE PROGRAMA.
	;R1:R0 USO EN INSTRUCCIONES DE MULTIPLICACIÓN.
.DEF	K00	= R2	;CONSTANTE $00.
.DEF	KFF	= R3	;CONSTANTE $FF.
.DEF	GXL	= R4	;GENERAL DE PROGRAMA GX 2 OCTETOS
.DEF	GXH	= R5	;.
.DEF	GYL	= R6	;GENERAL DE PROGRAMA GY 2 OCTETOS
.DEF	GYH	= R7	;.
.DEF	GZL	= R8	;GENERAL DE PROGRAMA GZ 2 OCTETOS
.DEF	GZH	= R9	;.
.DEF	GPL	= R10	;GENERAL DE PROGRAMA 2 OCTETOS
.DEF	GPH	= R11	;.
.DEF	TCL	= R12	;GENERAL DE INTERRUPCIÓN 2 OCTETOS
.DEF	TCH	= R13	;.
.DEF	GPP	= R14	;GENERAL DE PROGRAMA.
;.DEF	RAI	= R15	;ALMACÉN DE SREG EN INTERRUPCIÓN.
.DEF	TPP	= R16	;TRABAJO DE PROGRAMA.
;.DEF	TII	= R17	;TRABAJO DE INTERRUPCIÓN.
.DEF	TPL	= R18	;TRABAJO DE PROGRAMA 2 OCTETOS
.DEF	TPH	= R19	;.
;.DEF	TIL	= R20	;TRABAJO DE INTERRUPCIÓN 2 OCTETOS
;.DEF	TIH	= R21	;.
.DEF	TPX	= R22	;TRABAJO DE PROGRAMA EXTRA.
;.DEF	TIX	= R23	;TRABAJO DE INTERRUPCIÓN EXTRA.
.DEF	TWL	= R24	;OPERACIÓN INMEDIATA 2 OCTETOS
.DEF	TWH	= R25	;.
	;R25:R24 OPERANDOS EN ADIW, SBIW.
	;R27:R26 X APUNTADOR GENERAL.
	;R29:R28 Y APUNTADOR GENERAL.
	;R31:R30 Z APUNTADOR GENERAL.

;	**************************
;	**** MEMORIA DE DATOS ****
;	**************************
.DSEG

;	****************
;	**** EEPROM ****
;	****************
.ESEG

;/* CADENA DE PRUEBA DE DATOS EN EEPROM.
	.DB $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F
	.DB $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F
	.DB $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F
	.DB $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F
	.DB $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F
	.DB $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$5B,$5C,$5D,$5E,$5F
	.DB $60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F
	.DB $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$7F
	.DB $80,$81,$82,$83,$84,$85,$86,$87,$88,$89,$8A,$8B,$8C,$8D,$8E,$8F
	.DB $90,$91,$92,$93,$94,$95,$96,$97,$98,$99,$9A,$9B,$9C,$9D,$9E,$9F
	.DB $A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7,$A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF
	.DB $B0,$B1,$B2,$B3,$B4,$B5,$B6,$B7,$B8,$B9,$BA,$BB,$BC,$BD,$BE,$BF
	.DB $C0,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF
	.DB $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$DB,$DC,$DD,$DE,$DF
	.DB $E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8,$E9,$EA,$EB,$EC,$ED,$EE,$EF
	.DB $F0,$F1,$F2,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$FA,$FB,$FC,$FD,$FE,$FF
	.DB $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F
	.DB $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F
	.DB $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F
	.DB $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F
	.DB $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F
	.DB $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$5B,$5C,$5D,$5E,$5F
	.DB $60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F
	.DB $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$7F
	.DB $80,$81,$82,$83,$84,$85,$86,$87,$88,$89,$8A,$8B,$8C,$8D,$8E,$8F
	.DB $90,$91,$92,$93,$94,$95,$96,$97,$98,$99,$9A,$9B,$9C,$9D,$9E,$9F
	.DB $A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7,$A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF
	.DB $B0,$B1,$B2,$B3,$B4,$B5,$B6,$B7,$B8,$B9,$BA,$BB,$BC,$BD,$BE,$BF
	.DB $C0,$C1,$C2,$C3,$C4,$C5,$C6,$C7,$C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF
	.DB $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7,$D8,$D9,$DA,$DB,$DC,$DD,$DE,$DF
	.DB $E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8,$E9,$EA,$EB,$EC,$ED,$EE,$EF
	.DB $F0,$F1,$F2,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$FA,$FB,$FC,$FD,$FE,$FF
;*/

;	*****************************
;	**** MEMORIA DE PROGRAMA ****
;	*****************************
.CSEG
.ORG 0

	RJMP 	RESET	; RESET HANDLER
	RETI	; IRQ0 HANDLER
	RETI	; IRQ1 HANDLER
	RETI	; TIMER2 COMPARE HANDLER
	RETI	; TIMER2 OVERFLOW HANDLER
	RETI	; TIMER1 CAPTURE HANDLER
	RETI	; TIMER1 COMPAREA HANDLER
	RETI	; TIMER1 COMPAREB HANDLER
	RETI	; TIMER1 OVERFLOW HANDLER
	RETI	; TIMER0 OVERFLOW HANDLER
	RETI	; SPI TRANSFER COMPLETE HANDLER
	RETI 	; USART RX COMPLETE HANDLER
	RETI 	; UDR EMPTY HANDLER
	RETI	; USART TX COMPLETE HANDLER
	RETI	; ADC CONVERSION COMPLETE HANDLER
	RETI	; EEPROM READY HANDLER
	RETI	; ANALOG COMPARATOR HANDLER
	RETI	; TWO-WIRE SERIAL INTERFACE HANDLER
	RETI	; STORE PROGRAM MEMORY READY HANDLER
;	*********************************************
;	**** RUTINAS DE SERVICIO DE INTERRUPCIÓN ****
;	*********************************************

;	*****************************
;	**** INICIO DEL PROGRAMA ****
;	*****************************

RESET:
;INICIAR APUNTADOR DE PILA.
	LDI	TPL,LOW(RAMEND)
	LDI	TPH,HIGH(RAMEND)
	OUT	SPL,TPL
	OUT	SPH,TPH
	LDI	TPP,$FF
;INICIAR REGISTROS CON CONSTANTES
	MOV	KFF,TPP
	INC	TPP
	MOV	K00,TPP
;INICIAR PUERTO B
	LDI	TPP,0B0011_1111
	OUT	PORTB,TPP
	LDI	TPP,0B0000_0000
	OUT	DDRB,TPP
;INICIAR PUERTO C
	LDI	TPP,0B0011_1111
	OUT	PORTC,TPP
	LDI	TPP,0B0000_0000
	OUT	DDRC,TPP
;INICIAR PUERTO D
	LDI	TPP,0B1111_1001
	OUT	PORTD,TPP
	LDI	TPP,0B0000_0110
	OUT	DDRD,TPP
;INICIAR SUBSISTEMAS
	RCALL	USAINC		;INICIAR USART.
	RCALL	TC1INC		;INICIAR CONTADOR TEMPORIZADOR 1.
	CLT			;HABILITAR PROTECCIÓN CONTRA ESCRITURA DE EEPROM.

;	**************************
;	**** RUTINA PRINCIPAL ****
;	**************************

PCP:
;INDAGAR ENTRADAS
	RCALL	SWATRB		;ESPERA PARA EVITAR REBOTES EN INTERRUPTORES.
	SBIS	PINC,3		;INDAGAR DIP SW1
	RCALL	DIPSW1		;DESCARGA DE EEPROM.
	SBIS	PINC,2		;INDAGAR DIP SW2
	RCALL	DIPSW2		;CAPTURAR FLUJO.
	SBIS	PINC,1		;INDAGAR DIP SW3
	RCALL	DIPSW3		;BORRAR DATOS DE EEPROM.
	SBIS	PINC,0		;INDAGAR DIP SW4
	RCALL	DIPSW4		;HABILITAR BORRAR DATOS DE EEPROM.
	RJMP	PCP		;REITERAR.

;	********************************
;	**** SUBRUTINAS DE ACCIONES ****
;	********************************

DIPSW1:	;DESCRIPCIÓN: RUTINA DE SERVICIO PARA DIP SW1 DESCARGA DE EEPROM.
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
;ESPERAR PARA EVITAR REBOTES EN INTERRUPTORES.
	RCALL	SWATRB		;ESPERA PARA EVITAR REBOTES EN INTERRUPTORES.
;INICIAR DESDE LA DIRECCIÓN $0000 DE EEPROM.
	MOV	TPL,K00
	MOV	TPH,K00
;PRESTABLECER; LÍMITE DE ENVÍO.
	LDI	TWL,LOW(512)	
	LDI	TWH,HIGH(512)
DIPSW11:
;LEER DE EPROM
	RCALL	EER
;ENVIAR EN UART
DIPSW14:
	SBIS	UCSRA,UDRE
	RJMP	DIPSW14
	OUT	UDR,TPP
;APUNTAR A SIGUIENTE LOCALIDAD EN EEPROM
	INC	TPL
	BRNE	DIPSW12
	INC	TPH
DIPSW12:
;INDAGAR SI ES LA ÚLTIMA
	CP	TWL,TPL
	CPC	TWH,TPH
;NO ES LA ÚLTIMA, ENTONCES SALTA Y REITERAR
	BRNE	DIPSW11
;SÍ ES LA ÚLTIMA, TERMINA
DIPSW13:
;ESPERAR PARA EVITAR REBOTES EN INTERRUPTORES.
	RCALL	SWATRB		;ESPERA PARA EVITAR REBOTES EN INTERRUPTORES.
;ESPERAR A DESACTIVAR DIP SW 1
	SBIS	PINC,3		;INDAGAR DIP SW1
	RJMP	DIPSW13
;REGRESAR RUTINA PRINCIPAL.
	RET

DIPSW2:	;DESCRIPCIÓN: RUTINA DE SERVICIO PARA DIP SW2 CAPTURAR FLUJO.
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
;ESPERAR PARA EVITAR REBOTES EN INTERRUPTORES.
	RCALL	SWATRB		;ESPERA PARA EVITAR REBOTES EN INTERRUPTORES.
;SI LA PROTECCIÓN CONTRA ESCRITURA DE LA EEPROM ESTÁ HABILITADA; ABORTAR
	BRTS	DIPSW26
	RET
DIPSW26:
;HABILITAR PROTECCIÓN DE ESCRITURA DE EEPROM
	CLT			;USAR BANDERA SREG(T) PARA PROTECCIÓN DE BORRADO DE EEPROM.
	CBI	PORTD,2
;PREPARAR REGISTROS
	MOV	TPL,K00		;INICIAR APUNTADOR A LOCALIDADES DE EEPROM
	MOV	TPH,K00		;.
	LDI	TPP,(256-125)	;PREPARAR PARA 125 CUENTAS PROVOQUEN SOBREFLUJO. 15625 Hz / 125 = 31.25 Hz
	MOV	GXL,TPP		;.
	LDI	TPP,0B0000_0001	;MÁSCARA PARA BANDERA DE SOBREFLUJO DEL TEMPORIZADOR CONTADOR 1 .
	MOV	GXH,TPP		;.
	LDI	TPP,LOW(1875)	;1875 CUENTAS: 31.25 Hz / 1875 = 1/60 Hz = 60 s
	MOV	GYL,TPP
	LDI	TPP,HIGH(1875)
	MOV	GYH,TPP
;ESTABLECER PRESCALA DEL CONTADOR 1 ((4 MHz / 1024) / 125) / 1875 = 1/60 Hz = 60 s
	OUT	TCNT0,GXL
;BORRAR BANDERA DE SOBREFLUJO
	OUT	TIFR,GXH
;ESTABLECER CUENTA PULSOS DE RELOJ 4 MHz
	LDI	TPP,0B0000_0101	; 4 MHz / 1024 = 3906.25 Hz
	OUT	TCCR0,TPP		;.
DIPSW25:
; BORRAR CONTADOR DE SOBREFLUJOS
	MOV	GZL,K00
	MOV	GZH,K00
DIPSW22:
;  INDAGAR SI TERMINAR CAPTURA
	SBIC	PINC,2		;INDAGAR DIP SW2.
	RET			;TERMINAR CAPTURA.
; ESPERAR SOBREFLUJO DEL TEMPORIZAOR Y RESTABLECER CUENTA.
	IN	GPP,TIFR		;ESPERAR SOBREFLUJO
	SBRS	GPP,0
	RJMP	DIPSW22		;.
	OUT	TIFR,GXH		;BORRAR BANDERA DE SOBREFLUJO.
	OUT	TCNT0,GXL		;ESTABLECER CUENTA DE 125 PULSOS.
; INCREMENTAR CONTADOR DE SOBREFLUJOS
	INC	GZL
	BRNE	DIPSW21
	INC	GZH
DIPSW21:
; COMPARAR CON EL LÍMITE
	CP	GZL,GYL
	CPC	GZH,GYH
	BRNE	DIPSW22	;AÚN NO ES 1 MINUTO, SALTA, ESPERAR.
;OBTENER CUENTA CONTINUA DEL SENSOR
	IN	TPP,TCNT1L
	IN	TPX,TCNT1H
;CALCULAR CUENTA DE MINUTO DEL SENSOR
	SUB	TPP,TCL
	SBC	TPX,TCH
	MOV	TCL,TPP
	MOV	TCH,TPX
;GRABAR CUENTA DE MINUTO DEL SENSOR
; GRABAR OCTETO BAJO
	RCALL	EEW
; APUNTAR A SIGUIENTE LOCALIDAD DE EEPROM
	INC	TPL
	BRNE	DIPSW23
	INC	TPH
DIPSW23:
; GRABAR OCTETO ALTO
	MOV	TPP,TCH
	RCALL	EEW
; APUNTAR A SIGUIENTE LOCALIDAD DE EEPROM
	INC	TPL
	BRNE	DIPSW24
	INC	TPH
DIPSW24:
;REITERAR
	RJMP	DIPSW25

DIPSW3:	;DESCRIPCIÓN: RUTINA DE SERVICIO PARA DIP SW3
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
;ESPERAR PARA EVITAR REBOTES EN INTERRUPTORES.
	RCALL	SWATRB		;ESPERA PARA EVITAR REBOTES EN INTERRUPTORES.
;SI LA PROTECCIÓN CONTRA ESCRITURA DE LA EEPROM ESTÁ HABILITADA; ABORTAR
	BRTS	DIPSW31
	RET
DIPSW31:
;BORRAR APUNTADOR DE DIRECCIÓN DE EEPROM
	MOV	TPL,K00
	MOV	TPH,K00
;PREPARA REGISTROS PARA LIMITAR.
	LDI	TWL,LOW(512)
	LDI	TWH,HIGH(512)
DIPSW34:
;LEER DATO DE EEPROM
	RCALL	EER
;¿DATO BORRADO?
	CP	TPP,KFF
;SÍ, SALTA
	BREQ	DIPSW32
;NO, BORRAR
	MOV	TPP,KFF
	RCALL	EEW
DIPSW32:
;APUNTAR A SIGUIENTE LOCALIDAD
	INC	TPL
	BREQ	DIPSW33
	INC	TPH
DIPSW33:
;¿EL LÍMITE?
	CP	TPL,TWL
	CPC	TPH,TWH
;NO, REITERAR
	BRNE	DIPSW34
;REGRESAR RUTINA PRINCIPAL.
	RET

DIPSW4:	;DESCRIPCIÓN: RUTINA DE SERVICIO PARA DIP SW4
	;ENTRADA: NINGUNA.
	;SALIDA: SREG(T)
;ESPERAR PARA EVITAR REBOTES EN INTERRUPTORES.
	RCALL	SWATRB		;ESPERA PARA EVITAR REBOTES EN INTERRUPTORES.
;HABILITAR LLAVE DE BORRADO DE EEPROM.
	SET
	SBI	PORTD,2
;REGRESAR RUTINA PRINCIPAL.
	RET

;	********************************
;	*** INICIACIÓN DE INTERFACES ***
;	********************************

USAINC:	;DESCRIPCIÓN: INICIA USART 2400 BAUDS, 8 BITS DE DATOS, SIN PARIDAD.
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
; F = 4 MHz , U2X = 0
	LDI	TPH,HIGH(103)
	LDI	TPL,LOW(103)
; SET BAUD RATE
	OUT 	UBRRH, TPH
	OUT 	UBRRL, TPL
; ASEGURAR U2X EN 0
	OUT	UCSRA,K00
; ENABLE TRANSMITTER
	LDI 	TPP, (1<<TXEN)
	OUT 	UCSRB,TPP
; SET FRAME FORMAT: 8DATA, 2STOP BIT
	LDI 	TPP, (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
	OUT 	UCSRC,TPP
;TERMINAR
	RET

TC1INC:	;DESCRIPCIÓN: INICIA TEMPORIZADOR CONTADOR 1
	;ENTRADA:
	;SALIDA:
;INICIAR REGISTRO DE CONTROL A
	LDI	TPP,0B0000_0000
	OUT	TCCR1A,TPP
;INICIAR REGISTRO DE CONTROL B
	LDI	TPP,0B0000_0110	;CUENTA FLANCOS DE BAJADA EN T1
	OUT	TCCR1B,TPP	;.
;INICIAR EN CERO LA CUENTA
	OUT	TCNT1H,K00
	OUT	TCNT1L,K00
;INICIAR EN CERO RESPALDO DE CONTADOR TEMPORIZADOR
	MOV	TCL,K00
	MOV	TCH,K00
;TERMINAR
	RET

;	***************************
;	*** EEPROM PROGRAMACIÓN ***
;	***************************

EEW:	;DESCRIPCIÓN: GRABA UN OCTETO EN EEPROM.
	;ENTRADA: TPH:TPL = DIRECCIÓN DE EEPROM , TPP = OCTETO A GRABAR .
	;SALIDA: NINGUNA.
; WAIT FOR COMPLETION OF PREVIOUS WRITE
	SBIC 	EECR,EEWE
	RJMP 	EEW
; SET UP ADDRESS (R18:R17) IN ADDRESS REGISTER
	OUT 	EEARH,TPH
	OUT 	EEARL,TPL
; WRITE DATA (R16) TO DATA REGISTER
	OUT 	EEDR,TPP
	CLI			;DESACTIVAR INTERRUPCIONES.
; WRITE LOGICAL ONE TO EEMWE
	SBI 	EECR,EEMWE
; START EEPROM WRITE BY SETTING EEWE
	SBI 	EECR,EEWE
	SEI			;ACTIVAR INTERRUPCIONES.
	RET

EER:	;DESCRIPCIÓN: LEE UN OCTETO DE EEPROM.
	;ENTRADA: TPH:TPL = DIRECCIÓN DE EEPROM .
	;SALIDA: TPP = OCTETO LEÍDO .
; WAIT FOR COMPLETION OF PREVIOUS WRITE
	SBIC 	EECR,EEWE
	RJMP 	EER
; SET UP ADDRESS (R18:R17) IN ADDRESS REGISTER
	OUT 	EEARH,TPH
	OUT 	EEARL,TPL
; START EEPROM READ BY WRITING EERE
	SBI	EECR,EERE
; READ DATA FROM DATA REGISTER
	IN	TPP,EEDR
	RET

;	*******************
;	*** MISCELÁNEAS ***
;	*******************

SWATRB:	;DESCRIPCIÓN: ESPERA PARA EVITAR REBOTES DE INTERRUPTORES.
	;ENTRADA: NINGUNA.
	;SALIDA: NINGUNA.
	MOV	TPX,K00		;PREPARAR CONTADOR.
SWATRB2:	MOV	TPP,K00		;PREPARAR CONTADOR.
SWATRB1:	RCALL	SWATRB3		;PERDER TIEMPO (7 CICLOS).
	DEC	TPP		;¿FIN DE ESPERA?.
	BRNE	SWATRB1			;NO, SALTA.
	DEC	TPX		;¿FIN DE ESPERA?.
	BRNE	SWATRB2			;NO, SALTA.
SWATRB3:	RET			;TERMINAR.

.EXIT
