' WOJTEK[AT]BITOLOGIA.ORG
'
' MANDELBROT SET AND INTEGER ARITHMETIC
'                    ^^^^^^^^^^^^^^^^^^
' IT IS JUST A PROOF OF CONCEPT FOR THE OTHER PROJECT: ST.ASM
'
' THOSE WHO DO NOT REMEMBER LATE 90s, SHOULD CHECK "FRACTINT"!
'
' 2020-08-07 - CODE BASED ON THE CLASSIC MANDELBROT PROCEDURE
'              DUE TO INT-ARITH., IT PRODUCES A SLIGHTLY DEFORMED PICTURE...


SCREEN 12     ' VGA 800x600x16
LET MI = 32   ' MAX. ITERATIONS
DEFINT L, X-Y ' TO SPEED UP (AND SIMPLIFY) WE GET ONLY INTEGERS
DEFLNG I, R   ' OR LONG-INTEGERS

' MANDELBROT SET FITS IN THE COMPLEX DISK, D := { z : |z| < 2 }
' HENCE, WE TAKE A DISCRETE LATTICE := [0, 400] x [0, 400]
FOR Y = 0 TO 400 STEP 1
FOR X = 0 TO 400 STEP 1
        REO = X - 200 ' ANYWAY, WE OBVIOUSLY NEED A TRANSLATION
        IMO = Y - 200 ' TO INCLUDE ORIGIN
        FOR L = 0 TO MI
                ' ITERATE: Z(n+1) = Z(n)**2 + C(X, Y)
                ' BUT INSTEAD OF REAL NUMBERS WE DEAL WITH INTEGERS
                ' ACTUALLY, WE USE PRECISION UP TO 2 DEC. PLACES
                ' E.G. 0.42 * 0.75 = 0.315 IS UNDERSTOOD AS
                ' 42 * 75 = 31 BECAUSE 31 = 3150 \ 10
                ' (RECALL, THAT '\' IS INTEGER DIVISION)
                ' WHICH IS GOOD ENOUGH TO GET A "PERFECT" APPROXIMATION :)

                RES = REO * REO \ 100
                IMS = IMO * IMO \ 100
                IF RES + IMS > 400 THEN PSET (X, Y), (L + 1) MOD 15: EXIT FOR
                ' THE PICTURE SHOWS UP REALLY FAST AS FOR QBASIC STANDARDS!
                REN = RES - IMS
                IMN = 2 * REO * IMO \ 100
                REO = REN + X - 200
                IMO = IMN + Y - 200

                REM CONFIRM THAT ALL NUMBERS ABOVE ARE INTEGERS << 65536
                REM PRINT REO; IMO; RES; IMS; REN; IMN;
        NEXT
NEXT: NEXT


