vha3 / Hunter-Adams-RP2040-Demos

Demo code for the Raspberry Pi Pico
193 stars 54 forks source link

How do I change the effective resolution to 320x240? #2

Closed cbmeeks closed 9 months ago

cbmeeks commented 11 months ago

This code is almost exactly what I need for a project I am working on. Thanks!

However, I don't want to drive 640x480. Instead, I would like an effective resolution of 320x240. Of course, the actual VGA timing can stay at 640x480, I just need to draw "fat pixels" (x2 on X/Y).

I have tried reducing the buffer by 1/4, changing the timing, etc. but nothing seems to work.

For example:

#define RGB_ACTIVE 159    // (horizontal active)/2 - 1

...

pull block                  ; Pull from FIFO to OSR (only once)
mov y, osr                  ; Copy value from OSR to y scratch register

.wrap_target
set pins, 0                 ; Zero RGB pins in blanking
mov x, y                    ; Initialize counter variable

wait 1 irq 1 [3]            ; Wait for vsync active mode (starts 5 cycles after execution)

colorout:
pull block              ; Pull color value
out pins, 3 [2]         ; Push out to pins (first pixel)
out pins, 3 [1]         ; Push out to pins (next pixel)
jmp x-- colorout        ; Stay here thru horizontal active mode

.wrap

Then, I try drawing a white rect and it only fills 1/4 of the screen. I would expect it to be full screen.

fillRect(0, 0, 319, 239, WHITE);

Drawing a single pixel is obviously still a 640x480 pixel.

What am I doing wrong?

Thanks!

vha3 commented 9 months ago

Sorry for the delay! In fact, my good friend Bruce recently made precisely this modification. Here's a link to his code: https://people.ece.cornell.edu/land/courses/ece4760/RP2040/C_SDK_vga256/index_vga_256.html

cbmeeks commented 9 months ago

Thank you for responding!

I was able to achieve it as well (using 64 colors which is what I wanted). I went a different route than Bruce did but I will certainly look at his example as well.

My version uses a framebuffer in the following horizontal resolutions:

640, 320, 160, 80, 40

and the following vertical resolutions:

240, 120, 60, 30

I know it sounds silly, but a 40x30 resolution with 64 colors really puts off that "Apple II" graphics vibe that I like. :-)

Any of the horizontal and vertical resolutions can be mixed for some really weird combinations.

https://github.com/cbmeeks/VgaPico

vha3 commented 9 months ago

Looks awesome!