	cpu	68000		; asmsyntax=asm68k

	include	/usr/local/68k/sermones.inc

pi_t	equ	$800000		;Dirección base del 68230

pgcr	equ	$01		;Desplazamiento PGCR
paddr	equ	$05		;       "       PADDR
pbddr	equ	$07		;       "       PBDDR
pacr	equ	$0d		;       "       PACR
pbcr	equ	$0f		;       "       PBCR
padr	equ	$11		;       "       PADR
pbdr	equ	$13		;       "       PBDR

tcr	equ	$21		;Desplazamiento TCR
tivr	equ	$23		;       "       TIVR
cpr	equ	$25		;       "       CPR
tsr	equ	$35		;       "       TSR

decseg	equ	25000		;Cuenta para 0,1 segundos

numvec	equ	64		;Número de vector para la TIRQ


	org	$1000


	move.l	#timrut,4*numvec 	;Interceptamos el vector.
	lea	pi_t,a0			;A0 apunta a la base del 68230.

	move.b	#%10100000,tcr(a0) 	;TIRQ periódica, timer parado.
	move.b	#numvec,tivr(a0)	;Configura nº de vector.

	move.b	#%00000000,pgcr(a0)	;Modo 00 (8 bit unidireccional)
	move.b	#%10000000,pacr(a0)	;PA en submodo 1X (bit a bit)
	move.b	#%10000000,pbcr(a0)	;PB en submodo 1X (bit a bit)
	move.b	#%11111111,paddr(a0)	;PA completo en salida
	move.b	#%00000000,pbddr(a0)	;PB completo en entrada

	clr.b	d0			;Intervalo = 0 (en D0)
	move.b	#%10000000,led		;LED más alto encendido
	move.b	led,padr(a0)

forever	clr.w	d1			;D1(W)=0 para el MULU
	move.b	pbdr(a0),d1		;Lee los interruptores
	bclr	#7,d1			;sin tener en cuenta el 7.
	cmp.b	d0,d1			;Compara con los anteriores.
	beq.s	forever			;Si no hay cambios, repetimos.

	bclr	#0,tcr(a0)		;Paramos el timer.

	move.b	d1,d0			;Si intervalo es 0, dejamos parado
	beq.s	forever			;y seguimos leyendo interruptores.

	mulu	#decseg,d1		;Cálculo de la nueva cuenta del timer.
	movep.l	d1,cpr(a0)		;La ponermos en el CPR.

	bset	#0,tcr(a0)		;Volvemos poner en marcha el timer.

	bra.s	forever			;Y vuelta a la lectura de interruptores.



;---------------------------------------------------------------------
; Rutina de servicio de la TIRQ.
; 

timrut	move.b	d7,-(a7)		;Guarda D7.

	move.b	led,d7			;Copia el LED a D7.
	btst	#7,pi_t+pbdr		;Comprueba el switch 7.
	bne.s	izq			;Si es 1, a la izquierda.
	ror.b	#1,d7			;Rota a la derecha
	bra.s	mueve
izq	rol.b	#1,d7			;Rota a la izquierda
mueve	move.b	d7,led			;Almacena LED en memoria
	move.b	d7,pi_t+padr		;Saca el LED por el PA

	bset	#0,pi_t+tsr		;Desactiva la TIRQ.

	move.b	(a7)+,d7		;Recupera D7.
	rte				;Y retorno desde excepción.

	

;--------------
; ÁREA DE DATOS
;--------------

	org	$2000

led	ds.b	1
