;
; ### Paddle routines by JM v 0.51 ###
;
; - 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().
; - 900722 by JM -> v0.51	- Final modifications.  Code made smaller.
;
;

	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

	xref	_LVOOldOpenLibrary
	xref	_LVOOpenResource
	xref	_LVOAllocPotBits
	xref	_LVOFreePotBits
	xref	_LVOAllocMem
	xref	_LVOAllocSignal
	xref	_LVOFindTask
	xref	_LVOAddIntServer
	xref	_LVOWait
	xref	_LVORawDoFmt
	xref	_LVOOutput
	xref	_LVOWrite
	xref	_LVORemIntServer
	xref	_LVOFreeSignal
	xref	_LVOFreeMem
	xref	_LVOCloseLibrary
	xref	_LVOSignal
	xref	_LVOWritePotgo

.DosBase	equ	-4		; muuttujat pinossa (offsetit)
.PotgoBase	equ	-8
potbits		equ	-12
VERTB_signal	equ	-13
int_added	equ	-14

MEM		set	4		; tarvittavan muistin määrä
MEMPTR		equ	-20		; osoitin pinossa
interrupt	equ	-24		; osoitin pinossa
MEM		set	MEM+(IS_SIZE)	; lisätään muistin määrään
data		equ	-28		; osoitin pinossa
MEM		set	MEM+(mv_SIZE)	; lisätään muistin määrään
buffer		equ	-32		; osoitin pinossa
MEM		set	MEM+(256)	; muistin kokonaismäärä

main	link	a4,#-32			; varataan muuttujatila
	movem.l	d0/a4,-(sp)
	moveq	#7,d0
1$	clr.l	-(a4)			; nollataan pinossa olevat muuttujat
	dbf	d0,1$
	movem.l	(sp)+,d0/a4
	st	VERTB_signal(a4)	; lippu: sigbit ei varattu

	lea	.DosName(pc),a1		; dos-kirjaston nimi
	move.l	$4,a6
	jsr	_LVOOldOpenLibrary(a6)	; mikä tahansa kirjastoversio kelpaa
	move.l	d0,.DosBase(a4)
	beq	cleanup			; jos ei auennut, pois

	lea	.PResName(pc),a1	; potgo.resourcen nimi
	moveq	#0,d0
	jsr	_LVOOpenResource(a6)	; avataan potgo.resource
	move.l	d0,.PotgoBase(a4)
	beq	cleanup			; jos ei auennut, pois

	move.l	#OUTRY|DATRY|OUTRX|DATRX|START,d0
	move.l	d0,d2			; tarvittavat bitit
	move.l	.PotgoBase(a4),a6
	jsr	_LVOAllocPotBits(a6)
	move.l	d0,potbits(a4)		; varatut bitit
	cmp.l	d0,d2
	bne	cleanup			; ei saatu kaikkia bittejä

	move.l	#MEM,d0			; varataan muistia
	move.l	#MEMF_CLEAR!MEMF_PUBLIC,d1
	move.l	$4,a6
	jsr	_LVOAllocMem(a6)
	move.l	d0,MEMPTR(a4)		; varatun alueen osoite
	beq	cleanup			; jos nolla, ei saatu muistia
	move.l	d0,a0
	move.l	#MEM,(a0)+		; varatun alueen pituus
	move.l	a0,interrupt(a4)	; interrupt-struktuurin osoite
	lea	(IS_SIZE)(a0),a0
	move.l	a0,data(a4)		; muuttuja-alueen osoite
	lea	(mv_SIZE)(a0),a0
	move.l	a0,buffer(a4)		; tulostuspuskurin osoite

	move.l	data(a4),a2		; muuttuja-alueen osoite
	moveq	#-1,d0			; mikä tahansa bitti kelpaa
	jsr	_LVOAllocSignal(a6)	; varataan signaali
	move.b	d0,VERTB_signal(a4)	; tallennetaan bitin nro
	moveq	#0,d1
	bset	d0,d1			; asetetaan sigbit-bitti
	move.l	d1,mv_sigmask(a2)	; tallennetaan signaalimaski
	move.l	.PotgoBase(a4),mv_potgores(a2)	; resourcen osoite
	sub.l	a1,a1
	jsr	_LVOFindTask(a6)	; etsitaan oma task
	move.l	d0,mv_maintask(a2)	; osoite muuttujatilaan
	move.l	interrupt(a4),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
	jsr	_LVOAddIntServer(a6)	; käynnistetään keskeytys
	st	int_added(a4)

loop	moveq	#0,d0
	move.b	VERTB_signal(a4),d1	; odotetaan keskeytyksen
	bset	d1,d0	; antamaa signaalia
	moveq	#SIGBREAKB_CTRL_C,d1	; ja CTRL+C:n painamista
	bset	d1,d0
	move.l	$4,a6
	jsr	_LVOWait(a6)		; ohjelma nukkumaan
	btst	#SIGBREAKB_CTRL_C,d0
	bne	cleanup
	lea	fmtstr(pc),a0		; format-rivi
	moveq	#0,d0
	moveq	#0,d1
	move.l	data(a4),a2		; muuttuja-alue
	move.b	mv_potdata(a2),d0	; paddle
	move.b	mv_potdata+1(a2),d1	; toinen paddle
	move.w	mv_firedata(a2),-(sp)	; tulitusnappulat
	move.w	d1,-(sp)		; luvut pinoon
	move.w	d0,-(sp)
	move.l	sp,a1			; osoitin lukuihin
	lea.l	putch(pc),a2		; putchar-rutiinin osoite
	move.l	buffer(a4),a3		; tulostuspuskuri
	move.l	$4,a6
	jsr	_LVORawDoFmt(a6)	; formatoidaan tulostus
	addq.l	#6,sp			; sp takaisin kohdalleen
	move.l	a3,d2
	moveq	#33,d3
	move.l	.DosBase(a4),a6
	jsr	_LVOOutput(a6)		; tulostustiedosto
	move.l	d0,d1
	beq.s	cleanup			; nolla -> ei voida tulostaa
	jsr	_LVOWrite(a6)		; tulostus
	bra	loop

putch	move.b	d0,(a3)+		; putchar-rutiini
	rts

cleanup	tst.b	int_added(a4)		; keskeytysrutiini
	beq.s	._8			; toiminnassa?
	move.l	interrupt(a4),a1
	moveq	#INTB_VERTB,d0
	move.l	$4,a6
	jsr	_LVORemIntServer(a6)	; poistetaan keskeytykset
._8	moveq	#0,d0
	move.b	VERTB_signal(a4),d0	; vapautetaan signaalibitti,
	bmi.s	._9			; jos se oli varattu
	move.l	$4,a6
	jsr	_LVOFreeSignal(a6)
._9	move.l	potbits(a4),d0
	beq.s	._A
	move.l	.PotgoBase(a4),a6
	jsr	_LVOFreePotBits(a6)
._A	move.l	MEMPTR(a4),d0		; vapautetaan muisti
	beq.s	._B
	move.l	d0,a1
	move.l	(a1),d0
	move.l	$4,a6
	jsr	_LVOFreeMem(a6)
	clr.l	MEMPTR(a4)
._B	move.l	.DosBase(a4),d0		; suljetaan dos
	beq.s	._C
	move.l	d0,a1
	move.l	$4,a6
	jsr	_LVOCloseLibrary(a6)
	clr.l	.DosBase(a4)
._C	moveq	#0,d0			; virhekoodi = 0
	unlk	a4
	rts


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
	move.l	$4,a6
	jsr	_LVOSignal(a6)		; annetaan signaali
	move.l	a5,a6			; potgo base
	moveq	#1,d0
	moveq	#1,d1			; käynnistetään uusi muunnos
	jsr	_LVOWritePotgo(a6)
	moveq	#0,d0			; tieto Execille, että
	rts				; keskeytysketju voi jatkua


intr_name:
	dc.b	'My_Paddle_Intr',0	; keskeytyksen nimi
.DosName:
	dc.b	'dos.library',0
.PResName:
	dc.b	'potgo.resource',0
fmtstr	dc.b	' Paddle value: %3.3d %3.3d  Fire: %02.2x',13,0
	ds.w	0

	end


