This is an old revision of the document!
Table of Contents
SD-8516 PPU
This is a short reference to the XY-2000 PPU.
PPIXEL (plot_pixel)
| Method | Pixels per Second |
|---|---|
| BASIC PIXEL command | 2100 |
| INT 18h Pixel Plot (Assembly) | 26,000 |
| PPU via INT 0x18 | 74,000 |
| PPU via INT 0x03 (direct) | 220,000 |
| PPIXEL (PPU via opcode) | 460,000 |
These are practical numbers which show plot pixel being used to clear the screen in an x/y loop. 460,000 pixels/second is 7,600 pixels per frame at 60fps. That is almost exactly 30 16×16 sprites. Suggested use is to MEMCOPY a pre-drawn background into the frame-buffer and then draw sprites with PPIXEL (if you want to use PPIXEL for sprites). This way you don't have to draw the whole screen, and you don't have to draw the sprite background. It is hard to say how many sprites you will actually be able to draw in a frame because each sprite has more or less empty background space.
Code Replacement
PPIXEL can be called via INT 0x03:
LDA $0100 ; AH = 1 (PPU dispatch), AL = 00 (plot_pixel) INT $03 ; plot_pixel(X, Y, C)
It replaces the old plot pixel function in the graphics library (AH $01 INT $18):
; ============================================================================
; AH=01h - Plot MODE 3 Pixel (4bpp packed nibbles)
; ============================================================================
; Input: X = x coordinate (mode dependant)
; Y = y coordinate (mode dependant)
; C = color (0-15)
; Output: CF = 0 on success, 1 if out of bounds
; ============================================================================
int18_plot_pixel_4bpp:
PUSHA
; Bounds check using SCREEN_WIDTH / SCREEN_HEIGHT
LDA [@SCREEN_WIDTH]
CMP X, A
JC @plot4_error
LDA [@SCREEN_HEIGHT]
CMP Y, A
JC @plot4_error
PUSH X ; save x
PUSH C ; save color
LDA [@SCREEN_WIDTH]
SHR A ; A = stride (width / 2)
MOV B, A ; B = stride
MOV A, Y ; A = y
MUL A, B ; A = y * stride
POP C ; restore color
POP B ; restore x into B
PUSH B ; save x for nibble check
MOV T, B
SHR T
ADD A, T ; A = byte offset
MOV J, A
LDI #2
POP A ; A = x
LDTL $01
AND AL, TL
CMP AL, $00
JNZ @plot4_odd
plot4_even:
LDBL [I:J]
MOV AL, BL
UAB ; AL = odd pixel, BL = even pixel
MOV BL, CL ; BL = new color
PAB ; AL = (new color << 4) | odd pixel
MOV BL, AL
STBL [I:J]
POPA
CLC
RET
plot4_odd:
LDBL [I:J]
MOV AL, BL
UAB ; AL = odd pixel, BL = even pixel
MOV AL, CL ; AL = new color
PAB ; AL = (even pixel << 4) | new color
MOV BL, AL
STBL [I:J]
POPA
CLC
RET
plot4_error:
POPA
SEC
RET
