Ugh, found a typo in one of my macros (THQ) which held me up for a couple hours!
So for the first optimization, I used accumulators for XC, YC, XP, and YP:
Code:
;BRESENHAM CIRCLE COURTESY OF DARYL RICTOR @ HTTP://SBC.RICTOR.ORG/
; XP = O ACC XC = G ACC
; YP = Q ACC YC = H ACC
CIRCLE LDY #0 ;Y IS USED IN PLTPXL ROUTINE, SET TO ZERO
; INT X = 0
STY X1
LDA RA
BNE _C1
TGO ;XC = XP
THQ ;YC = YP
JMP PLTPXL
_C1
; INT Y = RADIUS
STA Y1
; INT F = 1 - RADIUS
SEC
LDA #1
STA FX ; int ddF_X = 1
SBC RA
STA FF
; INT ddF_Y = -2 * RADIUS
LDA RA
ASL
EOR #$FFFF
STA FY
INC FY ;could INC Acc after EOR #$FFFF
; TGI_SETPIXEL(XC, YC+Y)
TGO ;XC = XP
CLC
ADCHopQzp Y1 ;YC + Y1 => YP
JSR PLTPXL
; TGI_SETPIXEL(XC, YC-Y)
SEC
SBCHopQzp Y1 ;YC - Y1 => YP
JSR PLTPXL
; TGI_SETPIXEL(XC+Y, YC)
CLC
ADCGopOzp Y1 ;XC + Y1 => XP
THQ ;YC = YP
JSR PLTPXL
; TGI_SETPIXEL(XC-Y,YC)
SEC
SBCGopOzp Y1 ;XC + Y1 => XP
JSR PLTPXL
_CLOOP
; WHILE (X<Y) CALCULATE NEXT PLOT STEP
SEC
LDA X1
SBC Y1
BCC _C4 ;X<Y
RTS
_C4 LDA FF ; ** added back with change
BMI _C6 ; ** added back (branch if bit 15 set)
DEC Y1
CLC
LDA FY
ADC #$02
STA FY
CLC
ADC FF
STA FF
_C6 INC X1
CLC
LDA FX
ADC #$02
STA FX
CLC
ADC FF
STA FF
; TGI_SETPIXEL(XC+X, YC+Y)
CLC
ADCGopOzp X1 ;XC + X1 => XP
PHO ;XC + X1
CLC
ADCHopQzp Y1 ;YC + Y1 => YP
JSR PLTPXL
; TGI_SETPIXEL(XC-X, YC+Y)
SEC
SBCGopOzp X1 ;XC - X1 => XP
JSR PLTPXL
; TGI_SETPIXEL(XC-X, YC-Y)
SEC
SBCHopQzp Y1 ;YC - Y1 => YP
JSR PLTPXL
; TGI_SETPIXEL(XC+X, YC-Y)
PLO ;XC + X1
JSR PLTPXL
; TGI_SETPIXEL(XC+Y, YC+X)
CLC
ADCGopOzp Y1 ;XC + Y1 => XP
PHO ;XC + Y1
CLC
ADCHopQzp X1 ;YC + X1 => YP
JSR PLTPXL
; TGI_SETPIXEL(XC-Y,YC+X)
SEC
SBCGopOzp Y1 ;XC - Y1 => XP
JSR PLTPXL
; TGI_SETPIXEL(XC-Y, YC-X)
SEC
SBCHopQzp X1 ;YC - X1 => YP
JSR PLTPXL
; TGI_SETPIXEL(XC+Y,YC-X)
PLO ;XC + Y1
JSR PLTPXL
JMP _CLOOP
;*************************************************
; SAVE 2 CYCLES BY DOING LDY #$00 BEFORE CALLING PLTPXL
PLTPXL STOzp SCRLO ;-STO SCRLO
STQzp SCRHI ;-STQ SCRHI
STBiy SCRLO ;-STB(SCRLO),Y. B ACCUMULATOR IS ALWAYS PIXEL COLOR
RTS
So to plot a circle, all that is needed is something like:
Code:
LDWi $00EF ;-LDW #$00EF. MAX RADIUS = 239
LDGi $013F ;-LDG #319. G ACC IS XCENTER
LDHi $00EF ;-LDH #239. H ACC IS YCENTER
PLC STWzp RA ;-STW RA. RA IS RADIUS
JSR CIRCLE
edit: So over 4million cycles were saved in this situation. 4,044,455cycles to be exact.