home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / a / appsswi / ZSource / SWIVeSrc (.txt) < prev   
RISC OS BBC BASIC V Source  |  1995-10-07  |  15KB  |  420 lines

  1.  WimpSWIVe 0.05 - Wimp SWI trapping module
  2.  by AjC of DoggySoft
  3.  Requires BAX 1.00 or later to compile. Source best viewed in a big mode, 114 column formatting
  4.  Note - the list of SWI traps is checked through _backwards_ when looking for pre-trapping code. This means
  5.  that traps at the start of the list get called _after_ those at end. This may confuse some people. ;-)
  6. trapped_chunk=&400C0
  7. specialswi=&400F5-&400C0
  8. chainchunks=512
  9. os_module_claim=6
  10. os_module_release=7
  11. os_module_extend=13
  12.  Workblock constants - wimpprivateword MUST be the first item (don't ask why...)
  13. w=0 :wk_wimpprivateword=w
  14. w+=4:wk_wimpswihandler=w
  15. w+=4:wk_chainptr=w
  16. w+=4:wk_numberoftraps=w
  17.  code 100000
  18.  0,"Error in compilation, pass "+
  19. pass+": "+
  20. $+", at line "+
  21.  pass=4
  22. O%=code:P%=0
  23. [OPT pass
  24.   Equd    0
  25.   Equd    mod_init
  26.   Equd    mod_quit
  27.   Equd    mod_service
  28.   Equd    mod_title
  29.   Equd    mod_help
  30.   Equd    0
  31. .mod_chunk
  32.   Equd    trapped_chunk
  33.   Equd    swi_handler
  34.   Equd    swi_table
  35.   Equd    0
  36. .mod_title
  37.   Equz    "WimpSWIVe"
  38.   Align
  39. .mod_help
  40.   Equs    "WimpSWIVe"+
  41. 2"  Equz    "0.05 (30 Oct 1995)"
  42.   Align
  43. .swi_table
  44.   Equz    "Wimp"
  45.   Equz    "Initialise"
  46.   Equz    "CreateWindow"
  47.   Equz    "CreateIcon"
  48.   Equz    "DeleteWindow"
  49.   Equz    "DeleteIcon"
  50.   Equz    "OpenWindow"
  51.   Equz    "CloseWindow"
  52.   Equz    "Poll"
  53.   Equz    "RedrawWindow"
  54.   Equz    "UpdateWindow"
  55.   Equz    "GetRectangle"
  56.   Equz    "GetWindowState"
  57.   Equz    "GetWindowInfo"
  58.   Equz    "SetIconState"
  59.   Equz    "GetIconState"
  60.   Equz    "GetPointerInfo"
  61.   Equz    "DragBox"
  62.   Equz    "ForceRedraw"
  63. I   Equz    "SetCaretPosition"
  64. J   Equz    "GetCaretPosition"
  65.   Equz    "CreateMenu"
  66.   Equz    "DecodeMenu"
  67.   Equz    "WhichIcon"
  68.   Equz    "SetExtent"
  69.   Equz    "SetPointerShape"
  70.   Equz    "OpenTemplate"
  71.   Equz    "CloseTemplate"
  72.   Equz    "LoadTemplate"
  73.   Equz    "ProcessKey"
  74.   Equz    "CloseDown"
  75.   Equz    "StartTask"
  76.   Equz    "ReportError"
  77. W   Equz    "GetWindowOutline"
  78.   Equz    "PollIdle"
  79.   Equz    "PlotIcon"
  80.   Equz    "SetMode"
  81.   Equz    "SetPalette"
  82.   Equz    "ReadPalette"
  83.   Equz    "SetColour"
  84.   Equz    "SendMessage"
  85.   Equz    "CreateSubMenu"
  86.   Equz    "SpriteOp"
  87.   Equz    "BaseOfSprites"
  88.   Equz    "BlockCopy"
  89.   Equz    "SlotSize"
  90.   Equz    "ReadPixTrans"
  91.   Equz    "ClaimFreeMemory"
  92.   Equz    "CommandWindow"
  93.   Equz    "TextColour"
  94.   Equz    "TransferBlock"
  95.   Equz    "ReadSysInfo"
  96.   Equz    "SetFontColours"
  97.   Equz    "GetMenuState"
  98.   Equz    "RegisterFilter"
  99.   Equz    "AddMessages"
  100.   Equz    "RemoveMessages"
  101. o   Equz    "SetColourMapping"
  102.   Equz    "TextOp"
  103. q   Equz    "SetWatchdogState"
  104.   Equz    "Extend"
  105.   Equz    "ResizeIcon"
  106.   Equb    0
  107. .wimpmodulename
  108.   Equz    "WindowManager"
  109.   Align
  110. z    .wswi
  111.   Equs    "WSWI"
  112. .error_cantquit
  113.   Equd    0
  114. ~V  Equz    "WimpSWIVe cannot be quit right now, as some clients are still using it"
  115.   Align
  116. .error_badrelease
  117.   Equd    0
  118. %  Equz    "Bad WimpSWIVe release"
  119.   Align
  120. .mod_init
  121.   StmFd   R13!,{R0-R5,R14}
  122. !  Mov     R0,#os_module_claim
  123.   Mov     R3,#w
  124. Q  Swi     "XOS_Module"                                      ; claim workspace
  125.   AddVs   R13,R13,#4
  126.   LdmVsFd R13!,{R1-R5,Pc}
  127. .init_jumpin
  128.   Str     R2,[R12]
  129.   Mov     R12,R2
  130.   Mov     R0,#18
  131.   Adr     R1,wimpmodulename
  132. a  Swi     "XOS_Module"                                      ; find out details of WIMP module
  133.   AddVs   R13,R13,#4
  134.   LdmVsFd R13!,{R1-R5,Pc}
  135. *  Str     R4,[R12,#wk_wimpprivateword]
  136.   Ldr     R0,[R3,#&20]
  137.   Add     R3,R3,R0
  138. \  Str     R3,[R12,#wk_wimpswihandler]                       ; store details in workspace
  139.   Mov     R0,#0
  140. (  Str     R0,[R12,#wk_numberoftraps]
  141. !  Mov     R0,#os_module_claim
  142.   Mov     R3,#chainchunks
  143.   Swi     "XOS_Module"
  144.   AddVs   R13,R13,#4
  145.   LdmVsFd R13!,{R1-R5,Pc}
  146. ^  Str     R2,[R12,#wk_chainptr]                             ; initialise null vector chain
  147.   LdmFd   R13!,{R0-R5,Pc}^
  148. .mod_quit
  149.   StmFd   R13!,{R0-R3,R14}
  150.   Ldr     R12,[R12]
  151. (  Ldr     R0,[R12,#wk_numberoftraps]
  152.   Teq     R0,#0
  153.   LdmNeFd R13!,{R0-R3,R14}
  154.   AdrNe   R0,error_cantquit
  155. ]  OrrNeS  Pc,R14,#1<<28                                     ; check we're allowed to quit
  156. #  Mov     R0,#os_module_release
  157. #  Ldr     R2,[R12,#wk_chainptr]
  158.   Swi     "XOS_Module"
  159. #  Mov     R0,#os_module_release
  160.   Mov     R2,R12
  161. _  Swi     "XOS_Module"                                      ; free claimed RMA then go away
  162.   LdmFd   R13!,{R0-R3,Pc}^
  163. .mod_service
  164.   Teq     R1,#&27
  165.   MovNeS  Pc,R14
  166.   Ldr     R12,[R12]
  167.   StmFd   R13!,{R0-R5,R14}
  168. d  B       init_jumpin                                       ; re-init when reset service happens
  169. .swi_handler
  170.   Ldr     R12,[R12]
  171.   StmFd   R13!,{R9,R10,R14}
  172.   Mov     R14,#0
  173. v  StmFd   R13!,{R14}                                        ; unset post-flag, initially no post-trapping required
  174.   Teq     R11,#specialswi
  175.   LdrEq   R14,wswi
  176.   TeqEq   R0,R14
  177. t  BEq     ourspecialswi                                     ; check if the WimpSWIVe control SWI has been called
  178. #  Ldr     R9,[R12,#wk_chainptr]
  179. )  Ldr     R10,[R12,#wk_numberoftraps]
  180.   Add     R9,R9,R10,Lsl#4
  181. .checkchainlooppre
  182.   Sub     R9,R9,#16
  183.   SubS    R10,R10,#1
  184.   BMi     swi_donepre
  185.   Ldr     R14,[R9]
  186.   Tst     R14,#1<<6
  187.   BNe     preloopallswis
  188.   And     R14,R14,#63
  189.   Teq     R14,R11
  190. j  BNe     checkchainlooppre                                 ; go through chain looking for SWI to trap
  191. .preloopallswis
  192.   Ldr     R14,[R9,#12]
  193.   Teq     R14,#0
  194.   MovNe   R14,#1
  195. m  StrNe   R14,[R13]                                         ; set the post-flag if post-trapping required
  196.   Ldr     R14,[R9,#8]
  197.   Teq     R14,#0
  198. h  BEq     checkchainlooppre                                 ; if no pre-trapping to do, back to loop
  199.   StmFd   R13!,{R9,R10,R12}
  200.   Orr     R10,R14,#3
  201.   Orr     R10,R10,#1<<27
  202.   Ldr     R12,[R9,#4]
  203.   Mov     R9,R11
  204. !  Adr     R14,backfrompretrap
  205.   Orr     R14,R14,#3
  206.   Orr     R14,R14,#1<<27
  207.   MovS    Pc,R10
  208. Y.backfrompretrap                                            ; call a pre-trap routine
  209.   Mov     R10,Pc
  210.    And     R10,R10,#&F0000000
  211.   Cmn     R9,#1
  212.   LdrEq   R9,[R13,#24]
  213.   BicEq   R9,R9,#&F0000000
  214.   OrrEq   R9,R9,R10
  215. s  StrEq   R9,[R13,#24]                                      ; if interception, update return PSR with new flags
  216.   LdmFd   R13!,{R9,R10,R12}
  217.   BNe     checkchainlooppre
  218.   LdmFd   R13!,{R14}
  219.   Teq     R14,#0
  220.   LdmEqFd R13!,{R9,R10,Pc}^
  221. )  Ldr     R14,[R12,#wk_numberoftraps]
  222.   Sub     R10,R14,R10
  223.   Sub     R10,R10,#1
  224. t  B       checkchainlooppost                                ; if interception, act as if SWI had been executed -
  225. t                                                            ; jump into post-trap loop with chain pointer intact
  226. t                                                            ; so that any post-code is called whose pre-code has
  227. m                                                            ; already been done. (Only if post-flag set.)
  228. .swi_donepre
  229.   LdmFd   R13!,{R14}
  230.   Teq     R14,#0
  231.   LdmEqFd R13!,{R9,R10,R14}
  232. r  LdrEq   Pc,[R12,#wk_wimpswihandler]                       ; pass on to real SWI if no post-trapping required
  233.   LdmFd   R13!,{R9,R10}
  234.   StmFd   R13!,{R12}
  235. !  Adr     R14,backfromrealswi
  236.   Orr     R14,R14,#3
  237.   Orr     R14,R14,#1<<27
  238. )  Ldr     Pc,[R12,#wk_wimpswihandler]
  239. \.backfromrealswi                                            ; call the swi and post-trap
  240.   LdmFd   R13!,{R12}
  241.   StmFd   R13!,{R9,R10}
  242.   Mov     R10,Pc
  243.    And     R10,R10,#&F0000000
  244.   Ldr     R9,[R13,#8]
  245.   Bic     R9,R9,#&F0000000
  246.   Orr     R9,R9,R10
  247. b  Str     R9,[R13,#8]                                       ; update return PSR with new flags
  248. #  Ldr     R9,[R12,#wk_chainptr]
  249. )  Ldr     R10,[R12,#wk_numberoftraps]
  250.   Sub     R9,R9,#16
  251. .checkchainlooppost
  252.   Add     R9,R9,#16
  253.   SubS    R10,R10,#1
  254.   LdmMiFd R13!,{R9,R10,Pc}^
  255.   Ldr     R14,[R9]
  256.   Tst     R14,#1<<6
  257.   BNe     postloopallswis
  258.   And     R14,R14,#63
  259.   Teq     R14,R11
  260. o  BNe     checkchainlooppost                                ; go through chain looking for SWI to post-trap
  261. .postloopallswis
  262.   Ldr     R14,[R9,#12]
  263.   Teq     R14,#0
  264. d  BEq     checkchainlooppost                                ; if not post-trapping, back to loop
  265.   StmFd   R13!,{R9,R10,R12}
  266.   Ldr     R12,[R13,#20]
  267.    And     R12,R12,#&F0000000
  268.   Orr     R10,R14,#3
  269.   Orr     R10,R10,#1<<27
  270. !`  Orr     R10,R10,R1