home *** CD-ROM | disk | FTP | other *** search
/ RISCWORLD 5 / RISCWORLD_VOL5.iso / SOFTWARE / Issue1 / PD / SFX / Source / SpecialFX / s / code
Encoding:
Text File  |  2004-04-09  |  9.8 KB  |  759 lines

  1. ;>s.code
  2.  
  3.  
  4. a1 RN 0
  5. a2 RN 1
  6. a3 RN 2
  7. a4 RN 3
  8. v1 RN 4
  9. v2 RN 5
  10. v3 RN 6
  11. v4 RN 7
  12. v5 RN 8
  13. v6 RN 9
  14. sl RN 10
  15. fp RN 11
  16. ip RN 12
  17. sp RN 13
  18. lk RN 14
  19. lr RN 14
  20. pc RN 15
  21.  
  22. f0 FN 0
  23. f1 FN 1
  24. f2 FN 2
  25. f3 FN 3
  26. f4 FN 4
  27. f5 FN 5
  28. f6 FN 6
  29. f7 FN 7
  30.  
  31.  
  32.  
  33.  
  34.         AREA |C$$code|, CODE, READONLY
  35.  
  36. |x$codeseg|
  37.  
  38.  
  39. SVC_Mode * 3
  40. Overflow_Flag * (1<<28)
  41. Carry_Flag * (1<<29)
  42. Font_Paint * &40086
  43. PDriver_CurrentJob * &80146
  44. PDriver_SelectJob * &80145
  45. PDriver_SelectIllustration * &80153
  46. OS_CallASWIR12 * &71
  47. OS_CallASWI * &6F
  48. Draw_Stroke * &40704
  49. Draw_Fill * &40702
  50. OS_ClaimProcessorVector * &69
  51. GDraw_Fill * &44542
  52. GDraw_Stroke * &44544
  53.  
  54.  
  55. buffer * &6000
  56.  
  57. XOS_MASK      * &00020000 ; mask to make a swi a RISC OS V-error SWI
  58.  
  59.  
  60.  
  61.  
  62. dofix
  63.  DCD 1
  64.  
  65. fixmode
  66.  DCD 7
  67.  
  68.  
  69. claimswi
  70.  DCD 0
  71.  
  72.  
  73.  EXPORT setfixmode
  74.  
  75.  
  76. setfixmode
  77.  
  78.  STR    r0,fixmode
  79.  MOV    pc,lk
  80.  
  81.  
  82.  EXPORT fixprintservice
  83.  
  84.  
  85. fixprintservice
  86.  
  87.  STR    r0,printactive
  88.  MOV    pc,lk
  89.  
  90.  
  91.  EXPORT claimvectors
  92.  
  93.  
  94. claimvectors
  95.  STMFD  sp!, {R0-R7, lk}  ; Initialisation code
  96.  
  97.  mov    r0,#2           ; claim SWI vector
  98.  orr    r0,r0,#256
  99.  
  100.  adr    r1,filter_SWI
  101.  swi    XOS_MASK :OR: OS_ClaimProcessorVector
  102.  
  103.  movvc  r0,#1
  104.  movvs  r0,#0
  105.  str    r0,claimswi
  106.  
  107.  bvs    oldcode
  108.  str    r1,instr
  109.  
  110.  b      claimexit
  111.  
  112.  
  113. oldcode
  114.  
  115.  MOV    R0, #8
  116.  LDR    R0, [R0]            ; Load data at 08 (branch to SWI handler code)
  117.  BIC    R0, R0, #&FF000000  ; Mask out instruction identifier
  118.  MOV    R0, R0, LSL #2      ; (*4) + 16
  119.  ADD    R0, R0, #16
  120.  STR    R0, instr           ; Store address of handler at label
  121.  ADR    R0, filter_SWI      ; Generate a single Branch instr to jump to new
  122.  SUB    R0, R0, #16         ; SWI handler code
  123.  MOV    R0, R0, LSR #2      ; - 16 (/4)
  124.  ORR    R0, R0, #&EA000000  ; Add on instruction identifier
  125.  MOV    R1, #8
  126.  STR    R0, [R1]            ; Save data at 08 (branch to new SWI handler code)
  127.  
  128.  
  129. claimexit
  130.  LDMFD  sp!, {R0-R7, pc}    ; Exit code and pull link off the stack
  131.  
  132.  
  133.  EXPORT relvectors
  134.  
  135.  
  136. relvectors
  137.  
  138.  STMFD  sp!, {lk}         ; Finalisation code
  139.  
  140.  ldr    r0,claimswi
  141.  teq    r0,#1
  142.  bne    reloldcode
  143.  
  144.  mov    r0,#2                 ; rel SWI vector
  145.  ldr    r1,instr
  146.  adr    r2,filter_SWI
  147.  swi    XOS_MASK :OR: OS_ClaimProcessorVector
  148.  b      relexit
  149.  
  150.  
  151. reloldcode
  152.  LDR    R0, instr             ; Load address of handler from label
  153.  SUB    R0, R0, #16           ; SWI handler code
  154.  MOV    R0, R0, LSR #2        ; -16 (/4)
  155.  ORR    R0, R0, #&EA000000    ; Add on instruction identifier
  156.  MOV    R1, #8
  157.  STR    R0, [R1]              ; Save data at 08 (branch to SWI handler code)
  158.  
  159.  
  160. relexit
  161.  LDMFD  sp!, {pc}           ; Exit code and pull link off the stack
  162.  
  163.  
  164. instr     DCD &1F033C0     ; Address of RISC-OS SWI handler
  165. const     DCD &FFF20000    ; mask useful bits of swi number
  166.  
  167.  
  168.  B      filter_SWI
  169.  B      filter_SWI
  170.  
  171.  
  172. OS_CallASWISwi
  173.  DCD OS_CallASWI
  174.  
  175. OS_CallASWIR12Swi
  176.  DCD OS_CallASWIR12
  177.  
  178. PDriverSelectIllustrationSwi
  179.  DCD  PDriver_SelectIllustration
  180.  
  181. PDriverSwi
  182.  DCD  PDriver_SelectJob
  183.  
  184. Font_PaintSwi
  185.  DCD  Font_Paint
  186.  
  187. Draw_StrokeSwi
  188.  DCD  Draw_Stroke
  189.  
  190. Draw_FillSwi
  191.  DCD  Draw_Fill
  192.  
  193.  
  194.  
  195. filter_SWI                   ; Code replaces RISCOS code that handles the SWI's
  196.  STMFD  R13!, {R9,R11}       ; Save registers to stack
  197.  TEQ    PC,PC                ; EQ if in a 32-bit mode, NE if 26-bit
  198.  BICNE  R9,   R14, #&FC000003; Clear flags from R14_svc to give address of SWI
  199.  MOVEQ  R9,   R14
  200.  LDR    R11,  [R9, #-4]      ; Load R11 with the actual SWI word
  201.  LDR    R9,   const          ; Load in a constant to mask R11 with
  202.  BIC    R11,  R11, R9        ; Mask out unwanted bits 31-17
  203.  
  204.  
  205.  LDR    R9,OS_CallASWIR12Swi
  206.  TEQ    R11,R9
  207.  BEQ    CallAswir12
  208.  
  209.  
  210.  LDR    R9,OS_CallASWISwi
  211.  TEQ    R11,R9
  212.  BEQ    CallAswi
  213.  
  214.  
  215. reenter
  216.  LDR    R9,PDriverSwi
  217.  TEQ    R11,R9
  218.  BEQ    PDriver
  219.  
  220.  
  221.  LDR    R9,Font_PaintSwi
  222.  TEQ    R11,R9
  223.  BEQ    Paint                 ; then call the filter code
  224.  
  225.  LDR    R9,Draw_StrokeSwi
  226.  TEQ    R11,R9
  227.  BEQ    DrawStroke
  228.  
  229.  LDR    R9,Draw_FillSwi
  230.  TEQ    R11,R9
  231.  BEQ    DrawFill
  232.  
  233.  
  234.  LDR    R9,PDriverSelectIllustrationSwi
  235.  TEQ    R11,R9
  236.  BEQ    PDriverSelectIllustration
  237.  
  238.  
  239.  
  240. routine
  241.  LDMFD  R13!, {R9,R11}       ; Restore registers & call previous SWI handler
  242.  LDR    PC, instr
  243.  
  244.  
  245. PDriverSelectIllustration
  246.  STR    r0,handle
  247.  B      routine
  248.  
  249. PDriver
  250.  STR    r0,handle
  251.  B      routine
  252.  
  253.  
  254.  
  255.  
  256. CallAswir12
  257.  LDR    R9, const            ; Load in a constant to mask R11 with
  258.  BIC    R11, R12, R9         ; Mask out unwanted bits 31-17
  259.  B      reenter
  260.  
  261.  
  262. CallAswi
  263.  LDR    R9, const
  264.  BIC    R11, R10, R9
  265.  B      reenter
  266.  
  267.  
  268.  
  269. ; r1->string
  270. ; r2=plot type
  271. ; r3=x coordinate
  272. ; r4=y coordinate
  273.  
  274. ; sequences
  275. ; 9, lox,midx,hix
  276. ; 11, lox,midx,hix
  277. ; 17, front
  278. ; 18, back,front,offset
  279. ; 21, string, <ctrl>
  280. ; 25, posn, thickness
  281. ; 26, font
  282. ; 19, r,g,b,R,G,B,offset
  283. ; 27, align, m1,m2,m3,m4
  284. ; 28, align, m1,m2,m3,m4,m5,m6
  285.  
  286.  
  287.  
  288.  
  289. handle
  290.  DCD 0
  291. printactive
  292.  DCD 0
  293. fontrecurse
  294.  DCD 0
  295.  
  296.  
  297.  
  298.  
  299. paintxrecurse
  300.  ldmfd  R13!,{r0-r4}
  301.  b      routine
  302.  
  303.  
  304. Paint
  305.  
  306.  stmfd  R13!, {r0-r4}
  307.  
  308.  str    r2,temp2
  309.  
  310.  ldr    r0,fontrecurse
  311.  teq    r0,#0
  312.  bne    paintxrecurse
  313.  
  314.  ldr    r0,dofix
  315.  teq    r0,#1
  316.  bne    paintxx
  317.  
  318.  
  319.  ldr    r0,handle
  320.  teq    r0,#0
  321.  beq    paintxx2
  322.  
  323.  ldr    r0,printactive
  324.  teq    r0,#0
  325.  beq    paintxx1
  326.  
  327.  ldr    r0,fixmode
  328.  tst    r0,#2
  329.  beq    paintxx
  330.  
  331.  
  332.  mov    r2,#buffer
  333.  tst    r1,#&FE000000
  334.  beq    paintxx
  335.  
  336.  
  337. paintloop
  338.  
  339.  mov    r3,r1
  340.  
  341.  ldrb   r0,[r1],#1
  342.  teq    r0,#9
  343.  addeq  r1,r1,#3
  344.  beq    paintloop1
  345.  
  346.  teq    r0,#11
  347.  addeq  r1,r1,#3
  348.  beq    paintloop1
  349.  
  350.  teq    r0,#17
  351.  addeq  r1,r1,#1
  352.  beq    paintloop1
  353.  
  354.  teq    r0,#18
  355.  addeq  r1,r1,#3
  356.  beq    paintloop1
  357.  
  358.  teq    r0,#25
  359.  addeq  r1,r1,#2
  360.  beq    paintloop1
  361.  
  362.  teq    r0,#26
  363.  addeq  r1,r1,#1
  364.  beq    paintloop1
  365.  
  366.  teq    r0,#21         ; comment
  367.  bne    paint1
  368. commentloop
  369.  ldrb   r0,[r1],#1
  370.  tst    r0,#&E0
  371.  beq    commentloop
  372.  b      paintloop1
  373.  
  374. paint1
  375.  teq    r0,#19
  376.  addeq  r1,r1,#7
  377.  beq    paintloop1
  378.  
  379.  teq    r0,#27
  380.  bne    paint2
  381.  add    r1,r1,#3
  382.  bic    r1,r1,#3
  383.  add    r1,r1,#16
  384.  b      paintloop1
  385.  
  386. paint2
  387.  teq    r0,#28
  388.  bne    paint3
  389.  add    r1,r1,#3
  390.  bic    r1,r1,#3
  391.  add    r1,r1,#24
  392.  b      paintloop1
  393.  
  394. paint3
  395.  
  396.  tst    r0,#&E0
  397.  moveq  r0,#0
  398.  streqb r0,[r2],#1
  399.  beq    paintloopx
  400.  
  401. paintloop1
  402.  ldrb   r0,[r3],#1
  403.  strb   r0,[r2],#1
  404.  teq    r3,r1
  405.  bne    paintloop1
  406.  
  407.  b      paintloop
  408.  
  409.  
  410. paintloopx
  411.  ldmfd  R13!, {r0-r4}
  412.  mov    r1,#buffer
  413.  b      paintxcheck
  414.  
  415.  
  416.  
  417.  
  418. paintxx2
  419.  ldr    r0,printactive
  420.  teq    r0,#0
  421.  bne    paintxx
  422.  
  423. paintxx1
  424.  ldr    r0,fixmode
  425.  tst    r0,#1
  426.  beq    paintxx
  427.  ldmfd  R13!,{r0-r4}
  428.  orr    r2,r2,#(1<<11)
  429.  b      paintxcheck
  430.  
  431.  
  432. paintxx
  433.  ldmfd  R13!,{r0-r4}
  434. paintxcheck
  435.  
  436.  
  437.  mov    r9,#1
  438.  str    r9,fontrecurse
  439.  
  440.  str    r14,temp14
  441.  
  442.  teq    pc,pc
  443.  bicne  r9,r14,#&FC000003
  444.  eorne  r14,r14,r9
  445.  adrne  r9,fxxx
  446.  orrne  r14,r14,r9
  447.  adreq  r14,fxxx
  448.  
  449.  ldmfd  r13!, {r9,r11}
  450.  
  451.  ldr    PC, instr
  452.  
  453.  
  454.  swi    XOS_MASK :OR: Font_Paint
  455. fxxx
  456.  
  457.  
  458.  ldr    r2,temp2
  459.  
  460.  str    r0,temp2
  461.  
  462.  mov    r0,#0
  463.  str    r0,fontrecurse
  464.  
  465.  ldr    r0,temp2
  466.  
  467.  ldr    pc,temp14
  468.  
  469.  
  470. temp14
  471.  DCD   0
  472. temp2
  473.  DCD   0
  474.  
  475.  
  476. dtemp14
  477.  DCD   0
  478.  
  479. drawrecurse
  480.  DCD   0
  481.  
  482. dtemp
  483.  DCD   0
  484.  
  485. dtemp1
  486.  DCD   0
  487.  
  488.  
  489.  
  490. DrawStroke
  491.  
  492.  
  493.  ldr    r9,drawrecurse
  494.  teq    r9,#0
  495.  bne    routine
  496.  
  497.  ldr    r9,dofix
  498.  teq    r9,#1
  499.  bne    routine
  500.  
  501.  ldr    r9,fixmode
  502.  tst    r9,#4
  503.  beq    routine
  504.  
  505.  
  506.  ldr    r9,handle
  507.  teq    r9,#0
  508.  beq    gdrawxx
  509.  
  510.  ldr    r9,printactive
  511.  teq    r9,#0
  512.  beq    gdrawxx
  513.  
  514.  
  515.  
  516. ; exit via Draw
  517.  
  518. drawxx
  519.  str    r14,dtemp14
  520.  
  521.  teq    pc,pc
  522.  bicne  r9,r14,#&FC000003
  523.  eorne  r14,r14,r9
  524.  adrne  r9,dxxx
  525.  orrne  r14,r14,r9
  526.  adreq  r14,dxxx
  527.  
  528.  mov    r9,#1
  529.  str    r9,drawrecurse
  530.  
  531.  ldmfd  r13!, {r9,r11}
  532.  
  533.  
  534.  ldr    PC, instr
  535.  
  536.  
  537.  swi    XOS_MASK :OR: Draw_Stroke
  538. dxxx
  539.  
  540.  
  541.  str    r0,dtemp
  542.  
  543.  mov    r0,#0
  544.  str    r0,drawrecurse
  545.  
  546.  ldr    r0,dtemp
  547.  
  548.  ldr    pc,dtemp14
  549.  
  550.  
  551.  
  552.  
  553.  
  554. ; exit via GDraw
  555.  
  556. gdrawxx
  557.  
  558.  teq    r1,#0               ; default style
  559.  beq    gdrx2
  560.  and    r9,r1,#3            ; mask out winding rule
  561.  teq    r9,#1               ; minus back to draw
  562.  beq    drawxx
  563.  teq    r9,#3               ; plus back to draw
  564.  beq    drawxx
  565.  and    r9,r1,#&3C          ; boundary pixel bits
  566.  teq    r9,#&30             ; allow only 30 and 38
  567.  beq    gdrx2
  568.  teq    r9,#&38
  569.  bne    drawxx
  570.  
  571. gdrx2
  572.  
  573.  str    r14,dtemp14
  574.  
  575.  teq    pc,pc
  576.  bicne  r9,r14,#&FC000003
  577.  eorne  r14,r14,r9
  578.  adrne  r9,gdxxx
  579.  orrne  r14,r14,r9
  580.  adreq  r14,gdxxx
  581.  
  582.  mov    r9,#1
  583.  str    r9,drawrecurse
  584.  
  585.  ldmfd  r13!, {r9,r11}
  586.  
  587.  str    r1,dtemp1
  588.  teq    r1,#0              ; default style
  589.  bne    gdrx1              ; thin line
  590.  teq    r4,#0
  591.  moveq  r1,#&18
  592.  movne  r1,#&38
  593. gdrx1
  594.  teq    r4,#0
  595.  orrne  r1,r1,#&80
  596.  orrne  r1,r1,#&80000000
  597.  
  598.  
  599.  ldr    PC, instr
  600.  
  601.  
  602.  swi    XOS_MASK :OR: GDraw_Stroke
  603. gdxxx
  604.  
  605.  
  606.  str    r0,dtemp
  607.  
  608.  mov    r0,#0
  609.  str    r0,drawrecurse
  610.  
  611.  ldr    r0,dtemp
  612.  
  613.  ldr    r1,dtemp1
  614.  
  615.  ldr    pc,dtemp14
  616.  
  617.  
  618.  
  619.  
  620. DrawFill
  621.  
  622.  
  623.  ldr    r9,drawrecurse
  624.  teq    r9,#0
  625.  bne    routine
  626.  
  627.  ldr    r9,dofix
  628.  teq    r9,#1
  629.  bne    routine
  630.  
  631.  ldr    r9,fixmode
  632.  tst    r9,#4
  633.  beq    routine
  634.  
  635.  
  636.  ldr    r9,handle
  637.  teq    r9,#0
  638.  beq    gdrawfxx
  639.  
  640.  ldr    r9,printactive
  641.  teq    r9,#0
  642.  beq    gdrawfxx
  643.  
  644.  
  645.  
  646. ; exit via Draw
  647.  
  648. drawfxx
  649.  
  650.  
  651.  str    r14,dtemp14
  652.  
  653.  teq    pc,pc
  654.  bicne  r9,r14,#&FC000003
  655.  eorne  r14,r14,r9
  656.  adrne  r9,dfxxx
  657.  orrne  r14,r14,r9
  658.  adreq  r14,dfxxx
  659.  
  660.  mov    r9,#1
  661.  str    r9,drawrecurse
  662.  
  663.  ldmfd  r13!, {r9,r11}
  664.  
  665.  
  666.  ldr    PC, instr
  667.  
  668.  
  669.  swi    XOS_MASK :OR: Draw_Fill
  670. dfxxx
  671.  
  672.  
  673.  str    r0,dtemp
  674.  
  675.  mov    r0,#0
  676.  str    r0,drawrecurse
  677.  
  678.  ldr    r0,dtemp
  679.  
  680.  ldr    pc,dtemp14
  681.  
  682.  
  683.  
  684.  
  685.  
  686. ; exit via GDraw
  687.  
  688. gdrawfxx
  689.  
  690.  
  691.  teq    r1,#0          ; default style
  692.  beq    gdrfx2
  693.  and    r9,r1,#3
  694.  teq    r9,#1
  695.  beq    drawfxx
  696.  teq    r9,#3
  697.  beq    drawfxx
  698.  and    r9,r1,#&3C
  699.  teq    r9,#&30
  700.  beq    gdrfx2
  701.  teq    r9,#&38
  702.  bne    drawfxx
  703.  
  704. gdrfx2
  705.  
  706.  
  707.  str    r14,dtemp14
  708.  
  709.  teq    pc,pc
  710.  bicne  r9,r14,#&FC000003
  711.  eorne  r14,r14,r9
  712.  adrne  r9,gdfxxx
  713.  orrne  r14,r14,r9
  714.  adreq  r14,gdfxxx
  715.  
  716.  mov    r9,#1
  717.  str    r9,drawrecurse
  718.  
  719.  ldmfd  r13!, {r9,r11}
  720.  
  721.  str    r1,dtemp1
  722.  teq    r1,#0
  723.  moveq  r1,#&30
  724.  orr    r1,r1,#&80
  725.  
  726.  
  727.  ldr    PC, instr
  728.  
  729.  
  730.  swi    XOS_MASK :OR: GDraw_Fill
  731. gdfxxx
  732.  
  733.  
  734.  
  735.  str    r0,dtemp
  736.  
  737.  mov    r0,#0
  738.  str    r0,drawrecurse
  739.  
  740.  ldr    r0,dtemp
  741.  
  742.  ldr    r1,dtemp1
  743.  
  744.  ldr    pc,dtemp14
  745.  
  746.  
  747.  
  748.         LTORG
  749.  
  750.     AREA |C$$data|
  751.  
  752.  
  753.  
  754. |x$dataseg|
  755.  
  756.  
  757.  
  758.     END
  759.