314 lines
6.4 KiB
ArmAsm
314 lines
6.4 KiB
ArmAsm
;Input routines
|
|
|
|
include "offsets.i"
|
|
include "defs.i"
|
|
include "errordefs.i"
|
|
include "macros.i"
|
|
include "macros2.i"
|
|
|
|
ifd CREATOR
|
|
incdir "/AMOS1.3"
|
|
else
|
|
incdir "/AMOS"
|
|
endc
|
|
; include "equ.s" ;PhxAss is buggy...
|
|
EcNumber equ 188
|
|
Bnk_BitData equ 0
|
|
Bnk_BitChip equ 1
|
|
Bnk_BitBob equ 2
|
|
Bnk_BitIcon equ 3
|
|
|
|
section text,code
|
|
|
|
xref DataBase
|
|
xref NoScr
|
|
xref InternalErr
|
|
xref InternalErr2
|
|
xref ProgInt
|
|
xref GetCurWin
|
|
xref GetSomeWinFlags
|
|
xref SetSomeWinFlags
|
|
|
|
xdef GetCurInput
|
|
xdef ConvRawKey
|
|
xdef DoEvent
|
|
xdef GetKey
|
|
xdef GetMouse
|
|
xdef GetMenu
|
|
|
|
|
|
GetCurInput: ;Get current input port to D0
|
|
pstart2
|
|
dmove.l CurIwindow,d0
|
|
beq .nowin
|
|
move.l d0,a0
|
|
move.l wd_UserPort(a0),d0
|
|
ret2
|
|
.nowin dmove.l CurIscreen,d0
|
|
beq NoScr
|
|
move.l d0,a0
|
|
move.l sc_UserData(a0),a0
|
|
move.l se_BaseWin(a0),a0
|
|
move.l wd_UserPort(a0),d0
|
|
ret2
|
|
|
|
ConvRawKey: ;Convert raw key code to character. D0=code,
|
|
; D1=qualifier. Return 0 if not convertable.
|
|
pstart2
|
|
move.l a2,-(a7)
|
|
sub.l #ie_sizeof+2,a7
|
|
clr.l ie_NextEvent(a7)
|
|
move.b #1,ie_Class(a7) ;IECLASS_RAWKEY
|
|
move.w d0,ie_Code(a7)
|
|
move.w d1,ie_Qualifier(a7)
|
|
dmove.l ConsoleDevice,a6
|
|
move.l a7,a0
|
|
lea ie_sizeof+1(a7),a1
|
|
moveq #1,d1
|
|
sub.l a2,a2
|
|
jsr -$30(a6) ;RawKeyConvert()
|
|
add.l #ie_sizeof,a7
|
|
tst.l d0
|
|
bmi .notok
|
|
move.w (a7)+,d0
|
|
bra .done
|
|
.notok moveq #0,d0
|
|
addq.l #2,a7
|
|
.done move.l (a7)+,a2
|
|
ret2
|
|
|
|
DoEvent: ;Get an event from port in A0 and do something. Keep
|
|
; repeating until im_Class & D0 or no more messages.
|
|
; Return Z clear if im_Class & D0, set otherwise.
|
|
; im_Class of the last message is returned in D0.
|
|
; Depending on im_Class, a return value may be in D1.
|
|
pstart2
|
|
movem.l d2-d3/a2,-(a7)
|
|
move.l d0,d2
|
|
move.l a0,-(a7)
|
|
cmp.b #NT_MSGPORT,ln_Type(a0)
|
|
beq .lp
|
|
move.l #$44457605,d1
|
|
bsr InternalErr
|
|
.lp move.l (a7),a0
|
|
syscall GetMsg
|
|
tst.l d0
|
|
beq .exit
|
|
move.l d0,a0
|
|
move.l a0,a2
|
|
move.l im_Class(a0),d3
|
|
cmp.l #CLOSEWINDOW,d3
|
|
bne .notcw
|
|
move.l im_IDCMPWindow(a0),a0
|
|
moveq #WEF_CLOSED,d0
|
|
move.l d0,d1
|
|
bsr SetSomeWinFlags
|
|
bra .endlp
|
|
.notcw cmp.l #RAWKEY,d3
|
|
bne .notrk
|
|
move.w im_Code(a0),d0
|
|
cmp.w #$60,d0 ;Ignore key up and shifting-key events
|
|
bcs .keyok
|
|
moveq #0,d3
|
|
bra .endlp
|
|
.keyok move.w im_Qualifier(a0),d1
|
|
dmove.l KeyBufPtr,a0 ;Get pointer to next event to read
|
|
dmove.l KeyBufNext,a1 ;Get pointer to current end of buffer
|
|
sub.w #ke_sizeof,a1 ;Are we out of buffer?
|
|
cmp.l a0,a1
|
|
bne .setke
|
|
moveq #0,d3 ;Yes, discard event
|
|
bra .endlp
|
|
.setke move.b d0,ke_code(a0) ;Save event data in buffer
|
|
move.b d1,ke_qual(a0)
|
|
move.l a0,-(a7)
|
|
bsr ConvRawKey
|
|
move.l (a7)+,a0
|
|
move.b d0,ke_char(a0)
|
|
add.l #ke_sizeof,a0
|
|
dcmp.l KeyBufEnd,a0 ;Update pointer (buffer is circular)
|
|
bne .chkbrk
|
|
dmove.l KeyBuffer,a0
|
|
.chkbrk tmove.l a0,KeyBufPtr
|
|
cmp.b #3,d0 ;Ctrl-C interrupts program
|
|
bne .endlp
|
|
bra ProgInt
|
|
.notrk cmp.l #MOUSEBUTTONS,d3
|
|
bne .notmb
|
|
move.b im_Code+1(a0),d0
|
|
bclr #7,d0
|
|
seq d1 ;D1 == 0 if release, != 0 if press
|
|
and.w #3,d0 ;SELECTDOWN is $68, MENUDOWN $69
|
|
tst.b d1
|
|
bne .mbset
|
|
dmove.b MouseState,d1
|
|
bclr d0,d1
|
|
tmove.b d1,MouseState
|
|
bra .mbdone
|
|
.mbset dmove.b MouseState,d1
|
|
bclr d0,d1
|
|
tmove.b d1,MouseState
|
|
.mbdone bra .endlp
|
|
.notmb cmp.l #MENUPICK,d3
|
|
bne .notmu
|
|
move.w im_Code(a0),d1
|
|
dmove.l MenuBufPtr,a0
|
|
dmove.l MenuBufNext,a1
|
|
sub.w #ue_sizeof,a1
|
|
cmp.l a0,a1
|
|
bne .setmu
|
|
moveq #0,d3
|
|
bra .endlp
|
|
.setmu move.w d1,ue_menupick(a0)
|
|
add.l #ue_sizeof,a0
|
|
dcmp.l MenuBufEnd,a0
|
|
bne .muset
|
|
dmove.l MenuBuffer,a0
|
|
.muset tmove.l a0,MenuBufPtr
|
|
bra .endlp
|
|
.notmu cmp.l #GADGETDOWN,d3
|
|
bne .notgd
|
|
move.l im_IAddress(a0),a1
|
|
move.l gg_UserData(a1),a0
|
|
;Check whether this is really one of our gadgets. (It should be,
|
|
; but this can't hurt...)
|
|
cmp.l #GADGET_MAGIC,ge_MagicID(a0)
|
|
bne .badgad
|
|
or.l #GEF_GADGETDOWN,ge_Flags(a0)
|
|
moveq #0,d0 ;Return gadget number
|
|
move.w gg_GadgetID(a1),d0
|
|
bra .endlp
|
|
.notgd cmp.l #GADGETUP,d3
|
|
bne .notgu
|
|
move.l im_IAddress(a0),a1
|
|
move.l gg_UserData(a1),a0
|
|
cmp.l #GADGET_MAGIC,ge_MagicID(a0)
|
|
bne .badgad
|
|
and.l #~GEF_GADGETDOWN,ge_Flags(a0)
|
|
moveq #0,d0 ;Return gadget number
|
|
move.w gg_GadgetID(a1),d0
|
|
move.w #~GADGETTYPE,d1
|
|
and.w gg_GadgetType(a1),d1
|
|
cmp.w #BOOLGADGET,d1
|
|
bne .endlp
|
|
move.w #TOGGLESELECT,d1
|
|
and.w gg_Activation(a1),d1
|
|
bne .endlp
|
|
addq.w #1,ge_HitCount(a0)
|
|
bra .endlp
|
|
.badgad moveq #0,d3
|
|
bra .endlp
|
|
.notgu
|
|
.endlp move.l d0,-(a7)
|
|
move.l a2,a1
|
|
syscall ReplyMsg
|
|
move.l (a7)+,d1 ;Message's return value to D1
|
|
cmp.l #CLOSEWINDOW,d3
|
|
beq .done
|
|
.test and.l d2,d3
|
|
beq .lp
|
|
.done move.l d3,d0
|
|
.exit addq.l #4,a7
|
|
movem.l (a7)+,d2-d3/a2
|
|
ret2
|
|
|
|
GetKey: ;Read key from buffer, return Z set if no key pressed.
|
|
; Input port in A0.
|
|
pstart2
|
|
cmp.b #NT_MSGPORT,ln_Type(a0)
|
|
beq .portok
|
|
move.l #$6B655F02,d1
|
|
bsr InternalErr
|
|
.portok move.l #RAWKEY,d0
|
|
bsr DoEvent
|
|
dmove.l KeyBufNext,a0
|
|
dcmp.l KeyBufPtr,a0
|
|
beq .nokey
|
|
moveq #0,d0
|
|
move.b ke_code(a0),d0
|
|
tmove.w d0,LastCode
|
|
move.b ke_qual(a0),d0
|
|
tmove.w d0,LastQual
|
|
move.b ke_char(a0),d0
|
|
tmove.b d0,LastChar
|
|
add.l #ke_sizeof,a0
|
|
dcmp.l KeyBufEnd,a0
|
|
bcs .set
|
|
dmove.l KeyBuffer,a0
|
|
.set tmove.l a0,KeyBufNext
|
|
moveq #1,d1
|
|
ret2
|
|
.nokey dclr.w LastCode
|
|
dclr.w LastQual
|
|
dclr.b LastChar
|
|
moveq #0,d0
|
|
ret2
|
|
|
|
GetMouse: ;Read MB event, return Z set if none available. Input
|
|
; port in A0.
|
|
pstart2
|
|
cmp.b #NT_MSGPORT,ln_Type(a0)
|
|
beq .portok
|
|
move.l #$6D655F02,d1
|
|
bsr InternalErr
|
|
.portok move.l #MOUSEBUTTONS,d0
|
|
bsr DoEvent
|
|
ret2
|
|
|
|
GetMenu: ;Read menu event, return Z set if none available.
|
|
; Input port in A0.
|
|
pstart2
|
|
movem.l d2/a2,-(a7)
|
|
move.l a0,a2
|
|
cmp.b #NT_MSGPORT,ln_Type(a2)
|
|
beq .portok
|
|
move.l #$75655F04,d1
|
|
bsr InternalErr
|
|
.portok move.l #MENUPICK,d0
|
|
move.l a2,a0
|
|
bsr DoEvent
|
|
dmove.l MenuBufNext,a0
|
|
dcmp.l MenuBufPtr,a0
|
|
beq .nomenu
|
|
move.w ue_menupick(a0),d2
|
|
add.l #ue_sizeof,a0
|
|
dcmp.l MenuBufEnd,a0
|
|
bcs .set
|
|
dmove.l MenuBuffer,a0
|
|
.set tmove.l a0,MenuBufNext
|
|
cmp.w #MENUNULL,d2
|
|
beq .portok
|
|
bsr GetCurWin
|
|
tst.l d0
|
|
bne .okwin
|
|
move.l #$75655F16,d1
|
|
bsr InternalErr
|
|
.okwin move.l d0,a0
|
|
move.l wd_UserData(a0),a0
|
|
move.l we_FirstMenu(a0),a0
|
|
move.w d2,d0
|
|
intcall ItemAddress
|
|
tst.l d0
|
|
bne .okitem
|
|
move.l #$75655F1F,d1
|
|
exg d2,d3
|
|
moveq #0,d2
|
|
move.w d3,d2
|
|
bsr InternalErr2
|
|
.okitem move.l d0,a0
|
|
tst.w mi_IsSubitem(a0)
|
|
bne .issub
|
|
dclr.w LastMenuSub
|
|
bra .doitem
|
|
.issub tmove.w mi_ItemNum(a0),LastMenuSub
|
|
move.l mi_Parent(a0),a0
|
|
.doitem tmove.w mi_ItemNum(a0),LastMenuItem
|
|
move.l mi_Parent(a0),a0
|
|
tmove.w mu_MenuNum(a0),LastMenu
|
|
moveq #1,d1
|
|
movem.l (a7)+,d2/a2
|
|
ret2
|
|
.nomenu moveq #0,d0
|
|
movem.l (a7)+,d2/a2
|
|
ret2
|