home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d6xx
/
d602
/
mbpress.lha
/
MBPress
/
Source
/
MBPress.asm
Wrap
Assembly Source File
|
1992-02-20
|
4KB
|
123 lines
********************** MBPress.asm ******************************
; by Steve Anderson on Jan 28, 1992
; using the Dvpac Assembler
; Purpose:
; - little CLI command to detect mouse button presses for
; gameport 1 (unit 0)
; Return:
; - 0 for no button pressed
; - 1 (or 001b) for lmb
; - 2 (or 010b) for rmb
; - 4 (or 100b) for mmb
; - 5 (or 101b) for both lmb + mmb (OR the individual results)
; - ...
; - 20 or 21 for error conditions
; Linking:
; blink MBPress.o lib lib:small.lib ND SC SD
*********************************************************************
INCLUDE "exec/types.i"
INCLUDE "exec/exec_lib.i"
INCLUDE "hardware/cia.i"
INCLUDE "hardware/custom.i"
INCLUDE "resources/potgo_lib.i"
XREF _ciaa
XREF _custom
XREF _potinp
SETBITS equ $FFFF ;which POTGO bits to set (masked later)
UNSETBITS equ $0000 ;which POTGO bits to clear
LBIT equ (1<<0) ;bit mask for Lmb return value
RBIT equ (1<<1) ;bit mask for Rmb return value
MBIT equ (1<<2) ;bit mask for Mmb return value
OUTLY equ (1<<11) ;bit mask for Rmb enable (port 1, unit 0)
DATLY equ (1<<10) ;bit mask for Rmb data
OUTLX equ (1<<9) ;bit mask for Mmb enable
DATLX equ (1<<8) ;bit mask for Mmb data
DATLY_POS equ 10 ;bit position for Rmb data
DATLX_POS equ 8 ;bit position for Mmb data
RES_FAIL equ 20 ;return value if can't open resource
ALOC_FAIL equ 21 ;return value if can't allocate bits
*********************************************************************
Start: movem.l d2-d7/a2-a6,-(sp) ;save registers per convention
moveq.l #0,d0 ;clear d0 before using
moveq.l #0,d1 ;clear d1 before using
moveq.l #0,d2 ;clear d2, used to store return value
Prep1: lea.l _ciaa,a4 ;base address of CIAA
move.b ciapra(a4),d1 ;move CIAAPRA bits into d1
Lmb: btst #CIAB_GAMEPORT0,d1 ;check left button
bne.s Prep2 ;if not pressed, continue checking
or.b #LBIT,d2 ;if pressed, set bit 0 of return value
Prep2: lea.l PotgoName(pc),a1 ;load a1 with resource name string
CALLEXEC OpenResource ;open 'potgo.resource'
move.l d0,d7 ;stash resource base
bne.s Prep3 ;resource ok, so continue preps
moveq.l #RES_FAIL,d2 ;return error value
bra Done ;halt prematurely
Prep3: exg.l d7,a6 ;put resource base in a6
moveq.l #0,d0 ;clear d0
or.w #OUTLY,d0 ;or OUTLY bit
or.w #DATLY,d0 ;or DATLY bit
or.w #OUTLX,d0 ;or OUTLX bit
or.w #DATLX,d0 ;or DATLX bit
jsr _LVOAllocPotBits(a6);call resource preparation function
tst.l d0 ;check whether bits allocated
beq.s Prep4 ;bits allocated, so continue preps
jsr _LVOFreePotBits(a6) ;free any bits that did allocate
moveq.l #ALOC_FAIL,d2 ;return error value
bra Done ;halt prematurely
Prep4: move.l d0,d1 ;move bit mask to proper register
move.l #SETBITS,d0 ;prepare to set all masked potgo bits
jsr _LVOWritePotgo(a6) ;set chosen potgo bits
lea.l _potinp,a4 ;address of POTINP register
move.w (a4),d0 ;move current POTbits to d0 for testing
Rmb: btst.l #DATLY_POS,d0 ;test POTINP with bit DATLY_POS
bne.s Mmb ;if not pressed, continue checking
or.b #RBIT,d2 ;if pressed, set bit 1 of return value
Mmb: btst.l #DATLX_POS,d0 ;test POTINP with bit DATLX_POS
bne.s Unprep ;if not pressed, let's cleanup and exit
or.b #MBIT,d2 ;if pressed, set bit 2 of return value
Unprep: move.l #UNSETBITS,d0 ;prepare to clear all masked potgo bits
jsr _LVOWritePotgo(a6) ;clear chosen potgo bits
move.l d1,d0 ;move bit mask to proper register
jsr _LVOFreePotBits(a6) ;free any allocated potgo bits
Done: move.l d2,d0 ;move return value to d0 for CLI
movem.l (sp)+,d2-d7/a2-a6 ;restore the registers we saved
rts ;this takes us back to DOS
*********************************************************************
vers: dc.b 0,'$VER: MBPress 1.0',0
PotgoName:
dc.b 'potgo.resource',0
ds.w 0
END
*********************************************************************