Changes

Programming:Fast plot

1,089 bytes added, 18:04, 17 March 2018
/* Fast plotting routine for MODE 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 ==
This routine is approx. 6 times faster than the OS routine GRA PLOT, because it is dpendent 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)''
<pre>
CMASK EQU &B338 ;Adress Address for colormask
;664/6128: &B6A3
FPLOT LD A, L ;A = Lowbyte Y
AND &X00000111 %00000111 ;isolate Bit 0..2
LD H, A ;= y MOD 8 to H
XOR L ;A = Bit 3..7 of Y
ADD HL, DE ;+ HL = Screenaddress
LD C, &X10001000 %10001000 ;Bitmask for MODE 1 AND &X00000011 %00000011 ;A = X MOD 4
JR Z, NSHIFT ;-> = 0, no shift
SHIFT SRL C ;move bitmask to pixel
</pre>
== Fast plotting routine for MODE 2 ==
== Fast plotting And the MODE 2 routine for MODE 0 == Converted from . Perhaps this could be improved since there are only two colours, and the above by [[User:Executioner|The Executioner]] '''Input:''' DE = ''X pixel shift may need to operate up to 7 times (0..159so perhaps a table would average out better)'', HL = ''Y (0..199)''
<pre>
CMASK EQU &B338 ;Adress Address for colormask ;664/6128: - &B6A3
FPLOT LD A, L ;A = Lowbyte Y
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 D C ;calculate X\2, becausemove bitmask to pixel RR E DEC A ;2 pixel per byteloop counter JR NZ, Carry is X MOD 2SHIFT ;-position
LD C, %10101010 ;Bitmask for MODE 1 JR NC, NSHIFT ;-> = 0, no shiftSHIFT 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
</pre>
NOTE[[Category: This MODE 1 code won't assemble with WinAPE/Maxam unless the &X is replaced by % to denote binary numbers.Programming]]
14
edits