home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 2 / DATAFILE_PDCD2.iso / utilities2 / _dirmenu / !DirMenu / !MakeMod (.txt) < prev    next >
RISC OS BBC BASIC V Source  |  1993-07-27  |  9KB  |  175 lines

  1.  This program is run by DirMenu's !RunImage after it has set itself up
  2.  as a Wimp task.
  3.  It finds the task handles of the Filer and DirMenu and assembles a
  4.  module using these task handles. The module is ~ 500 bytes long
  5.  The module detects OS mouse button events (not Wimp), and sends an
  6.  event_CLICK to DirMenu if the click is with the menu button and is on a
  7.  Filer window title-bar.
  8.  It also attaches a Filter onto the Filer. If there is an Alt-Menu click
  9.  on a Filer windows, the click is sent to DirMenu, and a NULL event is
  10.  sent to the Filer.
  11.  I'm a bit of a newcomer to ARM assembler, so if my code is crap, please
  12.  tell me of any improvements I could make!
  13. /filer_task      = 
  14. FindTaskHandle( "Filer")
  15. 8dirmenu_task    = 
  16. FindTaskHandle( "Directory Menu")
  17.  filer_task   = 0 
  18.  0, "Can't find Filer task"
  19.  dirmenu_task = 0 
  20.  0, "Can't find DirMenu task"
  21. key = 256-3: 
  22.  codespace 1024
  23.  pass=0 
  24. P% = 0
  25. O% = codespace
  26. !GL% = codespace + 1024: 
  27.  prevents assembler from overwriting memory
  28. [ OPT pass+4+8
  29. %Q;************ 
  30. ULE specs ****************************************************
  31. '9        EQUD    0                        ; no startup
  32.         EQUD    initialise
  33.         EQUD    finalise
  34. *N        EQUD    0                        ; no service calls are dealt with
  35.         EQUD    title
  36.         EQUD    helpstring
  37. -<        EQUD    0                        ; no help table
  38. .;        EQUD    0                        ; no SWI chunk
  39. /=        EQUD    0                        ; no SWI handler
  40. 0;        EQUD    0                        ; no SWI table
  41. 1:        EQUD    0                        ; no SWI code
  42. 4S;********* Storage space for constants etc. ***********************************
  43. 6*.filertaskhandle:   EQUD    filer_task
  44. 7,.dirmenutaskhandle: EQUD    dirmenu_task
  45. 82.pollblock:         EQUS    
  46.  20, 
  47. (0)): ALIGN
  48. 9=.title:             EQUS    "DirMenuMouse": EQUB 0: ALIGN
  49. :j.helpstring:        EQUS    "DirMenuMouse" + 
  50. (9) + "0.22 (11 Jul 1993) 
  51.  Julian Smith": EQUB 0: ALIGN
  52. ;8.filtername:        EQUS    "DirMenu": EQUB 0: ALIGN
  53. <T.mask:              EQUD    
  54.  (1<<6) ; this mask lets through event_CLICK's only
  55. =!.oldbuttonstate:    EQUD    0
  56. ?S;******************************************************************************
  57. .initialise
  58.         STMFD   r13!, {r14}
  59. E=        MOV     r0, #16                 ; Claim OS events
  60. F!        ADR     r1, eventcode
  61.         MOV     r2, #0
  62.         SWI     "OS_Claim"
  63. JK        MOV     r0, #14                 ; Enable OS mouse button events
  64.         MOV     r1, #10
  65.         SWI     "OS_Byte"
  66. NJ        ADR     r0, filtername          ; attach a filter to the Filer
  67. O"        ADR     r1, filtercode
  68.         ADR     r2, 0
  69. Q'        LDR     r3, filertaskhandle
  70.         LDR     r4, mask
  71. S/        SWI     "Filter_RegisterPostFilter"
  72.         LDMFD   r13!, {PC}
  73. XS;******************************************************************************
  74. .finalise
  75.         STMFD   r13!, {R14}
  76. ]E        MOV     r0, #16                 ; Stop OS claiming events
  77. ^!        ADR     r1, eventcode
  78.         MOV     r2, #0
  79. `         SWI     "OS_Release"
  80. bL        MOV     r0, #13                 ; disable OS mouse button events
  81. cO        MOV     r1, #10                 ; hope nobody else is using them...
  82.         SWI     "OS_Byte"
  83. fM        ADR     r0, filtername          ; de-register filter on the Filer
  84. g"        ADR     r1, filtercode
  85.         ADR     r2, 0
  86. i'        LDR     r3, filertaskhandle
  87.         LDR     r4, mask
  88. k1        SWI     "Filter_DeRegisterPostFilter"
  89.         LDMFD   r13!, {PC}
  90. pS;******************************************************************************
  91. rQ.eventcode      ; *********** look for menu clicks on filer titlebar ********
  92. tP        CMP     r0, #10: MOVNES PC, r14 ; return if not a mouse button event
  93. v@        STMFD   r13!, {R0-R12, r14}     ; save all registers
  94. xC        LDR     r5, oldbuttonstate      ; load old button state
  95. yS        
  96.      r3, r3, #%111           ; don't know whether higher bits are used
  97. zR        STR     r3, oldbuttonstate      ; store new button state for next time
  98.         CMP     r5, #%000
  99. }U        LDMNEFD r13!, {r0-r12, PC}      ; quit if previous button state isn't 000
  100.         CMP     r3, #%010
  101. X        LDMNEFD r13!, {r0-r12, PC}      ; quit if new button state isn't 010        
  102. K        ; button change is from 000 to 010, i.e. menu button click, so:
  103. C        MOV     r9, PC                  ; switch to SVC mode...
  104.         
  105. R     r8, r9, #3
  106.         TEQP    r8, #0
  107. L        MOV     r0, r0                  ; ...and store r14_svc on stack,
  108. M        STMFD   r13!,{R14}              ; because it is corrupted by SWIs
  109. M        ADR     r1, pollblock           ; get info on the window and icon
  110. F        SWI     "XWimp_GetPointerInfo"  ; that the pointer is over
  111. N        BVS     quit                    ; in case not in wimp enviroment ?
  112. Q        LDR     r0, [R1,#16]            ; check icon handle is -4 (title bar)
  113.         ADD     r0, r0, #4
  114.         CMP     r0, #0
  115. >        BNE     quit                    ; quit if it isn't
  116. P        MOV     r0, #0                  ; send a null event to the window to
  117. B        ADR     r1, pollblock           ; find its task handle
  118. Q        LDR     r2, [R1,#12]            ; the task handle will be put into r2
  119. '        SWI     "XWimp_SendMessage"
  120. N        BVS     quit                    ; in case not in wimp enviroment ?
  121. F        LDR     r5, filertaskhandle     ; check if the task handle
  122. :        CMP     r2, r5                  ; is the filer
  123. >        BNE     quit                    ; quit if it isn't
  124. J        MOV     r0, #6                  ; everything is OK, so send an
  125. K        ADR     r1, pollblock           ; event_CLICK to DirMenu, using
  126. L        LDR     r2, dirmenutaskhandle   ; the pointer info found earlier
  127. '        SWI     "XWimp_SendMessage"
  128. N        BVS     quit                    ; in case not in wimp enviroment ?
  129.     .quit
  130. =        LDMFD   r13!, {R14}             ; restore r14_svc
  131. F        TEQP    r9, #0                  ; switch back to User mode
  132.         MOV     r0, r0
  133. J        LDMFD   r13!, {R0-R12, PC}      ; restore registers and return
  134. S;******************************************************************************
  135. ..filtercode     ; look for Alt-Menu clicks
  136. 3                ; pollblock is pointed to by r1
  137. Q        LDR     r2, [R1,#8]             ; event will be event_CLICK, so mouse
  138. K        TST     r2,#2                   ; button info is at pollblock!8
  139. O        
  140. Q   PC,R14                  ; return if Menu button is not pressed
  141. R        STMFD   r13!, {R0-R1,R14}       ; only need to preserve r0,R1 for poll
  142. L        MOV     r0,#129                 ; test for alt key using OS_Byte
  143.         MOV     r2,#255
  144. K        MOV     r1,#key                 ; Code for key to be tested for
  145.         SWI     "OS_Byte"
  146.         CMP     r2, #255:
  147. J        LDMNEFD r13!,{R0-R1,PC}         ; return if alt is not pressed
  148. V        LDMFD   r13,{R0-R1}             ; re-load message block intended for Filer
  149. S        LDR     r2, dirmenutaskhandle   ; ...and send it straight on to DirMenu
  150. &        SWI     "Wimp_SendMessage"
  151. K        LDMFD   r13!,{R0-R1}            ; re-load message block in case
  152. E                                        ; SendMessage corrupts it
  153. G        MOV     r0, #0                  ; change it to a Null event
  154. H        LDMFD   r13!,{PC}               ; and pass it on to Filer...
  155. S;******************************************************************************
  156.  pass
  157.  Install the module in RMA area.
  158.  "OS_Module", 11, codespace, P%
  159. FindTaskHandle( task_name$)
  160.  buff_len, buffer, r0, r1, r2
  161. %buff_len = 256: 
  162.  buffer buff_len
  163. r0 = 0
  164.   r1 = buffer: r2 = 16
  165.  "TaskManager_EnumerateTasks", r0, r1, r2 
  166.  r0=-1  = 0
  167. string( buffer!4) = task_name$
  168. =!buffer
  169. string( x)
  170.  i,c, a$
  171.  i=0 
  172.   c = ?(x+i)
  173.  c=0 
  174.   a$ = a$ + 
  175.