You can help CodeWalrus stay online by donating here. | New CodeWalrus | Old (dark mode) | Old (light) | Discord server
We have an anniversary Game Jam! Click here for more info.
0
b/General Help publicado por u/Midnightas December 24, 2018, 05:00:18 PM
I added double buffering into my program, as before you could see it rendering visually and flickering.
But now with double buffering, half of the screen flickers (not exactly half, I can't find a pattern, but it's mostly pixels at the bottom), and it now takes around half a second to render, before the buffers are swapped again.
I'm assuming this is because we wait for the interrupt, but it still seems to be very long.

call SJQ_setgraphics
loop:
; Simple buffer cleaning, sets everything to 0.
ld HL, (SJQ_curbuf)
ld (HL), 0
ld DE, (SJQ_curbuf)
inc DE
ld BC, 320 * 240 - 1
ldir

; do some more drawing here.

call SJQ_bufswap

SJQ_setgraphics:
; Sets the palette.
ld HL, SJQ_PALETTE
ld DE, $E30200
ld BC, SJQ_PALETTE_END - SJQ_PALETTE
ldir
; Enables 8bpp.
ld A, $27
ld ($E30018), A
; Sets up double buffering.
ld HL, vRam
ld (mpLcdBase), HL
ld hl, vRam + 320 * 240
ld (SJQ_curbuf), HL
ld HL, mpLcdImsc
ld (HL), 4
ret

SJQ_bufswap:
ld HL, (SJQ_curbuf)
ld DE, (mpLcdBase)
ld (SJQ_curbuf), DE
ld (mpLcdBase), HL
_:
ld HL, mpLcdIcr
set 2, (HL)
ld HL, mpLcdRis
_:
bit 2, (HL)
jr Z, -_
ret


SJQ_bufwap, the third third of SJQ_setgraphics are all that work on the double buffering, of course I found little docs on the internet (searching stuff like 'double buffering ti', or using exact matching, etc).
Last Edit: December 24, 2018, 05:06:39 PM by Midnightas
Inicia sesión o crea una cuenta para dejar un comentario
u/c4ooo December 28, 2018, 01:00:43 AM
Your code... all seems correct (checked it against the code I normally use).
Can you post your entire code; I could try to make it work.
u/c4ooo December 29, 2018, 10:08:37 PM
This bug was.. interesting to track down haha. Seems like spasm interprets the following line:  (line 51 in main.asm)
ld hl, vRam + 320 * 240
as
ld hl, (vRam + 320) * 240
instead of
ld hl, vRam + (320 * 240)
and changing it to either
ld hl, vRam + (320 * 240)
or
ld hl, vRam + 76800
fixed the problem for me ;)
Last Edit: December 29, 2018, 10:19:47 PM by c4ooo
u/Midnightas December 29, 2018, 10:30:10 PM
Wow, I blame the tools. Thank you so much for using your free time on this issue!
u/Midnightas December 30, 2018, 10:24:55 AM
Slight additional question, if I may, but if I wanted to add the ability to draw transparent sprites, I'm assuming I'll have to lose the ldir instruction?
One way I see going about this is to use ldi in a loop instead (which checks if it's equal to some "transparent" value).
u/c4ooo December 30, 2018, 04:40:11 PM
Quote from: Midnightas on December 30, 2018, 10:24:55 AM
Slight additional question, if I may, but if I wanted to add the ability to draw transparent sprites, I'm assuming I'll have to lose the ldir instruction?
One way I see going about this is to use ldi in a loop instead (which checks if it's equal to some "transparent" value).
Makes sense. You might want to take a look at https://github.com/CE-Programming/toolchain/blob/master/src/graphx/graphx.asm#L2177 and the other functions in that document.
Start a Discussion

b/General Help

Need programming or hardware help? Need software installing or running support, or just help with technology in general? Then this is the place to ask in.

77
Topics
Explore Board
Website statistics


MyCalcs | Ticalc.org | Cemetech | Omnimaga | TI-Basic Developer | MaxCoderz | TI-Story | Casiocalc.org | Casiopeia | The Museum of HP Calculators | HPCalc.org | CnCalc.org | Music 2000 Community | TI Education | Casio Education | HP Calcs | NumWorks | SwissMicros | Sharp Calculators
Powered by EzPortal