stuff
This commit is contained in:
commit
e6c05d0f66
3 changed files with 225 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
*.o
|
||||||
|
*.xex
|
||||||
|
.DS_Store
|
14
Makefile
Normal file
14
Makefile
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
.PHONY : clean all
|
||||||
|
|
||||||
|
all : mandel.xex
|
||||||
|
|
||||||
|
%.xex : %.o
|
||||||
|
ld65 -C atari-asm-xex.cfg -o $@ $<
|
||||||
|
|
||||||
|
%.o : %.s
|
||||||
|
ca65 -o $@ $<
|
||||||
|
|
||||||
|
clean :
|
||||||
|
rm -f *.o
|
||||||
|
rm -f *.xex
|
||||||
|
|
208
mandel.s
Normal file
208
mandel.s
Normal file
|
@ -0,0 +1,208 @@
|
||||||
|
; FP registers in zero page
|
||||||
|
FR0 = $d4
|
||||||
|
FRE = $da
|
||||||
|
FR1 = $e0
|
||||||
|
FR2 = $e6
|
||||||
|
FRX = $ec
|
||||||
|
EEXP = $ed
|
||||||
|
NSIGN = $ee
|
||||||
|
ESIGN = $ef
|
||||||
|
FLPTR = $fc
|
||||||
|
FPTR2 = $fe
|
||||||
|
|
||||||
|
; FP routines
|
||||||
|
AFP = $D800
|
||||||
|
FASC = $D8E6
|
||||||
|
IFP = $D9AA
|
||||||
|
FIP = $D9D2
|
||||||
|
ZFR0 = $DA44
|
||||||
|
ZFI = $DA46
|
||||||
|
FSUB = $DA60
|
||||||
|
FADD = $DA66
|
||||||
|
FMUL = $DADB
|
||||||
|
FDIV = $DB28
|
||||||
|
PLYVEL = $DD40
|
||||||
|
FLD0R = $DD49 ; from pointer in X/Y
|
||||||
|
FLD0P = $DD89 ; from pointer in FLPTR
|
||||||
|
FLD1R = $DD89
|
||||||
|
FLD1P = $DD9c
|
||||||
|
FST0R = $DDA7
|
||||||
|
FST0P = $DDAB
|
||||||
|
FMOVE = $DDB6 ; FR0 -> FR1
|
||||||
|
EXP = $DDC0
|
||||||
|
EXP10 = $DDCC
|
||||||
|
LOG = $decd
|
||||||
|
LOG10 = $ded1
|
||||||
|
|
||||||
|
|
||||||
|
.code
|
||||||
|
|
||||||
|
.export start
|
||||||
|
|
||||||
|
.proc start
|
||||||
|
loop:
|
||||||
|
jmp loop
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
.proc mandelfloat
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
.macro sext16to32 arg
|
||||||
|
.local plus
|
||||||
|
.local minus
|
||||||
|
lda arg+1
|
||||||
|
bpl plus
|
||||||
|
lda #$ff
|
||||||
|
jmp minus
|
||||||
|
plus:
|
||||||
|
lda #$00
|
||||||
|
minus:
|
||||||
|
sta arg+2
|
||||||
|
sta arg+3
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro copy bytes, arg1, arg2
|
||||||
|
.repeat 2, byte
|
||||||
|
lda arg1+byte
|
||||||
|
sta arg2+byte
|
||||||
|
.endrepeat
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro copy16 arg1, arg2
|
||||||
|
copy 2, arg1, arg2
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro copy32 arg1, arg2
|
||||||
|
copy 4, arg1, arg2
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro add bytes, arg1, arg2
|
||||||
|
clc
|
||||||
|
.repeat bytes, byte
|
||||||
|
lda arg1+byte
|
||||||
|
adc arg2+byte
|
||||||
|
sta arg1+byte
|
||||||
|
.endrepeat
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro add16 arg1, arg2
|
||||||
|
add 2, arg1, arg2
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro add32 arg1, arg2
|
||||||
|
add 4, arg1, arg2
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro shl bytes, arg
|
||||||
|
asl arg
|
||||||
|
.repeat bytes-1, byte
|
||||||
|
rol arg+byte+1
|
||||||
|
.endrepeat
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro shl16 arg
|
||||||
|
shl 2, arg
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro shl24 arg
|
||||||
|
shl 3, arg
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro shl32 arg
|
||||||
|
shl 4, arg
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro shr bytes, arg
|
||||||
|
lsr arg
|
||||||
|
.repeat bytes-1, byte
|
||||||
|
ror arg+byte+1
|
||||||
|
.endrepeat
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro shr16 arg
|
||||||
|
shr 2, arg
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro shr24 arg
|
||||||
|
shr 3, arg
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro shr32 arg
|
||||||
|
shr 4, arg
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro checkbit arg, bits
|
||||||
|
.if bits < 8
|
||||||
|
lda arg
|
||||||
|
and #(1 << bits)
|
||||||
|
.else
|
||||||
|
lda arg + 1
|
||||||
|
and #(1 << (bits - 8))
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro bitmul arg1, arg2, res, bits
|
||||||
|
.local next
|
||||||
|
checkbit arg2, bits
|
||||||
|
beq next
|
||||||
|
add32 res, arg1
|
||||||
|
next:
|
||||||
|
shl32 arg1
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.proc imul16
|
||||||
|
; 16-bit arg in FR0
|
||||||
|
; 16-bit arg in FR1
|
||||||
|
; 16-bit result in FR0
|
||||||
|
|
||||||
|
; sign-extend the argument
|
||||||
|
sext16to32 FR0
|
||||||
|
|
||||||
|
; zero out the 32-bit temp
|
||||||
|
lda #0
|
||||||
|
sta FRX
|
||||||
|
sta FRX+1
|
||||||
|
sta FRX+2
|
||||||
|
sta FRX+3
|
||||||
|
|
||||||
|
; shift and add :D
|
||||||
|
.repeat 16, bitnum
|
||||||
|
bitmul FR0, FR1, FRX, bitnum
|
||||||
|
.endrepeat
|
||||||
|
|
||||||
|
; Re-normalize the ones place
|
||||||
|
shr24 FRX
|
||||||
|
shr24 FRX
|
||||||
|
shr24 FRX
|
||||||
|
|
||||||
|
; @fixme round the last bit
|
||||||
|
|
||||||
|
; And copy out our result
|
||||||
|
copy16 FRX+2, FR0
|
||||||
|
; @fixme could save a few cycles by combining the last two ops
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
.proc iter
|
||||||
|
; (cx and cy should be pre-scaled to 6.26 fixed point)
|
||||||
|
|
||||||
|
; zx = 0
|
||||||
|
; zx_2 = 0
|
||||||
|
; zy = 0
|
||||||
|
; zx_2 = 0
|
||||||
|
|
||||||
|
loop:
|
||||||
|
; iters++
|
||||||
|
|
||||||
|
; zx_next = zx_2 + zy_2 + cx
|
||||||
|
; zy_next = 2 * zx * zy + cy
|
||||||
|
; (detect overflows to -4 or +4 and break if necessary)
|
||||||
|
; (re-downshift into zx and zy as 3.13 fixed point; round.)
|
||||||
|
|
||||||
|
; zx_2 = zx * zx
|
||||||
|
; zy_2 = zy * zy
|
||||||
|
; dist = zx_2 + zy_2
|
||||||
|
|
||||||
|
; if dist >= 4 break, else continue iterating
|
||||||
|
|
||||||
|
.endproc
|
Loading…
Reference in a new issue