scene.org File Archive

File download

<root>­/­demos­/­groups­/­bass/trackman.zip

File size:
12 465 bytes (12.17K)
File date:
2026-01-07 17:04:08
Download count:
all-time: 1

Preview

  • Trackman,ffb 18.09K
  • Trackman.txt 16.52K

file_id.diz

REM >Trackman
REM By Jan Vlietinck
save=TRUE
RE=FALSE
PROCinit(13)
REPEAT
A$=CHR$((ASC GET$) AND NOT 32)
IF help THEN PROChelp:help=FALSE
CASE A$ OF
WHEN "M":PROCmandle:MAN=TRUE
WHEN "J":PROCjulia:MAN=FALSE
WHEN "S":PROCsave
WHEN "R":IF MAN THEN PROCinit_mandle(-2,-2,4) ELSE PROCinit_julia
WHEN "C":PROCcycle_up
WHEN "D":PROCcycle_down
WHEN "V":VIDEO=NOT VIDEO
WHEN "N":PROCmode_change
WHEN "Q":IF INKEY(-1) PROCmake
WHEN "H":PROChelp
ENDCASE
UNTIL 0
END

DEF PROChelp
VDU 5
MOVE 0,Ey-16
PRINT "The following keys can be used"'
PRINT "'M' : to generate a mandelbrot fractal"
PRINT "'J' : to generate a julia fractal"
PRINT "'R' : to redraw the initial fractal"
PRINT "'D' : to cycle the colors up"
PRINT "'C' : to cycle the colors down"
PRINT "'V' : to turn on/off the video DMA"
PRINT "'S' : to save the screen"
PRINT "'N' : to change to another video mode"
PRINT "'H' : to show this help"''
PRINT "The mouse buttons are"'
PRINT "Left   : zoom out"
PRINT "Right  : zoom in"
PRINT "Middle : start generating"''
PRINT "Supported modes are: 9,13,20,21,27,28,31"
VDU4:OFF
help=TRUE
ENDPROC

DEF PROCsave
VDU 5
MOVE 0,Ey-16:INPUT "Enter the name of the screen ? "S$
MOVE 0,Ey-16:PRINT "Enter the name of the screen ? "S$
VDU4:OFF
OSCLI "SCREENSAVE "+S$
ENDPROC

DEF PROCmake
PROCinit_mandle(-1.5,-1.25,2.5)
PROCASS
CALL set
CALL read
CASE MODE OF
WHEN 13
MODE 1:OFF
CALL set
CALL write
*SCREENSAVE MANDEL
WHEN 21
MODE 19:OFF
CALL set
CALL write
*SCREENSAVE HMANDEL
ENDCASE
END
ENDPROC

DEF PROCmode_change
RE=TRUE
VDU 26
REPEAT
INPUT "New mode ";Mode
PROCinit(Mode)
UNTIL Mode<>-1
IF MAN THEN
PROCmandle_redraw
ELSE
PROCjulia_redraw
ENDIF
ENDPROC

DEF PROCmandle_redraw
!OXD=OX*2^29
!OYD=OY*2^29
!FD=SC/Col*2^29
!DD=ITER
IF ((!FD) >> 16) <> 0 THEN !method=iterationL ELSE !method=iterationH
IF first_mandle THEN PROCinit_mandle(-2,-2,4) ELSE PROC_draw(mandle)
new_mandle=TRUE
ENDPROC

DEF PROCjulia_redraw
!JXD=JX*2^29
!JYD=JY*2^29
!JFD=JS/Col*2^29
!JDD=JITER
!AD=AT
!BD=BT
IF (!JFD >> 20 ) <> 0 THEN !method=juliaL ELSE !method=juliaH
IF first_julia THEN PROCinit_julia ELSE PROC_draw(mandle)
RE=TRUE
ENDPROC

DEF PROCjulia
IF choose_julia THEN
IF new_mandle AND save THEN
*SCREENSAVE FRACTAL
ENDIF
REPEAT
MOUSE X%,Y%,Z%
LINE X%-64,Y%,X%+64,Y%
LINE X%,Y%-64,X%,Y%+64
WAIT
LINE X%-64,Y%,X%+64,Y%
LINE X%,Y%-64,X%,Y%+64
UNTIL Z%=2
AT=(OX+X%/Ex*SC)*2^29
BT=(OY+(Ey-Y%)/Ex*SC)*2^29
!AD=AT
!BD=BT
PROCinit_julia
choose_julia=FALSE
ELSE
first_julia=FALSE
*FX 5
W%=Ex/4
REPEAT
MOUSE X%,Y%,Z%
IF Z%=4 THEN W%+=4
IF Z%=1 THEN W%-=4
RECTANGLE X%,Y%,W%,W%*Ratio
WAIT
RECTANGLE X%,Y%,W%,W%*Ratio
UNTIL Z%=2
VDU 26
INPUT  "Iterations ",JITER
IF JITER=0 THEN JITER=100
JX=JX+X%/Ex*JS
JY=JY+(Ey-(Y%+W%*Ratio))/Ex*JS
JS=JS*W%/Ex
!JXD=JX*2^29
!JYD=JY*2^29
!JFD=JS/Col*2^29
!JDD=JITER
IF (!JFD >> 20 ) <> 0 THEN !method=juliaL ELSE !method=juliaH
PROC_draw(mandle)
ENDIF
ENDPROC

DEF PROCmandle
choose_julia=TRUE
IF RE=TRUE THEN
PROCmandle_redraw
new_mandle=TRUE
RE=FALSE
ENDPROC
ENDIF
IF MAN=FALSE THEN
IF save THEN
*SCREENLOAD FRACTAL
ELSE
PROCmandle_redraw
ENDIF
new_mandle=FALSE
ENDPROC
ENDIF
first_mandle=FALSE
new_mandle=TRUE
*FX 5
W%=Ex/4
REPEAT
MOUSE X%,Y%,Z%
IF Z%=4 THEN W%+=4
IF Z%=1 THEN W%-=4
RECTANGLE X%,Y%,W%,W%*Ratio
WAIT:WAIT
RECTANGLE X%,Y%,W%,W%*Ratio

UNTIL Z%=2
VDU 26
INPUT  "Iterations ",ITER
IF ITER=0 THEN ITER=100
OX=OX+X%/Ex*SC
OY=OY+(Ey-(Y%+W%*Ratio))/Ex*SC
SC=SC*W%/Ex
!OXD=OX*2^29
!OYD=OY*2^29
!FD=SC/Col*2^29
!DD=ITER
IF ((!FD) >> 16) <> 0 THEN !method=iterationL ELSE !method=iterationH
PROC_draw(mandle)
ENDPROC

DEF PROCcycle_up
IF Nr_Cols=16 THEN
FOR N%=1 TO CS%:T%=15-CS%+N%:COLOUR N%,C1%(T%),C2%(T%),C3%(T%):NEXT
IF CS%<>15 THEN
FOR N%=CS%+1 TO 15:T%=N%-CS%:COLOUR N%,C1%(T%),C2%(T%),C3%(T%):NEXT
ENDIF
CS%=CS% MOD 15 +1
ELSE
!CTD=UPCTABLE
CALL cycle
ENDIF
ENDPROC

DEF PROCcycle_down
IF Nr_Cols=16 THEN
FOR N%=1 TO CS%:T%=15-CS%+N%:COLOUR N%,C1%(T%),C2%(T%),C3%(T%):NEXT
IF CS%<>15 THEN
FOR N%=CS%+1 TO 15:T%=N%-CS%:COLOUR N%,C1%(T%),C2%(T%),C3%(T%):NEXT
ENDIF
IF CS%=1 THEN CS%=15 ELSE CS%-=1
ELSE
!CTD=DOWNCTABLE
CALL cycle
ENDIF
ENDPROC

DEF PROCinit(M)
Mode=M
CASE Mode OF
WHEN  9:Col=320:Row=256:Ex=4*Col:Ey=4*Row:Nr_Cols=16
WHEN 20:Col=640:Row=512:Ex=2*Col:Ey=2*Row:Nr_Cols=16
WHEN 27:Col=640:Row=480:Ex=2*Col:Ey=2*Row:Nr_Cols=16
WHEN 31:Col=800:Row=600:Ex=2*Col:Ey=2*Row:Nr_Cols=16
WHEN 13:Col=320:Row=256:Shf=6:Ex=4*Col:Ey=4*Row:Nr_Cols=256
WHEN 21:Col=640:Row=512:Shf=7:Ex=2*Col:Ey=2*Row:Nr_Cols=256
WHEN 28:Col=640:Row=480:Shf=7:Ex=2*Col:Ey=2*Row:Nr_Cols=256
OTHERWISE PRINT"Sorry, mode not supported":Mode=-1:ENDPROC
ENDCASE
Ratio=Ey/Ex
IF NOT RE THEN
DIM CTABLE 256
DIM C1%(15),C2%(15),C3%(15)
DIM Q1% 2000
DIM Q2% 2000
DIM Qjul% 1400:Qjul%=16*(Qjul%DIV16)+16
DIM Qmand% 1400:Qmand%=16*(Qmand%DIV16)+16
PROCcoltable(CTABLE)
PROCinvtable
PROCASS0
ENDIF
MODE Mode
IF Nr_Cols=16 THEN
FOR N%=1 TO 15
F1%=24*N%:F2%=F1%+120:F3%=F1%+240
C1%(N%)=128*(SINRADF1%+1)
C2%(N%)=128*(SINRADF2%+1)
C3%(N%)=128*(SINRADF3%+1)
COLOUR N%,C1%(N%),C2%(N%),C3%(N%)
NEXT
ENDIF
CS%=15
OFF:GCOL 3,63
*POINTER
MOUSE ON
PROCmand
PROCjul
IF Nr_Cols=256 THEN
PROCASS1
ELSE
PROCASS2
ENDIF
IF NOT RE THEN
first_julia=TRUE
MAN=TRUE
VIDEO=TRUE
PROCinit_mandle(-2,-2,4)
PROChelp
ENDIF
RE=FALSE
ENDPROC

DEF PROCinit_mandle(X,Y,S)
new_mandle=TRUE
SC=S:OX=X:OY=Y*Ratio+SC/Col
ITER=100
!OXD=OX*2^29
!OYD=OY*2^29
!FD=SC/Col*2^29
!DD=ITER
!method=iterationL
PROC_draw(mandle_half)
first_mandle=TRUE
choose_julia=TRUE
ENDPROC

DEF PROCinit_julia
JX=-1.5:JY=-1.5*Ratio:JS=3
JITER=100
!JXD=JX*2^29
!JYD=JY*2^29
!JFD=JS/Col*2^29
!JDD=JITER
!method=juliaL
PROC_draw(julia_half)
first_julia=TRUE
ENDPROC

DEF PROC_draw(fractal)
REMON ERROR IF ERR=17 AND INKEY(-1) THEN END ELSE ENDPROC
CLG
TIME=0
IF NOT VIDEO CALL Video_off
CALL set
IF USR fractal THEN CALL filler
IF NOT VIDEO CALL Video_on
VDU 5:MOVE Ex*(1-84/Col),Ey*(1-4/Row)
GCOL 63:PRINT TIME/100:VDU 4
OFF:GCOL 3,63
*FX 5
ENDPROC

DEF PROCASS
DIM Q% 2000
DIM BUFF Row*Col/4
T=0:K=1:H=2:A=3:B=4:X=5:Y=6:W=7:D=8:SCR=9:S=10:CO=11:C=12:BUF=7
FOR PASS=0 TO 2 STEP 2
P%=Q%
[OPT PASS
FNSCREEN

.BUFFER EQUD BUFF
.read
LDR SCR,screen
LDR BUF,BUFFER
MOV CO,#Row*Col
MOV S,#255
MOV H,#2
.rloop
MOV K,#0
LDR T,[SCR],#4
TST T,S,LSL #8*3
MOVNE K,H,LSL #2*3
TST T,S,LSL #8*2
ORRNE K,K,H,LSL #2*2
TST T,S,LSL #8
ORRNE K,K,H,LSL #2
TST T,S
ORRNE K,K,H
STRB K,[BUF],#1
SUBS CO,CO,#4
BNE rloop
MOV PC,R14

.write
LDR SCR,screen
LDR BUF,BUFFER
MOV CO,#Row*Col
.wloop
LDR T,[BUF],#4
STR T,[SCR],#4
SUBS CO,CO,#16
BNE wloop
MOV PC,R14
]
NEXT
ENDPROC

DEF PROCASS0
LOCAL Q%,P%
DIM Q% 200
FOR PASS=0 TO 2 STEP 2
P%=Q%
[OPT PASS
.Video_on
MVN R0,#0
MOV R1,#1<<10
SWI "OS_UpdateMEMC"
MOV PC,R14

.Video_off
MOV R0,#0
MOV R1,#1<<10
SWI "OS_UpdateMEMC"
MOV PC,R14
]
NEXT
ENDPROC

DEF PROCASS1
Q%=Q1%
T=0:K=1:H=2:A=3:B=4:X=5:Y=6:W=7:D=8:SCR=9:S=10:CO=11:C=12:SP=13
FOR PASS=0 TO 2 STEP 2
P%=Q%
[OPT PASS
FNSCREEN

.CTD EQUD 0
.cycle
LDR SCR,screen
ADD K,SCR,#Row*Col
MOV H,#255
LDR W,CTD
MOV D,#1<<10
.cycleloop
  LDR T,[SCR]
  AND A,H,T
  CMP A,D
  LDRNEB B,[W,A]
  MOV C,B
  AND D,H,T,LSR #8
  CMP A,D
  LDRNEB B,[W,D]
  ADD C,C,B,LSL #8
  AND A,H,T,LSR #16
  CMP A,D
  LDRNEB B,[W,A]
  ADD C,C,B,LSL #16
  AND D,H,T,LSR #24
  CMP A,D
  LDRNEB B,[W,D]
  ADD C,C,B,LSL #24
  STR C,[SCR],#4
  CMP SCR,K
BLO cycleloop
MOV PC,R14

.filler
LDR SCR,screen
ADD K,SCR,#Row*Col
.vulloop
  LDR CO,[SCR]
  ANDS X,CO,#&000000FF
  MOVNE T,X
  CMP T,#255
  MOVEQ T,#0
  MOV C,T
  ANDS X,CO,#&0000FF00
  MOVNE T,X,LSR #8
  CMP T,#255
  ORRNE C,C,T,LSL #8
  ANDS X,CO,#&00FF0000
  MOVNE T,X,LSR #16
  CMP T,#255
  ORRNE C,C,T,LSL #16
  ANDS X,CO,#&FF000000
  MOVNE T,X,LSR #24
  CMP T,#255
  ORRNE C,C,T,LSL #24
  STR C,[SCR],#4
  CMP SCR,K
BLO vulloop
MOV PC,R14
]
NEXT
Q%=P%
FOR PASS=0 TO 2 STEP 2
P%=Q%
[OPT PASS
.stack EQUD 0
.method EQUD iterationL
.mandle
  FN_TRACK1(Nr_Cols,Row,Col,Shf)
  FN_TRACK2(Nr_Cols,Row,Col,Shf)
]
NEXT

Q%=P%
FOR PASS=0 TO 2 STEP 2
P%=Q%
[OPT PASS
.mandle_half
  FN_TRACK1(Nr_Cols,Row/2+12,Col,Shf)
  ADD S,B,B,LSL #2
  SUB S,A,S,LSL #Shf
  ADD S,S,#Row*Col
  SUB S,S,#2*Col
  STRB T,[S,SCR]
  FN_TRACK2(Nr_Cols,Row,Col,Shf)
]
NEXT
Q%=P%
FOR PASS=0 TO 2 STEP 2
P%=Q%
[OPT PASS
.julia_half
  FN_TRACK1(Nr_Cols,Row/2,Col,Shf)
  RSB S,S,#Row*Col
  SUB S,S,#1
  SUB S,S,#0
  STRB T,[S,SCR]
  FN_TRACK2(Nr_Cols,Row,Col,Shf)
]
NEXT
ENDPROC

DEF PROCASS2
Q%=Q2%
T=0:K=1:H=2:A=3:B=4:X=5:Y=6:W=7:D=8:SCR=9:S=10:CO=11:C=12:SP=13:G=14
FOR PASS=0 TO 2 STEP 2
P%=Q%
[OPT PASS
FNSCREEN

.filler
LDR SCR,screen
MOV S,#Row
MOV T,#Col
MUL T,S,T
ADD K,SCR,T,LSR #1
.vulloop
  LDR CO,[SCR]
  ANDS X,CO,#&0000000F
  MOVNE T,X
  CMP T,#15
  MOVEQ T,#0
  MOV C,T
  ANDS X,CO,#&000000F0
  MOVNE T,X,LSR #4
  CMP T,#15
  ORRNE C,C,T,LSL #4
  ANDS X,CO,#&00000F00
  MOVNE T,X,LSR #8
  CMP T,#15
  ORRNE C,C,T,LSL #8
  ANDS X,CO,#&0000F000
  MOVNE T,X,LSR #12
  CMP T,#15
  ORRNE C,C,T,LSL #12
  ANDS X,CO,#&000F0000
  MOVNE T,X,LSR #16
  CMP T,#15
  ORRNE C,C,T,LSL #16
  ANDS X,CO,#&00F00000
  MOVNE T,X,LSR #20
  CMP T,#15
  ORRNE C,C,T,LSL #20
  ANDS X,CO,#&0F000000
  MOVNE T,X,LSR #24
  CMP T,#15
  ORRNE C,C,T,LSL #24
  ANDS X,CO,#&F0000000
  MOVNE T,X,LSR #28
  CMP T,#15
  ORRNE C,C,T,LSL #28
  STR C,[SCR],#4
  CMP SCR,K
BLO vulloop
MOV PC,R14
]
NEXT
Q%=P%
FOR PASS=0 TO 2 STEP 2
P%=Q%
[OPT PASS
.stack EQUD 0
.method EQUD iterationL
.mandle
  FN_TRACK1(Nr_Cols,Row,Col,Shf)
  FN_TRACK2(Nr_Cols,Row,Col,Shf)
]
NEXT
Q%=P%
FOR PASS=0 TO 2 STEP 2
P%=Q%
[OPT PASS
.mandle_half
  FN_TRACK1(Nr_Cols,Row,Col,Shf)
  RSB B,B,#Row
  SUB B,B,#2
  MOV S,#Col
  MUL S,B,S
  ADD S,S,A
  ADD B,B,#2
  RSB B,B,#Row
  STRB G,[SCR,S,LSR #1]
  FN_TRACK2(Nr_Cols,Row,Col,Shf)
]
NEXT
Q%=P%
FOR PASS=0 TO 2 STEP 2
P%=Q%
[OPT PASS
.julia_half
  FN_TRACK1(Nr_Cols,Row/2,Col,Shf)
  RSB B,B,#Row
  MOV S,#Col
  MUL S,B,S
  SUB S,S,A
  SUB S,S,#1
  MOV G,G,LSL #4
  ADD G,G,G,LSR #8
  STRB G,[SCR,S,LSR #1]
  RSB B,B,#Row
  FN_TRACK2(Nr_Cols,Row,Col,Shf)
]
NEXT
ENDPROC

DEF FNSCREEN
[OPT PASS
.screen1 EQUD 148:EQUD -1
.screen  EQUD 0
.set
  ADR R0,screen1
  ADR R1,screen
  SWI "OS_ReadVduVariables"
MOV PC,R14
]:=""

DEF FN_TRACK1(Nr_Cols,Row,Col,Shf)
[OPT PASS
STMFD (SP)!,{14}
  LDR SCR,screen
  MOV A,#0
  MOV B,#0
  MOV R14,PC
  LDR PC,method
  STRB T,[SCR]
  MOV S,#0
  STR SP,stack
  STMFD (SP)!,{S}
  .while_1
    LDR T,stack
    CMP SP,T
      MVNEQ R0,#0
      BEQ endwhile_1
    .track
      LDMFD (SP)!,{S}
      MOV D,S,LSR #28
      BIC S,S,D,LSL #28
      MOV C,S,LSR #20
      BIC S,S,C,LSL #20
      MOV Y,S,LSR #10
      BIC X,S,Y,LSL #10
]
IF Nr_Cols=256 THEN
[OPT PASS
      ADD S,Y,Y,LSL #2
      ADD S,X,S,LSL #Shf
      LDRB K,[SCR,S]
]
ELSE
[OPT PASS
      MOV T,#Col
      MUL S,Y,T
      ADD S,X,S
      LDRB K,[SCR,S,LSR #1]
      TST S,#1
      BICEQ K,K,#&F0
      MOVNE K,K,LSR #4
]
ENDIF
[OPT PASS
      MOV H,S
      MOV W,#0
    .while_2
      ADD D,D,#5
      CMP K,#Nr_Cols-1
        BICEQ D,D,#1
      MOV CO,#8
      .loop
        SUBS CO,CO,#1
          BEQ endtrack
        ADD A,X,#1
        MOV B,Y
        ADD D,D,#1
        CMP K,#Nr_Cols-1
          ADDEQ D,D,#1
        AND D,D,#%111
        CMP D,#1
          ADDHS B,Y,#1
        CMP D,#2
          SUBHS A,A,#1
        CMP D,#3
          SUBHS A,A,#1
        CMP D,#4
          SUBHS B,B,#1
        CMP D,#5
          SUBHS B,B,#1
        CMP D,#6
          ADDHS A,A,#1
        CMP D,#7
          ADDHS A,A,#1
        CMP A,#Col
        CMPLO B,#Row
      MVNHS C,#0
      BHS loop
]
IF Nr_Cols=256 THEN
[OPT PASS
        ADD S,B,B,LSL #2
        ADD S,A,S,LSL #Shf
        CMP H,S:BEQ endtrack
        LDRB T,[SCR,S]
]
ELSE
[OPT PASS
        MOV T,#Col
        MUL S,B,T
        ADD S,S,A
        CMP H,S:BEQ endtrack
        LDRB G,[SCR,S,LSR #1]
        TST S,#1
        BICEQ T,G,#&F0
        MOVNE T,G,LSR #4
]
ENDIF
[OPT PASS
        CMP T,K
          ADDEQ W,W,#1
        CMP CO,#5
        CMPNE W,#8
          BHI endtrack
        CMP T,#0
        BNE endif_3
          MOV R14,PC
          LDR PC,method
]
IF Nr_Cols=256 THEN
[OPT PASS
        STRB T,[S,SCR]
]
ELSE
[OPT PASS
        LDRB G,[SCR,S,LSR #1]
        TST S,#1
        ADDEQ G,G,T
        ADDNE G,G,T,LSL #4
        STRB G,[SCR,S,LSR #1]
]
ENDIF
=""

DEF FN_TRACK2(Nr_Cols,Row,Col,Shf)
[OPT PASS
          CMP T,K
            MOVEQ W,#0
          BEQ endif_2
            CMP T,C
            BEQ endif_1
              ADD S,A,B,LSL #10
              ADD S,S,C,LSL #20
              ADD S,S,D,LSL #28
              STMFD (SP)!,{S}
              MOV C,T
            .endif_1
          .endif_2
        .endif_3
        CMP T,K
      BNE loop
      MOV X,A
      MOV Y,B
    BAL while_2
    .endtrack
  SWI "OS_ReadEscapeState"
  BCC while_1
  MOV R0,#&7C
  SWI "OS_Byte"
  MOV R0,#0
  .endwhile_1
  LDR SP,stack
LDMFD (SP)!,{PC}
]:=""

DEF PROCcoltable(CTABLE)
SWP=2
C=0:M=15
FOR K=0 TO M
PROCput(C+(K AND %1100)*5.25,K AND %11)
NEXT
FOR T=1 TO 3
C=T:M=4*(4-T)-1
PROCside(  4)
PROCside(- 1)
PROCside( 16)
PROCside(- 4)
PROCside(  1)
PROCside(-16)
NEXT
ENDPROC

DEF PROCside(RGB)
FOR I=1 TO T
C+=RGB
IF SWP=1 THEN
FOR K=0 TO M
PROCput(C+(K AND %1100)*5.25,K AND %11)
NEXT
ELSE
FOR K=M TO 0 STEP -1
PROCput(C+(K AND %1100)*5.25,K AND %11)
NEXT
ENDIF
SWP=SWP EOR 3
NEXT
ENDPROC

DEF PROCput(C,T)
B1=(C>>5) AND 1
B2=(C>>4) AND 1
G1=(C>>3) AND 1
G2=(C>>2) AND 1
R1=(C>>1) AND 1
R2=(C>>0) AND 1
COL=T+4*(R2+2*(B2+2*(R1+2*(G2+2*(G1+2*B1)))))
?CTABLE=COL
CTABLE+=1
ENDPROC

DEF PROCinvtable
DIM UPCTABLE 256
DIM DOWNCTABLE 256
FOR I=1 TO 254
C=CTABLE?(I)
UPCTABLE?C=CTABLE?(I+1)
NEXT
C=CTABLE?(255)
UPCTABLE?C=CTABLE?(1)
UPCTABLE?0=0
FOR I=2 TO 255
C=CTABLE?(I)
DOWNCTABLE?C=CTABLE?(I-1)
NEXT
C=CTABLE?(1)
DOWNCTABLE?C=CTABLE?(255)
DOWNCTABLE?0=0
ENDPROC

DEF PROCmand
Q%=Qmand%
A=3:B=4:H=5:P=6:S=7:U=8:V=9:D=10:M=11:N=12:T=0
FOR PASS=0 TO 2 STEP 2
P%=Q%
[OPT PASS
.DD  EQUD 0
.OXD EQUD 0
.OYD EQUD 0
.FD EQUD 0
.CT EQUD CTABLE
.iterationH
STMFD 13!,{1-12}
  LDR U,OXD
  LDR V,OYD
  LDR D,FD
  MLA A,D,A,U
  MLA B,D,B,V
  MOV U,A
  MOV V,B
  LDR D,DD
FNfractalH
]
NEXT PASS
Q%=P%
FOR PASS=0 TO 2 STEP 2
P%=Q%
[OPT PASS
.iterationL
STMFD 13!,{1-12}
  LDR U,OXD
  LDR V,OYD
  LDR D,FD
  MLA A,D,A,U
  MLA B,D,B,V
  MOV A,A,ASR #16
  MOV B,B,ASR #16
  MOV U,A
  MOV V,B
  LDR D,DD
FNfractalL
]
NEXT PASS
ENDPROC

DEF PROCjul
Q%=Qjul%
A=3:B=4:H=5:P=6:S=7:U=8:V=9:D=10:M=11:N=12:T=0
FOR PASS=0 TO 2 STEP 2
P%=Q%
[OPT PASS
.AD EQUD 0
.BD EQUD 0
.JDD EQUD 0
.JXD EQUD 0
.JYD EQUD 0
.JFD EQUD 0
.CT EQUD CTABLE
.juliaH
STMFD 13!,{1-12}
  LDR U,JXD
  LDR V,JYD
  LDR D,JFD
  MLA U,D,A,U
  MLA V,D,B,V
  LDR A,AD
  LDR B,BD
  LDR D,JDD
  FNfractalH
]
NEXT PASS
Q%=P%
FOR PASS=0 TO 2 STEP 2
P%=Q%
[OPT PASS
.juliaL
STMFD 13!,{1-12}
  LDR U,JXD
  LDR V,JYD
  LDR D,JFD
  MLA A,D,A,U
  MLA B,D,B,V
  MOV U,A,ASR #16
  MOV V,B,ASR #16
  LDR A,AD
  MOV A,A,ASR #16
  LDR B,BD
  MOV B,B,ASR #16
  LDR D,JDD
  FNfractalL
]
NEXT PASS
ENDPROC

DEF FNfractalL
[OPT PASS
  LDR P,CT
  .while_2
    MOVS H,U
      RSBMI H,H,#0
    MUL S,H,H
    MOVS H,V
      RSBMI H,H,#0
    MUL T,H,H
    ADD H,S,T
    CMP H,#4<< 26
      BHS break
    ADDS N,U,V
      RSBMI N,N,#0
    MUL M,N,N
    SUB H,M,H
    ADD V,B,H,ASR #13
    SUB U,S,T
    ADDS U,A,U,ASR #13
    MOVS H,U
      RSBMI H,H,#0
    MUL S,H,H
    MOVS H,V
      RSBMI H,H,#0
    MUL T,H,H
    ADD H,S,T
    CMP H,#4<< 26
      BHS break2
    ADDS N,U,V
      RSBMI N,N,#0
    MUL M,N,N
    SUB H,M,H
    ADD V,B,H,ASR #13
    SUB U,S,T
    ADD U,A,U,ASR #13
    SUBS D,D,#2
  BNE while_2
]
IF Nr_Cols=16 THEN
[OPT PASS
MOV T,#15
LDMFD 13!,{1-12}
MOV PC,R14
.break2
 SUBS D,D,#1
.break
ADD D,D,#8
  .while_3
    CMP D,#14
    SUBHI D,D,#14
  BHI while_3
  MOV T,D
  LDMFD 13!,{1-12}
  MOV PC,R14
]
ELSE
[OPT PASS
MOV T,#255
LDMFD 13!,{1-12}
MOV PC,R14
.break2
 SUBS D,D,#1
.break
  ADD D,D,#100
  .while_3
    CMP D,#254
    SUBHI D,D,#254
  BHI while_3
  CMP D,#15
  ADDHS D,D,#1
  LDRB T,[P,D]
  LDMFD 13!,{1-12}
  MOV PC,R14
]
ENDIF
=""

DEF FNfractalH
[OPT PASS
  LDR P,CT
  .while_2
    MOVS H,U
      RSBMI H,H,#0
    CMP H,#2<<29
      BHS break
    MOV M,H,LSR #16
    BIC N,H,M,LSL #16
    MUL H,M,N
    MUL T,M,M
    MOV M,T,LSL #3
    ADD S,M,H,LSR #12
    MOVS H,V
      RSBMI H,H,#0
    CMP H,#2<<29
      BHS break
    MOV M,H,LSR #16
    BIC N,H,M,LSL #16
    MUL H,M,N
    MUL T,M,M
    MOV M,T,LSL #3
    ADD T,M,H,LSR #12
    ADD H,S,T
    CMP H,#4<<29
      BHS break
    ADDS N,U,V
      RSBMI N,N,#0
    MOV M,N,LSR #16
    BIC N,N,M,LSL #16
    MUL U,M,M
    MOV U,U,LSL #3
    MUL V,M,N
    ADD M,U,V,LSR #12
    SUB H,M,H
    ADD V,B,H
    SUB U,S,T
    ADD U,U,A
    SUBS D,D,#1
  BNE while_2
]
IF Nr_Cols=16 THEN
[OPT PASS
MOV T,#15
LDMFD 13!,{1-12}
MOV PC,R14
.break
ADD D,D,#8
  .while_3
    CMP D,#14
    SUBHI D,D,#14
  BHI while_3
  MOV T,D
  LDMFD 13!,{1-12}
  MOV PC,R14
]
ELSE
[OPT PASS
MOV T,#255
LDMFD 13!,{1-12}
MOV PC,R14
.break
  ADD D,D,#100
  .while_3
    CMP D,#254
    SUBHI D,D,#254
  BHI while_3
  CMP D,#15
  ADDHS D,D,#1
  LDRB T,[P,D]
  LDMFD 13!,{1-12}
  MOV PC,R14
]
ENDIF
=""