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