;*************************************************************************
;* Nome: AntiAR                                                          *
;*                                                                       *
;* Autore: Fabrizio Farenga                                              *
;*                                                                       *
;* Commento: Blocca il sistema dopo un freeze della cartuccia AR         *
;*                                                                       *
;* Versione: 1.0                                                         *
;*                                                                       *
;* Ultimo aggiornamento: 24 Apr 1995                                     *
;*                                                                       *
;* Bugs: Non proprio un bug: la routine NON funzione se il registro VBR  *
;*       non e' posto a 0.  La questione  e' irrilevante  visto  che la  *
;*       Action Replay e' compatibile solo  con il processore 68000 nel  *
;*       quale il registro VBR NON ESISTE. Eventualmente  puo'  essere   *
;*       resa facilmente 68010+ compatibile.                             *
;*                                                                       *
;*                                                                       *
;*************************************************************************

;Registri dei chip custom utlizzati

INTENA          EQU $DFF09A     ;Contiene i bit di abilitazione delle IRQS.
INTENAR         EQU $DFF01C     ;Corrispondente in lettura di INTENA.
DMACON          EQU $DFF096     ;Registro di controllo dei canali DMA.
DMACONR		EQU $DFF002	;Corrispondente in lettura di DMACON.
INTREQ          EQU $DFF09C     ;Contiene i bit di richiesta delle IRQS.
VHPOSR          EQU $DFF006     ;Contiene la posizione corrente del pennello
				;elettronico.
COLOR00         EQU $DFF180     ;Colore di fondo.

;Registri del CIA A utilizzati (TOD = Time Of Day)

CIAAPRA         EQU $BFE001     ;Registro dati periferico A.
CIAATODLO	EQU $BFE801	;Registro TOD Low.
CIAATODMID	EQU $BFE901	;Registro TOD Mid.
CIAATODHI	EQU $BFEA01	;Registro TOD Hig.
CIAAICR         EQU $BFED01     ;Registro di controllo delle CIA IRQ.
CIAACRB         EQU $BFEF01     ;Registro di controllo A.

DELAY		EQU 250		;Frequenza del controllo (0-255).

Start
        move.w  INTENAR,OldINTENA       ;Preserva il contenuto di INTENA.
        move.w  #$7FFF,INTENA           ;Disattiva tutte le IRQ.
        move.w  DMACONR,OldDMACON       ;Preserva il contenuto di DMACON.
        move.w  #$7FFF,DMACON           ;Disattiva tutti i DMA.

        move.b  #%01111111,CIAAICR      ;Disabilita tutte le CIA IRQ.

        move.w  #$8300,DMACON		;Attiva perlomento il DMA dei bitplane
        				;(altrimenti non sara possibile
        				;impostare il colore di fondo).

	move.b	CIAACRB,OLD_CIAACRB	;Preserva il registro CIAACRB.

	move.b	#%00000000,CIAACRB	;Imposta il TOD a 0.
	move.b	#0,CIAATODHI
	move.b	#0,CIAATODMID
	move.b	#0,CIAATODLO

	move.b	#%10000000,CIAACRB	;Imposta l'ALARM secondo il
	move.b	#0,CIAATODHI		;parametro DELAY
	move.b	#0,CIAATODMID
	move.b	#DELAY,CIAATODLO

	move.b	#%00000000,CIAACRB	;Imposta il TOD

        move.l  $68,OldPortsIRQ         ;Preserva il vettore di PORTS IRQ.
        move.l  #PortsIRQ,$68           ;Punta il PORTS IRQ alla nostra
        				;routine.
	move.b	CIAAICR,D0		;Azzera eventuali IRQ pendenti.
	move.b	#%10000100,CIAAICR	;Abilita la ALARM IRQ.
        move.w  #$C008,INTENA           ;Attiva il MASTER IRQ e il PORTS IRQ.

	move.w	#$0200,$DFF100		;Disattiva tutti i bitplane.

Loop

        cmpi.b  #$00,VHPOSR             ;Aspetta l'inizio del prossimo
        bne     Loop			;quadro video.

	move.b	CIAATODLO,D0		;Il registro CIAATODLO non dovrebbe
	cmp.b	#DELAY+2,D0		;mai superare il valore DELAY+2.
	blo	NoFreezed		;Nel caso lo superasse, questo
	move.b	#1,Freezed		;significa che il programma e' stato
NoFreezed:				;interrotto dall'Amiga Action Replay.
					;Il valore +2 e' per avere un margine
					;di sicurezza nel caso di superlavoro
					;delle interrupt.

 	move.w	#$fff,COLOR00		;Mette il colore bianco nel fondo.

	tst.b	Freezed			;Se il programma e' stato interrotto
	beq	NoStop			;dalla cartuccia, mette il colore blu
 	move.w	#$00f,COLOR00		;nel fondo.
NoStop:

        btst    #6,CIAAPRA              ;Se e' stato premuto il tasto sinistro
        bne     Loop                    ;del mouse esce.
Exit:
        move.l  OldPortsIRQ,$68         ;Rimetti a posto il vecchio IRQ

	move.b	OLD_CIAACRB,CIAACRB
        move.b  #%10011111,CIAAICR      ;Riabilita tutte le CIA IRQ

        bset    #15,OldINTENA           ;Attiva il bit di controllo del
        move.w  OldINTENA,INTENA        ;vecchio INTENA e rimettilo a posto
        bset    #15,OldDMACON           ;Attiva il bit di controllo del
        move.w  OldDMACON,DMACON        ;vecchio DMACON e rimettilo a posto

        rts                             ;Esci

;**********************
; Routine di PORTS IRQ
;**********************

PortsIRQ
        move.l  d0,-(a7)                ;Preserva il registro D0.
        move.w  #$0008,INTREQ           ;Conferma il PORTS IRQ.

	move.w #$0f00,COLOR00		;Mette il colore rosso nello sfondo.

        move.b  CIAAICR,d0              ;Segnala al CIA l'accettazione
        				;dell'interruzione.

	and.b	#%00000100,d0		;Se l'interruzione non e' stata
	beq	No_ALRM_IRQ		;generata dall'Alarm non azzerare
					;il TOD.

	move.b	#%00000000,CIAACRB	;Re-imposta il TOD a 0.
	move.b	#0,CIAATODHI
	move.b	#0,CIAATODMID
	move.b	#0,CIAATODLO

No_ALRM_Irq:
        move.l  (a7)+,d0                ;Rimette a posto il registro D0.
        rte                             ;Ritorna dall'IRQ


OldINTENA       dc.w 0                  ;Buffer per il vecchio INTENA
OldDMACON       dc.w 0                  ;Buffer per il vecchio DMACON
OldPortsIRQ     dc.l 0                  ;Buffer per il vecchio IRQ
OLD_CIAACRB	dc.b 0			;Buffer per il CIAACRB
Freezed:	dc.b 0			;Flag di tasto freeze premuto!

VERSION:	dc.b "$VER:AntiAR 1.0 (24.04.95) by Fabrizio Farenga",0

