anchor.diff:  
     ;; Init sound hardware
     (poke 0 #x4015)                     ; Silence all channels
  -  (poke #x40 #x4017)                  ; Disable IRQ !!
  +  (poke #x40 #x4017)                  ; Disable IRQ
   
     (as/until :negative (bita (mem +ppu-status+))) ; PPU warmup interval
     (as/until :negative (bita (mem +ppu-status+))) ; (two frames)
   
     (poke 0 vblank-flag)
  +  (lda (mem +ppu-status+))            ; Clear vblank flag before enabling NMI!
     (poke #b10001000 +ppu-cr1+)         ; Enable NMI
   
  +  ;; Reset background
  +  (jsr 'wait-for-vblank)
  +  ;; Fill first name table screen
  +  (lda (mem +ppu-status+))            ; Reset address latch
  +  (ppuaddr #x2000)
  +  (lda (imm 4))
  +  (ldy (imm 8))
  +  (as/until :zero
  +    (ldx (imm 0))
  +    (as/until :zero
  +      (sta (mem +vram-io+))
  +      (dex))
  +    (dey))
  +  ;; Fill second screen
  +  (ppuaddr #x2400)
  +  (lda (imm 5))
  +  (ldy (imm 8))
  +  (as/until :zero
  +    (ldx (imm 0))
  +    (as/until :zero
  +      (sta (mem +vram-io+))
  +      (dex))
  +    (dey))
  +
     ;; Palette init
  -  (jsr 'wait-for-vblank)
  -  (jsr 'wait-for-vblank)
     (jsr 'wait-for-vblank)
     (ppuaddr #x3F00)
     (let ((bg #x1B))
  
positive.code:   ;; Main loop - wait for vblank, reset PPU registers, do sprite DMA.
    (with-label :loop
      ;; FIXME: sprite chr table address behaving backward vs what I expect..
      (poke #b10000000 *shadow-cr1*)
      (poke #b00010100 *shadow-cr2*)
      (poke 0 *shadow-scroll-x*)
      (poke 0 *shadow-scroll-y*)
  
      (jsr 'reset-sprites)
      (poke 40 *sprite-x*)
      (poke 80 *sprite-y*)
      (jsr '(sage f 0))
  
      (poke 100 *sprite-x*)
      (jsr '(sage f 0))
  
      (poke 80 *sprite-x*)
      (jsr '(wiz f 0))
  
      (poke 120 *sprite-x*)
      (jsr '(wiz f 0))
  
      (jsr 'end-frame)
  
  
negative.code: (procedure vblank-handler
    (php)
    (inc vblank-flag)
    (inc *frame-counter*)
    (plp)
    (rti))
  
  