home *** CD-ROM | disk | FTP | other *** search
-
- # vi:set ts=8 sw=8:
- # C A L C
- #
- # Update history, most recent first.
- #
- # Date Int Modification
- # --------- --- --------------------------------------------------------------
- # 15-Feb-88 JBM Pulled the whole loop out of gen, a integrated old iterate().
- # Added optimization for last iteration (not doing it).
- # 12-Feb-88 JBM Worked with James to hack the inner loop in assembler.
- # 11-Feb-88 JBM Added iteration limit parameter.
- # 05-Feb-88 JBM Split from gen.
- #
-
- file "calc.s" # tell sdb where our source is
- global Calc # tell linker what we are
-
- set FOUR,0x4010000000000000 # 4.0
- set MEG,0x412e848000000000 # 1 million
- set DIVERGE,MEG # SET THIS THE WAY YOU WANT IT
-
- set F%1,-128 # local variable space
- set FPO%1,28 # fmovm save area
- set FPM%1,0x003f # floating point register save mask
- set M%1,0x00fc # 68000 register save mask
-
- set buf,8 # unsigned short int *
- set cols,12+2 # int
- set rows,16+2 # int
- set Miter,20+2 # unsigned short int
- set Rmin,24 # double
- set Rinc,32 # double
- set Imin,40 # double
- set Iinc,48 # double
-
- # d0 - temp for count corr. a0 - Current pointer to output buffer
- # d1 - max iterations a1 - (unused)
- # d2 - iteration count a2 - (unused)
- # d3 - x position a3 - (unused)
- # d4 - y position a4 - (unused)
- # d5 - cols a5 - (unused)
- # d6 - (unused) fp - argument frame pointer
- # d7 - (unused) sp - stack pointer
-
- # fp0 -
- # fp1 -
- # fp2 - real coordinate
- # fp3 - imaginary coordinate
- # fp4 -
- # fp5 -
- # fp6 - Holds one million constant
- # fp7 -
-
- text
-
- Calc: tst.b F%1-256(%sp) # ? beats me
- link %fp,&F%1 # allocate local vars space
- movm.l &M%1,(4,%sp) # save caller's registers
- fmovm &FPM%1,(FPO%1,%sp) # save callers 881 registers
-
- mov.l &0,%d0 # we use these for word
- mov.l &0,%d1
- mov.l &0,%d2
- mov.l &0,%d3
- mov.l &0,%d4
- mov.l &0,%d5
- mov.l (buf,%fp),%a0 # address of output buffer
- mov.w (cols,%fp),%d5 # number of columns
- mov.w (rows,%fp),%d4 # number of rows
- sub.w &1,%d4 # loop from rows-1 down
- mov.w (Miter,%fp),%d1 # get low 16 bits of max_iter
- sub.w &2,%d1 # because fdbcc goes to -1, and off by 1
- fmov.d &DIVERGE,%fp6 # see config above
-
- L%%3: fmov.w %d4,%fp0 # get and convert y pixel offset
- fmov.d (Iinc,%fp),%fp3 # get imagnary amount per pixel
- fmul.x %fp0,%fp3 # multiply y to get offset
- fmov.d (Imin,%fp),%fp0 # get and extend imaginary base
- fadd.x %fp0,%fp3 # add to base to get coordinate
-
- mov.l &0,%d3 # start at beginning of row
- L%%2: fmov.w %d3,%fp0 # see above
- fmov.d (Rinc,%fp),%fp2
- fmul.x %fp0,%fp2
- fmov.d (Rmin,%fp),%fp0
- fadd.x %fp0,%fp2 # real coordinate
-
- fmovcr &0x0F,%fp4 # Zr
- fmovcr &0x0F,%fp5 # Zi
- fmovcr &0x0F,%fp0 # Zr2
- fmovcr &0x0F,%fp7 # Zi2
-
- mov.w %d1,%d2 # get max iterations (count down for fdbcc)
- # fmov.d %fp2,-(%sp); mov.l &prfl,-(%sp); jsr printf; add.w &12,%sp
- # fmov.d %fp3,-(%sp); mov.l &prfl,-(%sp); jsr printf; add.w &12,%sp
- # mov.l &prnl,(%sp); jsr printf
- L%%1:
- # fmov.d %fp4,-(%sp); mov.l &prfl,-(%sp); jsr printf; add.w &12,%sp
- # fmov.d %fp5,-(%sp); mov.l &prfl,-(%sp); jsr printf; add.w &12,%sp
- # mov.l &prnl,(%sp); jsr printf
- fsub.x %fp7,%fp0 # Zr2-Zi2
- fadd.x %fp2,%fp0 # +Cr
-
- fmov.x %fp4,%fp1 # get Zr
- fmul.x %fp5,%fp1 # Zi*Zr
- fadd.x %fp1,%fp1 # *2
- fadd.x %fp3,%fp1 # +Ci
-
- fmov.x %fp0,%fp4 # save next Zr
- fmov.x %fp1,%fp5 # save next Zi
- fmul.x %fp0,%fp0 # save next Zr2
-
- fmul.x %fp1,%fp1
- fmov.x %fp1,%fp7 # save next Zi2
-
- fadd.x %fp0,%fp1 # Zr2+Zi2 (distance squared)
- fcmp.x %fp1,%fp6 # infinity yet?
- fdbnlt %d2,L%%1 # ran away to infinity or we got bored
-
- mov.w %d1,%d0 # copy max
- sub.w %d2,%d0 # flip from leftover to actual count
- add.w &1,%d0 # we actually went one more iteration
- mov.w %d0,(%a0)+ # save count in buffer
-
- # fmov.w %d0,%fp1
- # fmov.d %fp1,-(%sp); mov.l &prfl,-(%sp); jsr printf; add.w &12,%sp
- # mov.l &prnl,(%sp); jsr printf
-
- # mov.l %d0,(%sp); mov.l &prin,-(%sp); jsr printf; add.w &4,%sp
- # mov.l %d1,(%sp); mov.l &prin,-(%sp); jsr printf; add.w &4,%sp
- # mov.l %d2,(%sp); mov.l &prin,-(%sp); jsr printf; add.w &4,%sp
- # mov.l %d3,(%sp); mov.l &prin,-(%sp); jsr printf; add.w &4,%sp
- # mov.l %d4,(%sp); mov.l &prin,-(%sp); jsr printf; add.w &4,%sp
- # mov.l %d5,(%sp); mov.l &prin,-(%sp); jsr printf; add.w &4,%sp
- # mov.l &prnl,(%sp); jsr printf
-
- add.w &1,%d3 # bump up the x counter
- cmp.w %d3,%d5
- blt L%%2 # x < cols, loop back
-
- sub.w &1,%d4 # one more row done
- tst.w %d4
- bge L%%3 # still >0, loop back
-
- movm.l (4,%sp),&0x00fc
- fmovm (FPO%1,%sp),&0x003f
- unlk %fp
- rts
-
- # fmov.d %fp2,-(%sp); mov.l &prfl,-(%sp); jsr printf; add.w &12,%sp
- # mov.l %d0,(%sp); mov.l &prin,-(%sp); jsr printf; add.w &4,%sp
- # mov.l &prnl,(%sp); jsr printf
-
- data 2
- align 2
- prfl:
- byte '%,'.,'1,'7,'l,'e,0x20,0x00
- align 2
- prin:
- byte '%,'d,0x20,0x00
- align 2
- prnl:
- byte '\n,0x00
- align 2
- prdt:
- byte '.,0x00
-