After last week's failure in sound this week(end) was a total win over sound 💪

I knew the game played better with some audible feedback and I also knew that the only way I could pull it off in NextBASIC was to use the interrupt handler at the machine code level. I'd previously tried and failed with im 2 but this time I looked at the native DRIVER support that NextOS offers a hook in to the im 1 interrupt.

The short version is, once I groked the border example I managed to port the AYFX player from Shiru to a driver.

The bulk of my code involved handling the driver calls and make sure to swap in the user bank during the routines and swap back to the original bank into the slot I was using.

I made some silly mistakes in the code, but managed to debug successfully using Cspect, things like ld a, (addr) must be read (and thought of) as "load a with addr" (and not "load a into addr"!).

My bank swapping code looks like this:

MMU6_C000_NR_56		equ $56

; ************************************************
; backup_bank
; Take the current bank in MMU 6 and store the value
; in (active_bank) for later restore.
; ************************************************
backup_bank:
  push      af        ; make a backup of A
  ld        bc, $243b ; select NEXT register
  in        a,(c)     ; save register state
  ld        (saved_reg), a
  ld        a, MMU6_C000_NR_56
  out       (c),a
  inc       b             ; $253b to access (read or write) value
  in        a,(c)
  ld        (active_bank),a
  dec       b         ; $243B
  ld        a,2
saved_reg equ $-1     ; this points saved_reg to the `2` above
  out       (c),a     ; just in case IRQ was in between registry work
  pop       af
  ret

; ************************************************
; activate_user_bank
; Switches in a user defined bank into MMU6
; ************************************************
activate_user_bank:
  call      backup_bank
  ld        a, (ayfx_bank)
  nextreg   MMU6_C000_NR_56, a
  ret

; ************************************************
; restore_bank
; Returns the bank slot to it's original setting
; ************************************************
restore_bank:
  ld        a, (active_bank)
  nextreg   MMU6_C000_NR_56, a
  ret

The result: uninterrupted game play with sound effects 🎉

Now the bug list is looking pretty small, the priority is a graphics glitch on level 4 (which can also be seen at the end of the game over on the letter "E"), then the scoring system (with high scores) and then… and then we're there.