Difference between revisions of "Programming:Fast plot"

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
 
(Fast plotting routine for MODE 1)
 
(11 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 dpendent to MODE 1 and doesn't perform range checks. It can draw 10500 pixels per second.
+
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 ;Adress for colormask
+
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 &X00000111 ;isolate Bit 0..2
+
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, &X10001000 ;Bitmask for MODE 1
+
LD C, %10001000 ;Bitmask for MODE 1
AND &X00000011 ;A = X MOD 4
+
AND %00000011 ;A = X MOD 4
 
JR Z, NSHIFT ;-> = 0, no shift
 
JR Z, NSHIFT ;-> = 0, no shift
LD B, A ;loop counter
 
 
SHIFT SRL C ;move bitmask to pixel
 
SHIFT SRL C ;move bitmask to pixel
DJNZ SHIFT ;-position
+
DEC A ;loop counter
 +
JR NZ,SHIFT ;-position
 
 
 
NSHIFT LD A, (CMASK) ;get color mask
 
NSHIFT LD A, (CMASK) ;get color mask
Line 42: Line 81:
 
RET ;done
 
RET ;done
 
</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>
 +
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
 +
</pre>
 +
 +
[[Category:Programming]]

Latest revision as of 13: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