CPCWiki forum

General Category => Programming => Topic started by: Cwiiis on 20:52, 15 August 21

Title: Drawing a gradient on the CPC+ with interrupts
Post by: Cwiiis on 20:52, 15 August 21
I'm experimenting with Plus features and wanted to draw a vertical gradient - to do this I'm using the RPI - so I can't start on line zero, which is fine... I'm seeing some weird behaviour though. Sometimes I get crashes on repeated runs and it seems adjusting the timing can make all sorts of unexpected things happen... But I don't understand why the timing of what I'm doing should make any difference to anything except what's displayed?

Anyway, that aside, as I understand it, drawing a line takes 64 nops. My main loop is like so;
MainLoop
          halt          ; Wait for interrupt

      SKIP 64-7-2

          MAP_PLUS(1)   ; [7]

          ld a,0        ; [2]

GradientIntLoop
          ld hl,&6400   ; [3] Write palette entry 0
          ld (hl),a     ; [2]
          inc hl        ; [2]
          ld (hl),0     ; [3]

      SKIP 63-3-2-2-3-1-2-2 ; 63... What am I missing?

          inc a         ; [1]
          cp 16         ; [2]
          jr nz,GradientIntLoop ; [2]

          MAP_PLUS(0)

          ; Check for user pressing ESC
          ld a,KeyLine8
          call ScanKeyboardLine
          bit Key_Esc,a
          jp nz,MainLoop


If I change the line that starts with '63-' to '64-' as I would've expected, the palette change introduces a diagonal seam, indicating that it's happening too late - have I gotten the timings wrong on the operations in GradientIntLoop?

I'm assuming some of my instability is due to me not restoring state correctly - I set the PRI to zero and restore the original word at &0038, is there something else/more I might be missing?
Title: Re: Drawing a gradient on the CPC+ with interrupts
Post by: m_dr_m on 23:21, 15 August 21
1/ The jr is [3] when looping. See https://64nops.wordpress.com/2021/01/13/perfectly-accurate-z80-flags-and-cpc-timing/ (https://64nops.wordpress.com/2021/01/13/perfectly-accurate-z80-flags-and-cpc-timing/)


2/ Don't use SKIP but FILL size,0 or size ** NOP.  Otherwise you will end up with previous spurious opcodes when re-assembling! (that would explain the weird crashes)
Or use a tempo macro like in http://memoryfull.net/post.php?id=44&page=1 (http://memoryfull.net/post.php?id=44&page=1)


Powered by SMFPacks Menu Editor Mod