Notice. New forum software under development. It's going to miss a few functions and look a bit ugly for a while, but I'm working on it full time now as the old forum was too unstable. Couple days, all good. If you notice any issues, please contact me.
|
Forum Index : Microcontroller and PC projects : On the Road again
Page 1 of 4 | |||||
Author | Message | ||||
Martin H. Guru Joined: 04/06/2022 Location: GermanyPosts: 1113 |
PicoMiteVGA MMBasic Version 5.07.05RC6 CPUSPEED 378000 Proof of concept.. parts of the concept are inspired by olc https://youtu.be/KkMZI5Jbf18 Dim Col%(15),Xofs%(160) Restore colors:For f%=1 To 15:Read Col%(f%):Next f% SH%=240:SW%=320 dist%=0:Speed%=15 Option Break 4: On Key 3, on_break MODE 2 FRAMEBUFFER create FRAMEBUFFER WRITE F For f%=0 To 159:Xofs%(f%)=((160*Exp(f%/50))/20)-8:Next CLS COL%(1) HW%=SW%/2:HH%=SH%/2:t%=Timer '-------endless loop ----------------------- Do 'bend right For n%=1 To 1000 Step Speed% Box 0,hh%,SW%,hh%,,COL%(2),COL%(2) For F%=0 To HH% bc%=get_BorderCol%() ofs%=xofs%(hh%-f%)*n%/400 BB%=Int(f%/5) Box HW%-F%-bb%+ofs%,HH%+F%,bb%+bb%+f%+f%,1,,bc%,bc% Box HW%-F%+ofs%,HH%+F%,f%+f%,1,,0,0 Next FRAMEBUFFER COPY F,N,b Inc dist% Next 'bend back For n%=1000 To 1 Step -Speed% Box 0,hh%,SW%,hh%,,COL%(2),COL%(2) For F%=0 To HH% bc%=get_BorderCol%() ofs%=xofs%(hh%-f%)*n%/400 BB%=Int(f%/5) Box HW%-F%-bb%+ofs%,HH%+F%,bb%+bb%+f%+f%,1,,bc%,bc% Box HW%-F%+ofs%,HH%+F%,f%+f%,1,,0,0 Next FRAMEBUFFER COPY F,N,b Inc dist% Next 'bend left For n%=1 To 1000 Step Speed% Box 0,hh%,SW%,hh%,,COL%(2),COL%(2) For F%=0 To HH% bc%=get_BorderCol%() ofs%=xofs%(hh%-f%)*n%/400 BB%=Int(f%/5) Box HW%-F%-bb%-ofs%,HH%+F%,bb%+bb%+f%+f%,1,,bc%,bc% Box HW%-F%-ofs%,HH%+F%,f%+f%,1,,0,0 Next FRAMEBUFFER COPY F,N,b Inc dist% Next 'bend back For n%=1000 To 1 Step -Speed% Box 0,hh%,SW%,hh%,,COL%(2),COL%(2) For F%=0 To HH% bc%=get_BorderCol%() ofs%=xofs%(hh%-f%)*n%/400 BB%=Int(f%/5) Box HW%-F%-bb%-ofs%,HH%+F%,bb%+bb%+f%+f%,1,,bc%,bc% Box HW%-F%-ofs%,HH%+F%,f%+f%,1,,0,0 Next Inc dist% FRAMEBUFFER COPY F,N,b Next dist%=dist% And 1023 Loop '------------------------------ Function get_BorderCol%() get_BorderCol%=col%(7)':Exit Function ClipColor=Sin((((120-f%)/40)^3)+dist%) If ClipColor>0 Then get_BorderCol%=col%(4) End Function Sub on_break Sprite CLOSE all: FRAMEBUFFER CLOSE Do While Inkey$<>"":Loop CLS :MODE 1: Option Break 3 End End Sub colors: '--Colorscheme accordung to matherp Data RGB(BLUE),RGB(GREEN),RGB(CYAN),RGB(RED),RGB(MAGENTA),RGB(YELLOW),RGB(WHITE) Data RGB(MYRTLE),RGB(COBALT),RGB(MIDGREEN),RGB(CERULEAN),RGB(RUST),RGB(FUCHSIA) Data RGB(BROWN),RGB(LILAC) feel free to use and improve it, if someone likes to write a Racing game for the Pico if you want to drive straight ahead just do a loop with ofs%=0 Cheers Mart!n Edited 2022-10-10 20:00 by Martin H. 'no comment |
||||
Nimue Guru Joined: 06/08/2020 Location: United KingdomPosts: 367 |
Very "Chequered Flag" from my Speccy days. Entropy is not what it used to be |
||||
Amnesie Guru Joined: 30/06/2020 Location: GermanyPosts: 396 |
Wow! This is really cool! Thanks! |
||||
Martin H. Guru Joined: 04/06/2022 Location: GermanyPosts: 1113 |
Thank you As this is just a proof of concept, I tested if it could be done that way. In the next Step i try to optimise the code and add a track and a Car 'no comment |
||||
stanleyella Guru Joined: 25/06/2022 Location: United KingdomPosts: 2122 |
Looks interesting but I have not used vga picomite so not sure how it works. It can not be palette switching and do not understand frame buffer but is vgapicomite faster than non vga picomite using a spi lcd? |
||||
Martin H. Guru Joined: 04/06/2022 Location: GermanyPosts: 1113 |
Every single Frame is completly redrawn. With the use of the Framebuffer I can redraws the screen hidden and make it Vissible when it is ready. This makes the screen animation flicker-free. Here I paint the Lower half of the screen, green, then I draw Line by Line, the Border and the Street. by giving up the get_BorderCol% Function call and replacing with bc%=col%(7-3*((Sin((((150-f%)/40)^3)+dist%))>0)) this little demo gets up to 30 fps I dont know, how fast the spi lcd can be redrawn. Edited 2022-10-12 03:34 by Martin H. 'no comment |
||||
stanleyella Guru Joined: 25/06/2022 Location: United KingdomPosts: 2122 |
Not 30fps using ili9341 but lots of speed increase if blit load blit write used. |
||||
Mixtel90 Guru Joined: 05/10/2019 Location: United KingdomPosts: 6781 |
BLIT sends over the new data to replace the old. It does this over the SPI connection in a single bust as far as I know. Thus, although it isn't dependent on the speed of the CPU it is dependent on the speed of the SPI link. Only CPU1 is used. In VGA output CPU1 writes screen data to the framebuffer RAM and then just carries on with whatever it's doing. CPU2 reads the contents of the framebuffer and outputs it as RGB signals syncronised with the VSYNC and HSYNC signals being produced by PIO1. The display process takes up virtually nothing of CPU1's time - that mere;y writes to the framebuffer and forgets it. You lose the use of CPU2 (but MMBasic has no support for it anyway) and PIO1, but you still have PIO2 to play with. AFAIK the VGA output from the PicoMite VGA is 50Hz so I suppose that the maximum possible update speed is 50fps. CPU1 can write to the framebuffer faster than this, which is why there is a FRAMEBUFFER function, so that you can wait until the flyback period and update the screen during that. It will then give you flicker-free graphics. Exactly which sort of display is "faster" probably depends on how you define "faster" as LCDs can do some things in hardware, saving on SPI time. Parallel LCD displays are much faster than SPI but use up almost all of the I/O pins. . Edited 2022-10-12 17:06 by Mixtel90 Mick Zilog Inside! nascom.info for Nascom & Gemini Preliminary MMBasic docs & my PCB designs |
||||
Martin H. Guru Joined: 04/06/2022 Location: GermanyPosts: 1113 |
sadly, I dont have a ili9341 here to test it, but to use Blit, we would need a source to Blit from and I have no Idea, if it is possibl. to paint in the Blit source Nevertheless, I tryed a Version without using a framebuffer, which hopefully would also run with the ili9341... Dim Col%(15),Xofs%(160) Restore colors:For f%=1 To 15:Read Col%(f%):Next f% 'SH% and SW% Displayresolution SH%=240:SW%=320 dist%=0:Speed%=4 Option Break 4: On Key 3, on_break MODE 2 'Precalculate the Curve For f%=0 To 159:Xofs%(159-f%)=((160*Exp(f%/50))/20)-8:Next ' CLS COL%(1) HW%=SW%/2:HH%=SH%/2 '-------endless loop ----------------------- 'b1x% left x position of the left Border 'b2x% right x position of the left Border and left x position of the street 'b3x% right x position of the street and left x position of the right Border 'b4x% right x position of the right Border 'BB% Border broad 'bc% Border Color (red or white) calculated over Sinus Function 'HH% Half Screen y-Res HW% Half Screen x-Res 'xofs%() Pre calculated Curve over Exponetial function 'ofsx% how much has the Curve to be bended Do t%=Timer 'bend right For n%=1 To 1000 Step Speed% For F%=0 To HH% bc%=col%(7-3*((Sin((((120-f%)/40)^3)+dist%))>0)) ofs%=xofs%(f%)*n%/1000 y%=hh%+f% BB%=Int(f%/4) b1X%=HW%-F%-bb%+ofs%:b2x%=HW%-F%+ofs% b3x%=HW%-F%+ofs%+2*f%:b4x%=b1x%+(2*bb%+2*f%) Line 0,y%,b1x%,y%,,COL%(2):Line b1x%,y%,b2x%,y%,,bc% Line b2x%,y%,b3x%,y%,,0 Line b3x%,y%,b4x%,y%,,bc%:Line b4x%,y%,SW%,y%,,COL%(2) Next Inc dist% Next 'bend back For n%=1000 To 1 Step -Speed% For F%=0 To HH% bc%=col%(7-3*((Sin((((120-f%)/40)^3)+dist%))>0)) ofs%=xofs%(f%)*n%/1000 y%=hh%+f% BB%=Int(f%/4) b1X%=HW%-F%-bb%+ofs%:b2x%=HW%-F%+ofs% b3x%=HW%-F%+ofs%+2*f%:b4x%=b1x%+(2*bb%+2*f%) Line 0,y%,b1x%,y%,,COL%(2):Line b1x%,y%,b2x%,y%,,bc% Line b2x%,y%,b3x%,y%,,0 Line b3x%,y%,b4x%,y%,,bc%:Line b4x%,y%,SW%,y%,,COL%(2) Next Inc dist% Next 'bend left For n%=1 To 1000 Step Speed% For F%=0 To HH% bc%=col%(7-3*((Sin((((120-f%)/40)^3)+dist%))>0)) ofs%=xofs%(f%)*n%/1000 y%=hh%+f%:BB%=Int(f%/4) b1X%=HW%-F%-bb%-ofs%:b2x%=HW%-F%-ofs% b3x%=HW%-F%-ofs%+2*f%:b4x%=b1x%+(2*bb%+2*f%) Line 0,y%,b1x%,y%,,COL%(2):Line b1x%,y%,b2x%,y%,,bc% Line b2x%,y%,b3x%,y%,,0 Line b3x%,y%,b4x%,y%,,bc%:Line b4x%,y%,SW%,y%,,COL%(2) Next Inc dist% Next 'bend back For n%=1000 To 1 Step -Speed% For F%=0 To HH% bc%=col%(7-3*((Sin((((120-f%)/40)^3)+dist%))>0)) ofs%=xofs%(f%)*n%/1000 y%=hh%+f%:BB%=Int(f%/4) b1X%=HW%-F%-bb%-ofs%:b2x%=HW%-F%-ofs% b3x%=HW%-F%-ofs%+2*f%:b4x%=b1x%+(2*bb%+2*f%) Line 0,y%,b1x%,y%,,COL%(2):Line b1x%,y%,b2x%,y%,,bc% Line b2x%,y%,b3x%,y%,,0 Line b3x%,y%,b4x%,y%,,bc%:Line b4x%,y%,SW%,y%,,COL%(2) Next Inc dist% Next dist%=dist% And 255 t%=(Timer-t%) t%=t%/1000 Print @(0,0)1000/t% Loop '------------------------------ Sub on_break MODE 1: Option Break 3 End End Sub colors: '--Colorscheme accordung to matherp Data RGB(BLUE),RGB(GREEN),RGB(CYAN),RGB(RED),RGB(MAGENTA),RGB(YELLOW),RGB(WHITE) Data RGB(MYRTLE),RGB(COBALT),RGB(MIDGREEN),RGB(CERULEAN),RGB(RUST),RGB(FUCHSIA) Data RGB(BROWN),RGB(LILAC) with CPUSPEED 378000 i get a result of 22-23 fps. To speed things up, one can half the Resolution of the street (as originally using the Box Command with the height of 2 and just draw every 2nd Line) please try it and give me a Feedback Cheers Mart!n Edited 2022-10-12 17:10 by Martin H. 'no comment |
||||
stanleyella Guru Joined: 25/06/2022 Location: United KingdomPosts: 2122 |
@Martin.H Thanks for the code/advice. The lcd is 320x240 and it does not have a buffer ... as vga does. I have not used the sd card on the lcd display to load bitmaps yet. How do lines like bc%=col%(7-3*((Sin((((120-f%)/40)^3)+dist%))>0)) work in real time ??? Lot of repeated calc. in a screen. There are 32 .. not 8 blit buffers for the lcd but scrolling a part of the screen is slow. Maybe a spi thing and do not know if baud rate would make it faster. stan I will try to use your code, cheers |
||||
stanleyella Guru Joined: 25/06/2022 Location: United KingdomPosts: 2122 |
I tried the code but mode 2 is unknown and I have not read the vga mmb manual. |
||||
Martin H. Guru Joined: 04/06/2022 Location: GermanyPosts: 1113 |
Mode 2 switches VGA to 320x240 Mode with 16 colors. As your Display has this resolution fixed, just delete the Line Edited 2022-10-13 00:36 by Martin H. 'no comment |
||||
Martin H. Guru Joined: 04/06/2022 Location: GermanyPosts: 1113 |
The Spaces of the upper strips at the Border is less than the Lower ones, for this: Sin((((120-f%)/40)^3)+dist%) f% is the y position of the Line and Dist% is just a Framecounter to simulate driving. calculates a point in a Sinewave at which frequency increases starting with the Phase dist% I use this to deside to use Color 7 (White) or Color 4 (Red) for the Border bc%=col%(7-3*((Sin((((120-f%)/40)^3)+dist%))>0)) the color value is 7 but subtracts 3 if the Result of the Sine-Function is Positiv. Look at the Listing in the first Post. It is the Function get_BorderCol%() from the Listing above in a conpressed form. Cause every function call takes some time and it is called 120 times per Frame, so I put it in one basic Line. The Idea for this method is from javidx9 (one Lone Coder) who used the same calculation in his video. Code-It-Yourself! Retro Arcade Racing Game - Programming from Scratch (Quick and Simple C++) easy, eh Maybee I've been working with Excel for to long, where you're used to summarizing formulas Edited 2022-10-13 02:09 by Martin H. 'no comment |
||||
stanleyella Guru Joined: 25/06/2022 Location: United KingdomPosts: 2122 |
@Martin.H. thank you. I was thinking how it works on the eye and no flicker. I can not compare until I setup vga mmb. I like the NON vga mmb. It is not the same mmb but both have features you can use for graphic animation. Dim Col%(15),Xofs%(160) Restore colors:For f%=1 To 15:Read Col%(f%):Next f% Data RGB(BLUE),RGB(GREEN),RGB(CYAN),RGB(RED),RGB(MAGENTA),RGB(YELLOW),RGB(WHITE) Data RGB(MYRTLE),RGB(COBALT),RGB(MIDGREEN),RGB(CERULEAN),RGB(RUST),RGB(FUCHSIA) Data RGB(BROWN),RGB(LILAC) Did not work, code ran-no display. I will try CONST bk = RGB(BLack) const wh = rgb(white) const bl = rgb(blue) const gr = rgb(green) const cy = rgb(cyan) const re = rgb(red) const ma = rgb(magenta) const ye = rgb(yellow) const br = rgb(brown) |
||||
Martin H. Guru Joined: 04/06/2022 Location: GermanyPosts: 1113 |
I can't see the benefit of using constants instead of an array. Except that you can't call up the colors by a number and so the Program for the Calculation will get more complex 'no comment |
||||
stanleyella Guru Joined: 25/06/2022 Location: United KingdomPosts: 2122 |
Your code did not work with mmedit as I think mmbasic vga and non vga are incompatible. I use an emulator to redo the 80's software so vga no interest as I have 3500 zx spectrum games. I want to do my own clone games on touch lcd and no mechanical buttons. anyone done missile command? How to do line x,y , xend.yend a pixel at at a time. ie break down line to a pixel each loop. I am resorting to Bresenham's line algorithm. I think trig may be better. cheers stan Edited 2022-10-13 05:15 by stanleyella |
||||
Martin H. Guru Joined: 04/06/2022 Location: GermanyPosts: 1113 |
ähhhm .. no we both use the RGB() function in both examples using an Array or reading data are also no specific functions in the VGA Version of MM Basic/ Picomite.. but let it test ... Here from my standard PicoMite (NonVGA) using TeraTerm and serial connection PicoMite MMBasic Version 5.07.03 Saved 212 bytes > run > > for f%=0 to 15:print col%(f%);",";: next 0, 255, 65280, 65535, 16711680, 16711935, 16776960, 16777215, 16384, 16639, 32768, 33023, 16728064, 16728319, 16744448, 16744703, > list Dim Col%(15) Restore colors:For f%=1 To 15:Read Col%(f%):Next f% colors: Data RGB(BLUE),RGB(GREEN),RGB(CYAN),RGB(RED),RGB(MAGENTA),RGB(YELLOW),RGB(WHITE) Data RGB(MYRTLE),RGB(COBALT),RGB(MIDGREEN),RGB(CERULEAN),RGB(RUST),RGB(FUCHSIA) Data RGB(BROWN),RGB(LILAC) > > option list OPTION SYSTEM SPI GP18,GP19,GP16 OPTION COLOURCODE ON OPTION KEYBOARD GR OPTION CPUSPEED (KHz) 252000 OPTION DISPLAY 40, 120 OPTION SDCARD GP22 so, I dont know what goes wrong on your system 'no comment |
||||
stanleyella Guru Joined: 25/06/2022 Location: United KingdomPosts: 2122 |
Nice,tried on lcd. carp camera https://www.youtube.com/watch?v=fAhvyDnnfYc |
||||
TassyJim Guru Joined: 07/08/2011 Location: AustraliaPosts: 6097 |
Your version without framebuffer runs well on a LCD (ILI9341) at a framerate of 10.526 Looks smooth. Because the LCD version doesn't use MODE, you just have to rem out the MODE 2 and MODE 1 lines. Because of that, you don't need the on_break sub NO other changes needed. Jim For those who refuse to use the console/terminal change the PRINT (~ line 86) to text 1,1, str$(1000/t%,3,3) Edited 2022-10-13 07:22 by TassyJim VK7JH MMedit  MMBasic Help |
||||
Martin H. Guru Joined: 04/06/2022 Location: GermanyPosts: 1113 |
Hi Jim Right, I just forgot to take these commands out when adopting the code. Thanks That gives me the idea to write a "ASCII ART Version" for VT 100 Terminal. Somehow ZX81 like but with Colors Cheers Mart!n Edited 2022-10-13 15:41 by Martin H. 'no comment |
||||
Page 1 of 4 |
Print this page |