Programming:Fast plot: Difference between revisions
From CPCWiki - THE Amstrad CPC encyclopedia!
More actions
Executioner (talk | contribs) No edit summary |
|||
| (8 intermediate revisions by 5 users not shown) | |||
| Line 1: | Line 1: | ||
== Fast plotting routine for MODE 0 == | |||
Converted from the Mode 1 routine by [[User:Executioner|The Executioner]] | |||
'''Input:''' DE = ''X (0..159)'', HL = ''Y (0..199)'' | |||
<pre> | |||
CMASK EQU &B338 ;Address for colormask | |||
;664/6128: &B6A3 | |||
FPLOT LD A, L ;A = Lowbyte Y | |||
AND %00000111 ;isolate Bit 0..2 | |||
LD H, A ;= y MOD 8 to H | |||
XOR L ;A = Bit 3..7 of Y | |||
LD L, A ;= (Y\8)*8 to L | |||
LD C, A ;store in C | |||
LD B, &60 ;B = &C0\2 = Highbyte Screenstart\2 | |||
ADD HL, HL ;HL * 2 | |||
ADD HL, HL ;HL * 4 | |||
ADD HL, BC ;+ BC = Startaddress | |||
ADD HL, HL ;of the raster line | |||
SRL E ;calculate X\2, because 2 pixel per byte, Carry is X MOD 2 | |||
LD C, %10101010 ;Bitmask for MODE 0 | |||
JR NC, NSHIFT ;-> = 0, no shift | |||
SHIFT LD C, %01010101 ;other bitmask for right pixel | |||
NSHIFT ADD HL, DE ;+ HL = Screenaddress | |||
LD A, (CMASK) ;get color mask | |||
XOR (HL) ;XOR screenbyte | |||
AND C ;AND bitmask | |||
XOR (HL) ;XOR screenbyte | |||
LD (HL), A ;new screenbyte | |||
RET ;done | |||
</pre> | |||
== Fast plotting routine for MODE 1 == | == Fast plotting routine for MODE 1 == | ||
This routine is approx. 6 times faster than the OS routine GRA PLOT, because it is | This routine is approx. 6 times faster than the OS routine GRA PLOT, because it is dependent to MODE 1 and doesn't perform range checks. It can draw 10500 pixels per second. | ||
'''Input:''' DE = ''X (0..319)'', HL = ''Y (0..199)'' | '''Input:''' DE = ''X (0..319)'', HL = ''Y (0..199)'' | ||
<pre> | <pre> | ||
CMASK EQU &B338 ; | CMASK EQU &B338 ;Address for colormask | ||
;664/6128: &B6A3 | ;664/6128: &B6A3 | ||
FPLOT LD A, L ;A = Lowbyte Y | FPLOT LD A, L ;A = Lowbyte Y | ||
AND | AND %00000111 ;isolate Bit 0..2 | ||
LD H, A ;= y MOD 8 to H | LD H, A ;= y MOD 8 to H | ||
XOR L ;A = Bit 3..7 of Y | XOR L ;A = Bit 3..7 of Y | ||
| Line 28: | Line 67: | ||
ADD HL, DE ;+ HL = Screenaddress | ADD HL, DE ;+ HL = Screenaddress | ||
LD C, | LD C, %10001000 ;Bitmask for MODE 1 | ||
AND | AND %00000011 ;A = X MOD 4 | ||
JR Z, NSHIFT ;-> = 0, no shift | JR Z, NSHIFT ;-> = 0, no shift | ||
SHIFT SRL C ;move bitmask to pixel | SHIFT SRL C ;move bitmask to pixel | ||
| Line 43: | Line 82: | ||
</pre> | </pre> | ||
== Fast plotting routine for MODE 2 == | |||
And the MODE 2 routine. Perhaps this could be improved since there are only two colours, and the pixel shift may need to operate up to 7 times (so perhaps a table would average out better). | |||
<pre> | <pre> | ||
CMASK EQU &B338 ; | CMASK EQU &B338 ;Address for colormask | ||
;664/6128 | ;664/6128 - &B6A3 | ||
FPLOT LD A, L ;A = Lowbyte Y | FPLOT LD A, L ;A = Lowbyte Y | ||
| Line 66: | Line 102: | ||
ADD HL, BC ;+ BC = Startaddress | ADD HL, BC ;+ BC = Startaddress | ||
ADD HL, HL ;of the raster line | ADD HL, HL ;of the raster line | ||
LD A, E ;Lowbyte X to A | |||
SRL D ;calculate X\8, because | |||
RR E ;8 pixel per byte | |||
SRL D | |||
RR E | |||
SRL E | |||
ADD HL,DE ;+ HL = Screenaddress | |||
LD C,%10000000 ;Bitmask for MODE 2 | |||
AND %00000111 ;A = X MOD 8 | |||
JR Z, NSHIFT ;-> = 0, no shift | |||
SRL | SHIFT SRL C ;move bitmask to pixel | ||
DEC A ;loop counter | |||
JR NZ,SHIFT ;-position | |||
NSHIFT LD A, (CMASK) ;get color mask | |||
XOR (HL) ;XOR screenbyte | XOR (HL) ;XOR screenbyte | ||
AND C ;AND bitmask | AND C ;AND bitmask | ||
| Line 83: | Line 127: | ||
</pre> | </pre> | ||
[[Category:Programming]] | |||
Latest revision as of 18:04, 17 March 2018
Fast plotting routine for MODE 0
Converted from the Mode 1 routine by The Executioner
Input: DE = X (0..159), HL = Y (0..199)
CMASK EQU &B338 ;Address for colormask
;664/6128: &B6A3
FPLOT LD A, L ;A = Lowbyte Y
AND %00000111 ;isolate Bit 0..2
LD H, A ;= y MOD 8 to H
XOR L ;A = Bit 3..7 of Y
LD L, A ;= (Y\8)*8 to L
LD C, A ;store in C
LD B, &60 ;B = &C0\2 = Highbyte Screenstart\2
ADD HL, HL ;HL * 2
ADD HL, HL ;HL * 4
ADD HL, BC ;+ BC = Startaddress
ADD HL, HL ;of the raster line
SRL E ;calculate X\2, because 2 pixel per byte, Carry is X MOD 2
LD C, %10101010 ;Bitmask for MODE 0
JR NC, NSHIFT ;-> = 0, no shift
SHIFT LD C, %01010101 ;other bitmask for right pixel
NSHIFT ADD HL, DE ;+ HL = Screenaddress
LD A, (CMASK) ;get color mask
XOR (HL) ;XOR screenbyte
AND C ;AND bitmask
XOR (HL) ;XOR screenbyte
LD (HL), A ;new screenbyte
RET ;done
Fast plotting routine for MODE 1
This routine is approx. 6 times faster than the OS routine GRA PLOT, because it is dependent to MODE 1 and doesn't perform range checks. It can draw 10500 pixels per second.
Input: DE = X (0..319), HL = Y (0..199)
CMASK EQU &B338 ;Address for colormask ;664/6128: &B6A3 FPLOT LD A, L ;A = Lowbyte Y AND %00000111 ;isolate Bit 0..2 LD H, A ;= y MOD 8 to H XOR L ;A = Bit 3..7 of Y LD L, A ;= (Y\8)*8 to L LD C, A ;store in C LD B, &60 ;B = &C0\2 = Highbyte Screenstart\2 ADD HL, HL ;HL * 2 ADD HL, HL ;HL * 4 ADD HL, BC ;+ BC = Startaddress ADD HL, HL ;of the raster line LD A, E ;Lowbyte X to A SRL D ;calculate X\4, because RR E ;4 pixel per byte SRL E ADD HL, DE ;+ HL = Screenaddress LD C, %10001000 ;Bitmask for MODE 1 AND %00000011 ;A = X MOD 4 JR Z, NSHIFT ;-> = 0, no shift SHIFT SRL C ;move bitmask to pixel DEC A ;loop counter JR NZ,SHIFT ;-position NSHIFT LD A, (CMASK) ;get color mask XOR (HL) ;XOR screenbyte AND C ;AND bitmask XOR (HL) ;XOR screenbyte LD (HL), A ;new screenbyte RET ;done
Fast plotting routine for MODE 2
And the MODE 2 routine. Perhaps this could be improved since there are only two colours, and the pixel shift may need to operate up to 7 times (so perhaps a table would average out better).
CMASK EQU &B338 ;Address for colormask
;664/6128 - &B6A3
FPLOT LD A, L ;A = Lowbyte Y
AND %00000111 ;isolate Bit 0..2
LD H, A ;= y MOD 8 to H
XOR L ;A = Bit 3..7 of Y
LD L, A ;= (Y\8)*8 to L
LD C, A ;store in C
LD B, &60 ;B = &C0\2 = Highbyte Screenstart\2
ADD HL, HL ;HL * 2
ADD HL, HL ;HL * 4
ADD HL, BC ;+ BC = Startaddress
ADD HL, HL ;of the raster line
LD A, E ;Lowbyte X to A
SRL D ;calculate X\8, because
RR E ;8 pixel per byte
SRL D
RR E
SRL E
ADD HL,DE ;+ HL = Screenaddress
LD C,%10000000 ;Bitmask for MODE 2
AND %00000111 ;A = X MOD 8
JR Z, NSHIFT ;-> = 0, no shift
SHIFT SRL C ;move bitmask to pixel
DEC A ;loop counter
JR NZ,SHIFT ;-position
NSHIFT LD A, (CMASK) ;get color mask
XOR (HL) ;XOR screenbyte
AND C ;AND bitmask
XOR (HL) ;XOR screenbyte
LD (HL), A ;new screenbyte
RET ;done