So, hier mal eine etwas schnellere Line-Zeichen-Routine.
Es gab mal irgendwo einen Source mit 8 Versionen, das hier ist die letzte davon.
Die Routine schafft locker 300 Linien pro Sekunde. (rand(160), rand(192),rand(160), rand(192)) ist leider etwas ungenau, dafür verdammt flott.
Die Parameterübergabe ist für meinen Compiler, ähnlich wie beim cc65. Per (heap_ptr),y realisiert. Wenn man sich die komplizierte, teure Parameterübergabe spart, ist diese Routine noch schneller. Der Code ist kompatibel zum Atasm Assembler. Der Code zeichnet 4 Pixel gleichzeitig, mehr hab ich bisher auch nicht verstanden.
Wirklich das schnellste, was ich bisher gesehen habe. Ich habe auch den Code von ERU, zum Vergleich, die schafft ca. 216 Linien pro Sekunde, nur um mal ein paar Zahlen zu nennen. Mit einfachem Bresenham komme ich in meinem Compiler nicht über 80 Linien pro Sekunde, was aber am expliziten PLOT(x,y) liegt.
Wer die Routine nutzen möchte, sollte die @MULT40_low und _high Tabelle noch setzen, hab ich hier nicht mit angegeben.
Code: Alles auswählen
  .LOCAL
; TODO
; Dieser LINE Algorithmus funktioniert nur
; in graphics 7 und 15 (40 Bytes breit)
; bis 160 x 192!!! Weil nur 8 Bit breit
; ist dafuer sehr schnell, leider ungenau => eher unbrauchbar
; BITMSK	= $6E
; SHFAMT	= $6F
;ROWCRS	= $54
;COLCRS	= $55
;OLDROW	= $5A
;OLDCOL	= $5B
;ROWAC	= $70
;ROWADC 	= $72
;CFLAG	= $74
;RFLAG	= $75
;DELTAROW= $76
;DELTACOL= $77
;ATACHR	= $02FB
;opcodes for self-modifying code
?_OC_BIT_0P_ = $24
?_OC_DEC_0P_ = $C6 ;11000110
?_OC_INC_0P_ = $E6 ;11100110 ;XOR 32 ;$20
?_OC_DEX_   = $CA  ;11001010
?_OC_INX_   = $E8  ;11101000 ;XOR 34 ;$22
?_OC_AND_AX_ = $3D
?_OC_EOR_AX_ = $5D
?_OC_ORA_AX_ = $1D
; @REG ist bei mir ab Adresse 220 (Floating-Point-Register) 
?L0  = @REG+0 ; $B0
?L1  = @REG+1 ; $B1
?L2  = @REG+2 ; $B2
?L3  = @REG+3 ; $B3
?L4  = @REG+4 ; $B4
?L5  = @REG+5 ; $B5
?L6  = @REG+6 ; $B6
?L7  = @REG+7 ; $B7
?m0 = @REG+8
?m1 = @REG+9
?m2 = @REG+10
?x0 = @REG+11
?x1 = @REG+12
?x2 = @REG+13
@SETLINECOLOR
@SETLINECOLOR_i
        LDY #1            ; color 0 - 3
        LDA (@HEAP_PTR),Y ; wert holen
        and #3
        TAX
	LDY ?MASTSET,X
	STY ?SET1IMASKT
	STY ?SET1IMASKW
	STY ?SET2IMASKT
	STY ?SET2IMASKW
	STY ?SET3IMASKT
	STY ?SET3IMASKW
	STY ?SET4IMASKT
	STY ?SET4IMASKW
	LDA ADRCOLMHI,X
	STA ?GET1CMASKHT
	STA ?GET1CMASKHW
	STA ?GET2CMASKHT
	STA ?GET2CMASKHW
	STA ?GET3CMASKHT
	STA ?GET3CMASKHW
	STA ?GET4CMASKHT
	STA ?GET4CMASKHW
	RTS
; DRAWLINE ;v6
;	LDA #1
;	STA OLDROW
;	LDA #153
;	STA OLDCOL
;	LDA #072
;	STA ROWCRS
;	LDA #1
;	STA COLCRS
@LINE
@LINE_IIII
@FASTLINE2BIT
@FASTLINE2BIT_IIII
  LDY #1            ; XSTART
  LDA (@HEAP_PTR),Y ; wert holen
  STA OLDCOL ; ?XSTART
  LDY #3            ; YSTART
  LDA (@HEAP_PTR),Y ; wert holen
  STA OLDROW ; ?YSTART
  LDY #5            ; XEND
  LDA (@HEAP_PTR),Y ; wert holen
  STA COLCRS ; ?XEND
  LDY #7            ; YEND
  LDA (@HEAP_PTR),Y ; wert holen
  STA ROWCRS ; ?YEND
  LDA OLDROW
	SEC
	SBC ROWCRS
	BCS ?OLDROWFIRST
	LDX OLDCOL ;3
	LDY COLCRS ;3
	STY OLDCOL ;3
	STX COLCRS ;3
	LDY OLDROW
	SBC #0
	EOR #255
	JMP ?STOREROWDELTA
?OLDROWFIRST
	LDY ROWCRS
?STOREROWDELTA
	STA ?aw_WIDE_DELTA_RI
	STA ?aw_TALL_DELTA_RI
	LSR A
	LSR A
	STA ?X1
	BNE ?NOVS2
	BCC ?NOVS2
	LDA #01
?NOVS2
	STA ?m2
	LDA @MULT40_LOW,Y
	STA ?L0
	LDA @MULT40_HIGH,Y
	STA ?L1
	TYA
	CLC
	ADC ?X1
	TAY
	LDA @MULT40_LOW,Y
	STA ?L2
	LDA @MULT40_HIGH,Y
	STA ?L3
	TYA
	CLC
	ADC ?m2
	TAY
	LDA @MULT40_LOW,Y
	STA ?L4
	LDA @MULT40_HIGH,Y
	STA ?L5
	TYA
	CLC
	ADC ?X1
	TAY
	LDA @MULT40_LOW,Y
	STA ?L6
	LDA @MULT40_HIGH,Y
	STA ?L7
	LDA OLDCOL
	SEC
	SBC COLCRS
	BCS ?aw_HOZ_POS
?aw_HOZ_NEG
	SBC #0
	EOR #255
	TAY
	LSR A
	LSR A
	STA ?m1
	STA ?x0
	STA ?X2
	BNE ?noHS1
	BCC ?noHS1
	LDA #1
?noHS1
	STA ?m2
	LDA COLCRS
	SEC
	SBC ?X2
	STA ?GET1CMASKLW
	STA ?GET1TABLW
	STA ?GET1CMASKLT
	STA ?GET1TABLT
	SBC ?m2
	STA ?GET2CMASKLW
	STA ?GET2TABLW
	STA ?GET2CMASKLT
	STA ?GET2TABLT
	SBC ?X2
	STA ?GET3CMASKLW
	STA ?GET3TABLW
	STA ?GET3CMASKLT
	STA ?GET3TABLT
	SBC ?X2
	STA ?GET4CMASKLW
	STA ?GET4TABLW
	STA ?GET4CMASKLT
	STA ?GET4TABLT
	LDX #?_OC_DEX_
	JMP ?compARE_SLOPE
?aw_HOZ_POS
	TAY
	LSR A
	LSR A
	STA ?X2
	BNE ?noHS2
	BCC ?noHS2
	LDA #01
?noHS2
	STA ?m2
	LDA COLCRS
	STA ?GET1CMASKLW
	STA ?GET1TABLW
	STA ?GET1CMASKLT
	STA ?GET1TABLT
	CLC
	ADC ?X2
	STA ?GET2CMASKLW
	STA ?GET2TABLW
	STA ?GET2CMASKLT
	STA ?GET2TABLT
	ADC ?m2
	STA ?GET3CMASKLW
	STA ?GET3TABLW
	STA ?GET3CMASKLT
	STA ?GET3TABLT
	ADC ?X2
	STA ?GET4CMASKLW
	STA ?GET4TABLW
	STA ?GET4CMASKLT
	STA ?GET4TABLT
	STA ?m0
	LDX #0
	STX ?x0
	LDX #?_OC_INX_
?compARE_SLOPE
	CPY ?aw_WIDE_DELTA_RI
	BCC ?aw_TALLSLOPE
	BEQ ?aw_TALLSLOPE
?aw_WIDESLOPE
	STY ?aw_WIDE_DELTA_CI
	TYA
	SEC
	SBC ?m2
	STA ?m1
  STX ?COLADC1
	LDA ?X2
	BEQ ?aw_WIDESLOPE0
	SEC
	LDX ?x0
?aw_WIDE_LOOP
?COLADC1
	INX			;2
?GET1TABLW = *+1
	LDY ?TAB4DIV,X		;6
	LDA (?L0),Y		;11
?SET1IMASKW = *
?GET1CMASKLW = *+1
?GET1CMASKHW = *+2
	ORA $FF00,X		;15
	STA (?L0),Y		;20
?GET2TABLW = *+1
	LDY ?TAB4DIV,X		;24
	LDA (?L2),Y		;29
?SET2IMASKW = *
?GET2CMASKLW = *+1
?GET2CMASKHW = *+2
	ORA $FF00,X		;33
	STA (?L2),Y		;38
?GET3TABLW = *+1
	LDY ?TAB4DIV,X		;42
	LDA (?L4),Y		;47
?SET3IMASKW = *
?GET3CMASKLW = *+1
?GET3CMASKHW = *+2
	ORA $FF00,X		;51
	STA (?L4),Y		;56
?GET4TABLW = *+1
	LDY ?TAB4DIV,X		;60
	LDA (?L6),Y		;65
?SET4IMASKW = *
?GET4CMASKLW = *+1
?GET4CMASKHW = *+2
	ORA $FF00,X		;69
	STA (?L6),Y		;74
	LDA ?m1			;77 -3
?aw_WIDE_DELTA_RI=*+1
	SBC #$FF		;79 -5
	STA ?m1			;82 -8
	BCS ?aw_WIDE_SKIP	;85
?aw_WIDE_DELTA_CI=*+1
	ADC #$FF
	STA ?m1
	LDA ?L0
	CLC
	ADC #40
	STA ?L0
	BCC ?no_WIDE_H1INC
	INC ?L1
	CLC
?no_WIDE_H1INC
	LDA ?L2
	ADC #40
	STA ?L2
	BCC ?no_WIDE_H2INC
	INC ?L3
	CLC
?no_WIDE_H2INC
	LDA ?L4
	ADC #40
	STA ?L4
	BCC ?no_WIDE_H3INC
	INC ?L5
	CLC
?no_WIDE_H3INC
	LDA ?L6
	ADC #40
	STA ?L6
	BCC ?no_WIDE_H4INC
	INC ?L7
?no_WIDE_H4INC
	SEC
?aw_WIDE_SKIP
?LAST_WIDE_X = *+1
	DEC ?X2			;88
	BNE ?aw_WIDE_LOOP 	;91
?aw_WIDESLOPE0
	RTS
;
?aw_TALLSLOPE
	STY ?aw_TALL_DELTA_CI
	LDA ?aw_TALL_DELTA_RI
	SEC
	SBC ?m2
	STA ?m1
	DEC ?X1
	BEQ ?aw_WIDESLOPE0
	BMI ?aw_WIDESLOPE0
  STX ?COLADC2
	LDX ?x0
?aw_TALL_LOOP
?GET1TABLT = *+1
	LDY ?TAB4DIV,X	 ;4
	LDA (?L0),Y	     ;9
?SET1IMASKT = *
?GET1CMASKLT = *+1
?GET1CMASKHT = *+2
	ORA $FF00,X 	   ;14
	STA (?L0),Y	     ;19
?GET2TABLT = *+1
	LDY ?TAB4DIV,X	 ;23
	LDA (?L2),Y	     ;28
?SET2IMASKT = *
?GET2CMASKLT = *+1
?GET2CMASKHT = *+2
	ORA $FF00,X 	   ;32
	STA (?L2),Y	     ;37
?GET3TABLT = *+1
	LDY ?TAB4DIV,X	 ;4
	LDA (?L4),Y	     ;9
?SET3IMASKT = *
?GET3CMASKLT = *+1
?GET3CMASKHT = *+2
	ORA $FF00,X 	   ;14
	STA (?L4),Y	     ;19
?GET4TABLT = *+1
	LDY ?TAB4DIV,X	 ;23
	LDA (?L6),Y	     ;28
?SET4IMASKT = *
?GET4CMASKLT = *+1
?GET4CMASKHT = *+2
	ORA $FF00,X 	   ;32
	STA (?L6),Y	     ;37
	LDA ?m1		       ;40
	SEC		           ;42
?aw_TALL_DELTA_CI=*+1
	SBC #$FF	;44
	BCS ?aw_TALL_SKIP ;47
?aw_TALL_DELTA_RI=*+1
	ADC #$FF	;
?COLADC2
	INX
?aw_TALL_SKIP
	STA ?m1		;50
	LDA ?L0		;53
	CLC		;55
	ADC #40		;57
	STA ?L0		;60
	BCC ?no_TALL_H1INC ;63
	INC ?L1
	CLC
?NO_TALL_H1INC
	LDA ?L2		;66
	ADC #40		;68
	STA ?L2		;71
	BCC ?no_TALLH2DEC ;74
	INC ?L3
?NO_TALLH2DEC
	LDA ?L4		;53
	CLC		;55
	ADC #40		;57
	STA ?L4		;60
	BCC ?no_TALL_H3INC ;63
	INC ?L5
	CLC
?NO_TALL_H3INC
	LDA ?L6		;66
	ADC #40		;68
	STA ?L6		;71
	BCC ?NO_TALLH4DEC ;74
	INC ?L7
?NO_TALLH4DEC
	DEC ?X1		;77
	BPL ?AW_TALL_LOOP ;80
?DREND
	RTS
  * = (* +$FF) & $FF00
ANDMASK
	.byte 63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252
	.byte 63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252
	.byte 63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252
	.byte 63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252
	.byte 63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252,63,207,243,252
ADRCOLMLO
	.byte <ANDMASK, <COLORMASK1, <COLORMASK2, <COLORMASK3
ADRCOLMHI
	.byte >ANDMASK, >COLORMASK1, >COLORMASK2, >COLORMASK3
?MASTSET
    	.byte ?_OC_AND_AX_, ?_OC_ORA_AX_, ?_OC_ORA_AX_, ?_OC_ORA_AX_
    	.byte ?_OC_AND_AX_, ?_OC_EOR_AX_, ?_OC_EOR_AX_, ?_OC_EOR_AX_
;M1DIMG
;	.byte 3,12,48,192
;M2DIMG
;	.byte 1,4,16,64
;EMPTYDATA
; 	.byte 0,0,0,0
;	ORG LINEDATAPAGE + 256
  * = (* +$FF) & $FF00
COLORMASK1
	.byte 64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1
	.byte 64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1
	.byte 64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1
	.byte 64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1
	.byte 64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1,64,16,4,1
;	ORG LINEDATAPAGE + 512
  * = (* +$FF) & $FF00
COLORMASK2
	.byte 128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2
	.byte 128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2
	.byte 128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2
	.byte 128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2
	.byte 128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2,128,32,8,2
;	ORG LINEDATAPAGE + 768
  * = (* +$FF) & $FF00
COLORMASK3
	.byte 192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3
	.byte 192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3
	.byte 192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3
	.byte 192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3
	.byte 192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3,192,48,12,3
;	ORG LINEDATAPAGE + 1024
  * = (* +$FF) & $FF00
?TAB4DIV
	.byte 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9
	.byte 10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19
	.byte 20,20,20,20,21,21,21,21,22,22,22,22,23,23,23,23,24,24,24,24,25,25,25,25,26,26,26,26,27,27,27,27,28,28,28,28,29,29,29,29
	.byte 30,30,30,30,31,31,31,31,32,32,32,32,33,33,33,33,34,34,34,34,35,35,35,35,36,36,36,36,37,37,37,37,38,38,38,38,39,39,39,39
	.align 256
; muessen initialisiert werden! Die zeigen auf den Graphics-Speicher, jeder Wert ist um 40 Bytes groesser
@MULT40_low
 .dc 256 0
 
@MULT40_high
 .dc 256 0