;*
;
; ### Paddle routines by JM v 0.50 ###
;
; - Created 900715 by JM -
;
;
; This program reads paddles connected to mouse port #2.
;
;
; Bugs: yet unknown
;
;
; Edited:
;
; - 900715 by JM -> v0.01	- Basics from vertb.asm.
; - 900716 by JM -> v0.02	- Should work but worketh not.
; - 900717 by JM -> v0.50	- Worketh.  Needed a call to WritePotgo().
;
;

	include	"bb.i"
	include	"exec/types.i"
	include	"exec/execbase.i"
	include	"exec/tasks.i"
	include	"exec/nodes.i"
	include	"exec/memory.i"
	include	"exec/io.i"
	include	"exec/interrupts.i"
	include	"hardware/intbits.i"
	include	"hardware/custom.i"
	include	"libraries/dos.i"


OUTRY	equ	1<<15
DATRY	equ	1<<14
OUTRX	equ	1<<13
DATRX	equ	1<<12

OUTLY	equ	1<<11
DATLY	equ	1<<10
OUTLX	equ	1<<9
DATLX	equ	1<<8

START	equ	1


 STRUCTURE mv_VERTB,0				; oma muuttuja-alue
   APTR    mv_maintask				; paaohjelman task-osoite
   APTR    mv_potgores				; resourcen osoite
   ULONG   mv_sigmask				; signaalimaski
   UWORD   mv_potdata				; luettu data
   UWORD   mv_firedata				; nappuloiden tilat
 LABEL mv_SIZE					; struktuurin koko


	.var	global
	dlibb	Dos,Potgo
	dl	potbits
	db	VERTB_signal,int_added

	.share	mem,#MEMF_CLEAR!MEMF_PUBLIC
	dm	interrupt[IS_SIZE]
	dm	data[mv_SIZE]
	dm	buffer[256]

main	.begin
	ra
	st	VERTB_signal			; lippu: sigbit ei varattu

	openlib	Dos,cleanup

	lea.s	"potgo.resource",a1
	moveq	#0,d0
	call	OpenResource			; avataan potgo.resource
	move.l	d0,.PotgoBase
	beq	cleanup

	move.l	#OUTRY|DATRY|OUTRX|DATRX|START,d0 ; tarvittavat bitit
	move.l	d0,d2
	call	AllocPotBits
	move.l	d0,potbits			; varatut bitit
	cmp.l	d0,d2
	bne	cleanup				; ei saatu kaikkia bittejä

	share	mem,cleanup			; varataan muisti

	move.l	data,a2				; muuttuja-alueen osoite
	moveq	#-1,d0				; mika tahansa bitti kelpaa
	call	AllocSignal			; varataan signaali
	move.b	d0,VERTB_signal			; tallennetaan bitin nro
	moveq	#0,d1
	bset	d0,d1				; asetetaan sigbit-bitti
	move.l	d1,mv_sigmask(a2)		; tallennetaan signaalimaski
	move.l	.PotgoBase,mv_potgores(a2)	; resourcen osoite

	sub.l	a1,a1
	call	FindTask			; etsitaan oma task
	move.l	d0,mv_maintask(a2)		; osoite muuttujatilaan

	move.l	interrupt,a1			; Interrupt-struktuuri
	move.b	#NT_INTERRUPT,LN_TYPE(a1)	; noden tyyppi = INTERRUPT
	move.b	#1,LN_PRI(a1)			; noden prioriteetti = 1
	lea	intr_name(pc),a0		; noden nimi
	move.l	a0,LN_NAME(a1)			; nimen osoite struktuuriin
	lea.l	irqcode(pc),a0			; keskeytysrutiinin osoite
	move.l	a0,IS_CODE(a1)			; osoite struktuuriin
	move.l	a2,IS_DATA(a1)			; muuttuja-alueen osoite
	moveq	#INTB_VERTB,d0			; keskeytyksen tyyppi
	call	AddIntServer			; käynnistetään keskeytys
	st	int_added

loop	moveq	#0,d0
	move.b	VERTB_signal,d1			; odotetaan keskeytyksen
	bset	d1,d0				; antamaa signaalia
	moveq	#SIGBREAKB_CTRL_C,d1		; ja CTRL+C:n painamista
	bset	d1,d0
	call	Wait				; ohjelma nukkumaan
	btst	#SIGBREAKB_CTRL_C,d0
	bne	cleanup

	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	move.l	data,a2
	move.b	mv_potdata(a2),d0
	move.b	mv_potdata+1(a2),d1
	move.w	mv_firedata(a2),d2

	lea.s	" Paddle value: %3.3d %3.3d  Fire: %02.2x",13,a0
	move.w	d2,-(sp)
	move.w	d1,-(sp)
	move.w	d0,-(sp)
	move.l	sp,a1

	lea.l	putch(pc),a2			; putchar-rutiinin osoite
	move.l	buffer,a3			; tulostuspuskuri

	call	RawDoFmt			; formatoidaan tulostus
	addq.l	#6,sp				; sp takaisin kohdalleen
	move.l	a3,d2
	sub.l	d2,d7				; lasketaan rivin pituus
	move.l	d7,d3

	call	Output				; tulostustiedosto
	move.l	d0,d1
	beq.s	cleanup				; nolla -> ei voida tulostaa
	fcall	Write				; tulostus

	bra	loop

putch	move.b	d0,(a3)+
	move.l	a3,d7
	rts

cleanup	tst.b	int_added			; keskeytysrutiini
	.if	ne				; toiminnassa?
	 move.l	interrupt,a1
	 moveq	#INTB_VERTB,d0
	 call	RemIntServer			; poistetaan keskeytykset
	.end

	moveq	#0,d0
	move.b	VERTB_signal,d0			; vapautetaan signaalibitti
	.if	pl				; jos se oli varattu
	 call	FreeSignal
	.end

	move.l	potbits,d0
	.if	ne
	 call	FreePotBits
	.end

	freesh	mem				; vapautetaan muisti
	closlib	Dos
	moveq	#0,d0				; virhekoodi = 0
	.end



irqcode	lea	$dff000,a0			; custom-piirit
	move.w	pot1dat(a0),mv_potdata(a1)	; luetaan paddle
	move.w	joy1dat(a0),d0			; painikkeet
	move.w	d0,d1
	lsr.w	#1,d1
	and.w	#$0101,d1			; muut bitit pois
	eor.w	d1,d0
	move.w	d0,d1
	and.w	#$0003,d0			; taas liiat pois
	and.w	#$0300,d1			; tästä myös
	lsr.w	#6,d1				; molemmat tavut samaan
	or.b	d1,d0
	move.w	d0,mv_firedata(a1)		; nappuloiden tilat
	move.l	mv_potgores(a1),a5		; potgo base talteen
	move.l	mv_sigmask(a1),d0		; signaalimaski
	move.l	mv_maintask(a1),a1		; taski
	call	Signal				; annetaan signaali
	move.l	a5,a6				; potgo base
	moveq	#1,d0
	moveq	#1,d1				; käynnistetään uusi muunnos
	fcall	WritePotgo
	moveq	#0,d0				; tieto Execille, että
	rts					; keskeytysketju voi jatkua


intr_name:
	dc.b	'My_Paddle_Intr',0		; keskeytyksen nimi

	.purge

	end


