*************************************************************************
* Nome: Parallel.S							*
*									*
* Autore: Fabrizio Farenga						*
*									*
* Commento: La routine invia due diverse stringhe verso la porta	*
*	    parallela by-passando completamente il parallel.device.	*
*									*
* Versione: 1.0								*
*									*
* Ultimo aggiornamento: 10-Gen-94					*
*									*
* Bugs: Nessuno conosciuto						*
*									*
*************************************************************************

;Registri dei chip custom utilizzati

dmaconr     EQU   $DFF002
vhposr	    EQU   $DFF006
intenar     EQU   $DFF01C
intreqr     EQU   $DFF01E
dmacon	    EQU   $DFF096
intena	    EQU   $DFF09A
intreq	    EQU   $DFF09C

;Registri dei CIA utilizzati

CIAAPRA     EQU   $BFE001
CIAAPRB     EQU   $BFE101
CIAADDRB    EQU   $BFE301
CIAACRA     EQU   $BFEE01
CIAATALO    EQU   $BFE401
CIAATAHI    EQU   $BFE501
CIAAICR     EQU   $BFED01


CIABPRA     EQU   $BFD000
CIABDDRA    EQU   $BFD200

;Funzioni dell'Exec.library utilizzate

_LVODisable:	EQU -120
_LVOEnable:	EQU -120
_LVOSuperState:	EQU -150
_LVOUserState:	EQU -156


AFB_68010:	EQU 0
AttnFlags:	EQU $128


CALLEXEC: MACRO
	move.l 4.w,a6
	jsr	_LVO\1(a6)
	ENDM

Start:
	CALLEXEC Disable

	move.l	4.w,a6				;Abbiamo un 68010 o superiore?
	move.w	AttnFlags(a6),d0
	btst	#AFB_68010,d0
	beq	NoClearVBR

	CALLEXEC SuperState
	movec	VBR,d7				;In caso affermativo azzera il
	move.l	d7,OldVBR			;VBR preservandolo pero' in
	moveq	#0,d7				;OldVBR.
	movec	d7,VBR
	CALLEXEC UserState
NoClearVBR:

	move.w	INTENAR,OLDINTENA		;Spegne tutte le IRQ
	move.w	#$7fff,INTENA
	move.w	#$7fff,INTREQ

	move.b	#$00,CIABDDRA			;Imposta la direzione della
	move.b	#$FF,CIAADDRB			;porta parallela.

	lea	Init,a0				;Stampa la stringa di
	jsr	Output				;inizializzazione.

WaitMouse:
	btst	#6,CIAAPRA			;Attendi la pressione del tasto
	bne	WaitMouse			;sinistro del Mouse.

	lea	End,a0				;Stampa la stringa finale.
	jsr	Output

	move.w	#$7fff,INTENA			;Ripristina il sistema.

	move.w	OLDINTENA,d0
	bset	#15,d0
	move.w	d0,INTENA

	move.l	4.w,a6
	move.w	AttnFlags(a6),d0
	btst	#AFB_68010,d0
	beq	NoSetVBR

	CALLEXEC SuperState
	move.l	OldVBR,d7
	movec	d7,VBR
	CALLEXEC UserState
NoSetVBR:

	CALLEXEC Enable
	rts

OutPut:
	move.b	(a0)+,d0
	beq	EndOfOutput
Busy:
	move.b	CIABPRA,d7		;Controlla che la stampante non
	and.b	#1,d7			;risulti "occupata".
	bne	Busy

	jsr	Delay			;Attende 2 microsecondi

	move.b	d0,CIAAPRB
	bra	Output
EndOfOutput:
	rts


Delay
	move.l	d0,-(sp)
        move.b  CIAACRA,d0              ;Predispone il Timer A del CIA A
        and.b   #%11000000,d0           ;nel modo One-Shot
        or.b    #%00001000,d0
        move.b  d0,CIAACRA

TIME SET 1418  ; il valore è calcolato dividendo i microsecondi per 1.40968

        move.b  #(TIME&$ff),CIAATALO  ;Il timer deve attendere
        move.b  #(TIME>>8),CIAATAHI   ;2 microsecondi

TIMEWait
        btst    #0,CIAAICR              ;Aspetta che il tempo sia
        beq     TIMEWait              ;effettivamente trascorso
	move.l	(sp)+,d0
	rts



Init:	dc.b "$VER: Parallel 1.0 (10.01.94) By Fabrizio Farenga",$0a,0
End:	dc.b $0a,$0a,"Grazie per aver preferito Amiga Magazine",$0a,0
	CNOP 0,2

OldINTENA:	dc.w 0
OLDVBR:		dc.l 0





